02、Nepxion 教程 - Discovery 灰度发布初体验

上一篇博客 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 为准。