上一篇博客 Nepxion Discovery:Spring Cloud灰度发布神器 介绍了 Nepxion Discovery 框架在灰度发布里面可以帮我们做哪些事情,下面我们就通过一个简单的小例子来体验一下它的魅力。
1、环境搭建
1、 下载代码,Gitclonehttps://github.com/Nepxion/DiscoveryGuide.git,分支为simple;
2、 代码导入IDE,并切换到simple分支,编译好的项目结构如下所示:;
3、 下载Nacos服务器;
- 从https://github.com/alibaba/nacos/releases获取nacos-server-x.x.x.zip,并解压
1、 启动Nacos服务器;
- Windows环境下,运行bin目录下的startup.cmd
- Linux环境下,运行bin目录下的startup.sh
运行成功通过访问地址: http:localhost:8848/nacos ,用户名密码:nacos/nacos 可以登陆到 nacos 的服务器界面如下:
2、启动服务
在IDE中,启动四个应用服务和两个网关服务,如下
类名 | 微服务 | 服务端口 | 版本 | 区域 | 环境 | 可用区 |
---|---|---|---|---|---|---|
DiscoveryGuideServiceA1.java | A1 | 3001 | 1.0 | dev | env1 | zone1 |
DiscoveryGuideServiceA2.java | A2 | 3002 | 1.1 | qa | common | zone2 |
DiscoveryGuideServiceB1.java | B1 | 4001 | 1.0 | qa | env1 | zone1 |
DiscoveryGuideServiceB2.java | B2 | 4002 | 1.1 | dev | common | zone2 |
DiscoveryGuideGateway.java | Gateway | 5001 | 1.0 | 无 | 无 | 无 |
DiscoveryGuideZuul.java | Zuul | 5001 | 1.0 | 无 | 无 | 无 |
部署拓扑图
全链路路径, 如下
API网关 -> 服务A(两个实例) -> 服务B(两个实例)
3、环境验证
通过Postman工具验证
导入Postman的测试脚本postman.json(位于根目录下)
在Postman中执行目录结构下 ”Nepxion“ -> ”Discovery指南网关接口“ -> ”Gateway网关调用示例“,调用地址为http://localhost:5001/discovery-guide-service-a/invoke/gateway
,相关的Header值已经预设,供开发者修改。执行通过Spring Cloud Gateway网关发起的调用,结果为如下格式:
gateway
-> [ID=discovery-guide-service-a][P=Nacos][H=192.168.0.107:3001][V=1.0][R=dev][E=env1][Z=zone1][G=discovery-guide-group][TID=48682.7508.15870951148324081][SID=49570.77.15870951148480000]
-> [ID=discovery-guide-service-b][P=Nacos][H=192.168.0.107:4001][V=1.0][R=qa][E=env1][Z=zone2][G=discovery-guide-group][TID=48682.7508.15870951148324081][SID=49571.85.15870951189970000]
在Postman中执行目录结构下 ”Nepxion“ -> ”Discovery指南网关接口“ -> ”Zuul网关调用示例“,调用地址为http://localhost:5002/discovery-guide-service-a/invoke/zuul
,相关的Header值已经预设,供开发者修改。执行通过Zuul网关发起的调用,结果为如下格式:
zuul
-> [ID=discovery-guide-service-a][P=Nacos][H=192.168.0.107:3001][V=1.0][R=dev][E=env1][Z=zone1][G=discovery-guide-group][TID=48682.7508.15870951148324081][SID=49570.77.15870951148480000]
-> [ID=discovery-guide-service-b][P=Nacos][H=192.168.0.107:4001][V=1.0][R=qa][E=env1][Z=zone2][G=discovery-guide-group][TID=48682.7508.15870951148324081][SID=49571.85.15870951189970000]
上述步骤在下面每次更改规则策略的时候执行,并验证结果和规则策略的期望值是否相同
4、执行灰度路由
有如下两种简单方式,最终执行结果一致
4.1 基于Header传递方式的灰度路由策略
在Postman上,设置Header为如下值
n-d-version={“discovery-guide-service-a”:“1.0”, “discovery-guide-service-b”:“1.1”}
执行调用,根据返回值,验证discovery-guide-service-a是否选择1.0版本进行调用,discovery-guide-service-b是否选择1.1版本进行调用
4.2 基于网关配置的灰度路由策略
分别对Spring Cloud Gateway和Zuul增加灰度路由策略
①对于Spring Cloud Gateway,它的Group为discovery-guide-group,Data Id为discovery-guide-gateway
②对于Zuul,它的Group为discovery-guide-group,Data Id为discovery-guide-zuul
③灰度路由策略内容统一如下
<?xml version="1.0" encoding="UTF-8"?>
<rule>
<strategy>
<version>{"discovery-guide-service-a":"1.0", "discovery-guide-service-b":"1.1"}</version>
</strategy>
</rule>
执行调用,根据返回值,验证discovery-guide-service-a是否选择1.0版本进行调用,discovery-guide-service-b是否选择1.1版本进行调用
4.3 Header 与配置中心同时存在
我们以spring cloud gateway 这种方式举例,当 header 配置成:
n-d-version={“discovery-guide-service-a”:“1.0”, “discovery-guide-service-b”:“1.0”}
我们在配置中心配置为以下时:
当我们进行 Postman 访问时:
不管怎么调用访问的都是 discovery-guide-service-a 和 discovery-guide-service-b 的服务版本都是 1.0。都是以 header 为准。