spring-cloud-kubernetes与SpringCloud Gateway

本文是《spring-cloud-kubernetes实战系列》的第五篇,主要内容是在kubernetes上部署一个SpringCloud Gateway应用,该应用使用了spring-cloud-kubernetes框架,可以将请求转发到kubernetes环境中的其他服务上;

系列文章列表

《spring-cloud-kubernetes官方demo运行实战》

《你好spring-cloud-kubernetes》

《spring-cloud-kubernetes背后的三个关键知识点》

《spring-cloud-kubernetes的服务发现和轮询实战(含熔断)》

《spring-cloud-kubernetes与SpringCloud Gateway》

《spring-cloud-kubernetes与k8s的configmap》

本文大纲

接下来的内容由以下几部分组成:

什么是SpringCloud Gateway

SpringCloud Gateway实战参考

kubernetes上的SpringCloud Gateway

实战环境信息

实战源码下载

开发webdemo

开发k8sgatewaydemo

解决权限问题

最后一个疑问

什么是SpringCloud Gateway

SpringCloud Gateway是SpringCloud技术栈下的网关服务框架,在基于SpringCloud的微服务环境中,外部请求会到达SpringCloud Gateway应用,该应用对请求做转发、过滤、鉴权、熔断等前置操作,一个典型的请求响应流程如下所示:

在这里插入图片描述

SpringCloud Gateway实战参考

如果您之前没有使用过SpringCloud Gateway,推荐您阅读《速体验SpringCloud Gateway》,有时间的话动手实战效果更佳,只需编写少量代码就能快速熟悉这个SpringCloud技术栈中非常重要的功能;

kubernetes上的SpringCloud Gateway

注意以下两个知识点:

SpringCloud Gateway之所以能将外部请求路由到正确的后台服务上,是因为注册中心的存在,SpringCloud Gateway可以在注册中心取得所有服务的信息,因此它可以根据路径和服务的对应关系,将请求转发到对应的服务上;

如果您看过本系列的上一篇 《spring-cloud-kubernetes的服务发现和轮询实战(含熔断)》,您就知道spring-cloud-kubernetes框架可以获取kubernetes环境内的所有服务(这里说的服务就是kubernetes的service);

将以上两个知识点结合起来,于是可以推测:运行在kubernetes环境的SpringCloud Gateway应用,如果使用了spring-cloud-kubernetes框架就能得到kubernetes的service列表,因此可以承担网关的角色,将外部请求转发至kubernetes内的service上,最终到达对应的Pod;

架构如下图所示,请注意黄色背景的对话框,里面标识了关键操作:

在这里插入图片描述


至此,理论分析已经完成,我们来实战验证这个理论,接下来我们开发两个java应用:

先开发一个普通的web服务,名为webdemo,提供一个http接口;

再开发一个SpringCloud Gateway应用,名为k8sgatewaydemo;

环境信息

本次实战的环境和版本信息如下:

操作系统:CentOS Linux release 7.6.1810

minikube:1.1.1

Java:1.8.0_191

Maven:3.6.0

fabric8-maven-plugin插件:3.5.37

spring-cloud-kubernetes:1.0.1.RELEASE

spring cloud:Greenwich.SR2

springboot:2.1.6.RELEASE

源码下载

如果您不打算写代码,也可以从GitHub上下载本次实战的源码,地址和链接信息如下表所示:

名称 链接 备注
项目主页   https://github.com/zq2599/blog_demos   该项目在GitHub上的主页  
git仓库地址(https)   https://github.com/zq2599/blog_demos.git   该项目源码的仓库地址,https协议  
git仓库地址(ssh)   git@github.com:zq2599/blog_demos.git   该项目源码的仓库地址,ssh协议  

这个git项目中有多个文件夹,本章的两个应用分别在webdemo和k8sgatewaydemo文件夹下;
下图红框中是webdemo应用的源码:

在这里插入图片描述


下图红框中是k8sgatewaydemo应用的源码:

在这里插入图片描述


下面是详细的编码过程;

开发webdemo

webdemo是个极其普通的spring boot应用,和SpringCloud没有任何关系;

webdemo提供一个http接口,将请求header中名为extendtag的参数返回给请求方,controller类如下:

@RestController @RequestMapping("/hello") public class HelloController { @RequestMapping(value = "time", method = RequestMethod.GET) public String hello(HttpServletRequest request){ return "hello, " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + ", extendtag [" + request.getHeader("extendtag") + "]"; } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdyfp.html