spring-cloud-kubernetes 与 SpringCloud Gateway
欢迎访问我的 GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本文是《spring-cloud-kubernetes 实战系列》的第五篇,主要内容是在 kubernetes 上部署一个 SpringCloud Gateway 应用,该应用使用了 spring-cloud-kubernetes 框架,可以将请求转发到 kubernetes 环境中的其他服务上;
系列文章列表
本文大纲
接下来的内容由以下几部分组成:
什么是 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 上下载本次实战的源码,地址和链接信息如下表所示:
这个 git 项目中有多个文件夹,本章的两个应用分别在 webdemo 和 k8sgatewaydemo 文件夹下;
下图红框中是 webdemo 应用的源码:
下图红框中是 k8sgatewaydemo 应用的源码:
下面是详细的编码过程;
开发 webdemo
webdemo 是个极其普通的 spring boot 应用, 和 SpringCloud 没有任何关系 ;
webdemo 提供一个 http 接口,将请求 header 中名为 extendtag 的参数返回给请求方,controller 类如下:
启动类 WebdemoApplication.java:
要注意的是 pom.xml,里面通过名为 fabric8-maven-plugin 的 maven 插件,将 webdemo 快速部署到 minikube 环境:
以上就是 webdemo 应用的内容了,接下来要编译、构建、部署到 minikube 环境,在 pom.xml 执行以下命令即可:
部署完成后终端输出类似如下成功信息:
查看 service 和 pod,确认一切正常:
使用 minikube 命令取得 webdemo 服务对外暴露的地址:
可见外部通过地址:http://192.168.121.133:30160 即可访问到 webdemo 应用;
在浏览器输入地址:http://192.168.121.133:30160/hello/time ,即可验证 webdemo 的 http 接口是否正常,如下图,由于 header 中没有 extendtag 属性,因此返回的 extendtag 为 null:
至此,webdemo 在 minikue 上已经正常运行,该开发 gateway 应用了;
开发 k8sgatewaydemo
基于 maven 创建一个名为 k8sgatewaydemo 的 springboot 应用,pom.xml 内容如下:
上述 pom 文件中有以下几点需要注意:
第一、 依赖 spring-cloud-kubernetes-core 和 spring-cloud-kubernetes-discovery,这样能用到 spring-cloud-kubernetes 提供的服务发现能力;
第二、依赖 spring-cloud-starter-gateway,这样能用上 SpringCloud 的 gateway 能力;
第三、不要依赖 spring-boot-starter-web,会和 spring-cloud-starter-gateway 冲突,启动时抛出以下异常:
开发 SpringCloud Gateway 的启动类 K8sgatewaydemoApplication.java,里面也包含了网关路由配置的实例化,除了配置路径和转发服务的关系,还在请求的 header 中添加了 extendtag 属性,请注意注释的内容:
从上述代码可见,K8sgatewaydemoApplication 与普通环境下的 SpringCloud Gateway 并无差别,都是通过 EnableDiscoveryClient 注解获取服务列表,配置 RouteLocator 实现路由逻辑;
配置文件 application.yml 的内容:
以上就是 k8sgatewaydemo 应用的内容了,接下来要编译、构建、部署到 minikube 环境,在 pom.xml 执行以下命令即可:
部署完成后终端输出类似如下成功信息:
查看 service 和 pod,确认一切正常:
使用 minikube 命令取得 webdemo 服务对外暴露的地址:
可见外部通过地址:http://192.168.121.133:31352 即可访问到 k8sgatewaydemo 应用;
在浏览器输入地址:http://192.168.121.133:31352/customize/hello/time ,即可验证 k8sgatewaydemo 作为网关应用,能否将路径中带有 customize 的请求转发到 webdemo 应用,并且在请求 header 中添加名为 entendtag 的属性,如下图,浏览器展示的内容是 webdemo 的 http 接口返回的,并且 extendtag 的内容也不为空了,而是 k8sgatewaydemo 在转发前写入的:
上述结果表明已可以证明我们之前的推测是正确的:SpringCloud Gateway 应用在使用了 spring-cloud-kubernetes 提供的注册发现能力后,可以将请求转发到 kubernetes 环境中的服务上;也就是说,借助 spring-cloud-kubernetes 框架,你在 SpringCloud 环境开发的 SpringCloud Gateway 应用,可以以很小的代价迁移到 kubernetes 环境,与 kubernetes 环境中的 service 可以很好的交互,而原有的 eureka 注册中心也可以不用了;
解决权限问题
如果您的 spring-cloud-kubernetes 在向 webdemo 转发请求时抛出以下错误,那是因为遇到了 kubernetes 的权限问题:
处理方法是创建 ServiceAccount 对象,步骤如下:
创建名为 fabric8-rbac.yaml 的文件,内容如下:
执行以下命令即可创建 ServiceAccount 对象:
再在浏览器上继续刚才的验证,可以操作成功;
最后一个疑问
再回顾一下 k8sgatewaydemo 的开发过程,您会发现除了依赖 spring-cloud-kubernetes 对应的 maven 库,我们并没有显式调用 spring-cloud-kubernetes 相关的 API 或者做相关配置,就获取了所在 kubernetes 环境的原生服务,这是怎么回事呢?为何成本如此的低?答案就在《spring-cloud-kubernetes背后的三个关键知识点》一文中,推荐您回顾一下此文。
至此,spring-cloud-kubernetes 框架下的 SpringCloud Gateway 开发实战就完成了,希望本文能帮助您更好的理解和使用 spring-cloud-kubernetes,更加高效的将应用向容器化迁移。
欢迎关注 InfoQ:程序员欣宸
版权声明: 本文为 InfoQ 作者【程序员欣宸】的原创文章。
原文链接:【http://xie.infoq.cn/article/e6169714bb8428a40a41a34a5】。文章转载请联系作者。
评论