开发者学堂课程【微服务治理技术进阶:【直播】基于微服务 MSE 最佳实践】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1033/detail/15321
【直播】基于微服务 MSE 最佳实践
准备工作:
1、开通 MSE 服务治理
2、安装 Ingress-nginx 组建
3、部署 Demo 应用
此处已经部署好 demo 应用,可以进行查看,如图,输入 spring-cloud
可以看到有 abc 和 a-grey、b-grey、c-grey。再来查看 MSE 控制台,在应用列表中输入 spring-cloud,进入 spring-cloud-a,可以看到有 grey 环境和 base 环境
下面将演示如何使用全链路灰度环境的功能,点击创建泳道组。泳道组是我们涉及到流控的应用都可以加入,例如输入泳道组名称 demo,选择应用 spring-cloud-a、spring-cloud-b、spring-cloud-c,创建完成后可以看到此处都有相关的监控调用
可以看到一直在调用,因为已经配置好了 ingress 路由并且可以看到流量不论是打到 a 还是 a 的 gray,因为我们要开启泳道,所以后期会自动走到一个 base 环境中。
那么我们该如何将流量按照泳道的方式进行分流呢?只需要创建一个分流的泳道,泳道名称为 gray 环境泳道,可以选择标签,因为已经在控制台上打出了 gray 标,如果没有打标先进行打标然后在控制台上可以进行查看。选择标签会自动出现三个应用 spring-cloud-a、spring-cloud-b、spring-cloud-c,三个应用都打上了 gray 的标。创建完泳道后可以看到对于 bc,所有流量都打到未打标的。
此时不断地刷请求,可以看到当配完泳道后,打完 agray 的流量其实都会打到bgray、cgray,并且打到 base 的流量都到了 b 的 base 和 c 的 base。可以看到在没有配置泳道前,agray 最后都是打到一个线上的 base 环境。
可以理解配置泳道的作用是将 gray 环境的应用都串成一个泳道,往后会自动找gray 环境的一个标。到目前为止,流程已经完成。只需要创建一个泳道规则即可。
如图脚本可以看到流量明显成打到 base 环境一直在 base 环境,打到 gray 环境一直在 gray 环境。
此外还有一个能力可以看到刚才创建的 demo 应用
想要查看所有流量的情况,还可以点击流量监控,可以看到流量的分配情况。以上就是一个全链路灰度的演示。只需要几个简单步骤:创建泳道组(泳道组就是圈入所有我们需要关心的泳道组)、创建泳道(创建一个流量分流的泳道,只要配好入口应用的流量比例,后续都将经过对应环境的流量,继续往后传递下去形成一个泳道的概念)、第三步提供了一个监控以及全局的监控来验证流量特征是否符合全链路灰度的流量规则。
三、基于消息队列 RocketMQ 实现全链路灰度
全链路灰度-消息
原理入上图所示,在客户端发消息时会在用户属性中带上环境,订阅的都是同一个topic,我们会在消息的发送方带上用户的属性,如果是 gray 应用会带上 gray 环境,如果是未打标环境会带上 base 的标。消息经过 MQ 服务端后会经过一个 SQL92 的过滤,如果是 gray 环境的消费组,会将 gray 的消息发到 gray 的消费者中;如果是 base 环境的消息会将 base 环境的消息发到 base 环境的消费者中从而实现一个消息的灰度。。
准备工作:
开通 MSE 服务治理
部署 Demo 应用
在上述的应用中加入消息的方式,可以通过 /test 方式来实现一个灰度应用的调用,调用路径是从 dubbo 调到 a,dubbo 或 springcloud 调到 c,c 会产生消息再给 a 消费。可以看到 c 产生 base 消息,a 消费到 base;c 产生 gray 消息,a 消费到 gray。接着会通过一个消息灰度的能力来进行演示。但是都需要开通 MSE服务治理和部署 Demo 应用的。
此处已经部署好了 demo 应用 abc,并且都有 gray 和 base 环境。
可以看到产品上的一个提示,有三个步骤:第一步服务端要支持 SQL 的过滤,此处已经配置好,同时会有一个操作,如果服务端配置好会自动创建。如果是使用阿里云的 MQ,需要提前创建好 group。只需要打开消息灰度即可,此处已经打开。
我们需要配合调用将整个链路都在灰度环境中闭环。此处配置了一个灰度的消息的消费:
如果参数 name=xiaoming 或者换成 user=test,走到灰度环境,然后 a 调用 b 再调用 c,然后 c 产生灰度的消息从而再消费消息。
在网址上查看路径,输入网址后可以看到其实都是灰度的流量。
如果输入 user=test1 是不满足灰度环境,会走 base 环境。现在来恢复 user=test的调用来查看消息的灰度是否生效。可以看到当前在 a 的 base 环境未打标环境,如果 c 发送的是未打标消息,a 收到打印出对应的消息其实是一个 a 的未打标环境。c 生产出未打标的消息然后由 a 进行消费。再来查看 agray 环境,可以看到 c产生消息后,a 消费到的都是一个 gray 环境的消息。以上就是简单的消息灰度的演示,整个步骤还是比较简单,但是需要一定的前置条件:支持 RocketMQ 版本>4.2.0、支持 Pull 和 Push 两种模式、需要在服务端配置 enablePropertyFilter=true 并重启服务端。
上述已经演示了灰度消息生效的场景,为了节省时间,本地已经搭建好了环境。流程总结只需要两个步骤,如果前提环境准备好,只需要编辑打开对应的环境。未打标环境忽略的标签是指例如回到刚才的场景下,如果在该过程中,gray 产生了消息但是消费者回滚,那么 server 端会堆积一些带上 gray 标的消息,此时如果 gray 环境的消息的消费者已经回滚,那么应该如何操作?此时通过这种方式,如果删掉就相当于未打标环境忽略的标签。服务端会堆积一堆 gray 环境的消息但是 gray 环境的消费者已经下线,此时我们就希望消息是被线上的 base 环境进行消费。就需要将忽略的标签删除,所有的消息就会被消费。但是如果我们不希望发生这种场景,只需要在此处输入需要被忽略的哪些标的消息。
四、总结
本节内容都是围绕全链路灰度产品化进行展开。先介绍了 MSE 全链路灰度产品化的能力,引入了一个泳道的概念,通过泳道可以做很多操作(例如之前提到的日常环境隔离以及一些核心应用的重保和一些全链路灰度的能力。)基于全链路灰度的能力的扩展还做了很多解决方案(例如基于 cloud 实现微服务的端云互联,以及基于 ingress 实现的全链路灰度。同时可以将 ingress 的实现换成 MSE 微服务网关。
也可以使用自建的 springcloud 等微服务网关来实现全链路灰度)。第二部分介绍了基于消息队列 RocketMQ 实现的全链路灰度(还支持将全链路灰度与CI/CD结合,通过 Jenkins 构建 CI/CD 实现路由的能力。还有基于日常环境隔离和端云互联实现一个微服务敏捷开发的最佳实践等与全链路灰度能力相关的解决方案。
并且随着用户的场景与实践的增加,解决方案会不断的完善与丰富。)第三部分分别演示了 RPC 全链路灰度、Rocket MQ 灰度的产品化方案。通过在控制台上增加开启消息灰度以及如果没有配置,base 环境会默认消费所有的消息。也可以增加一些 base 环境过滤的标签,即 base 环境忽略哪些标签。从而实现在变更或者回滚过程中避免丢失消息的情况。
在该部分我们还分享了来电科技的案例,来电科技使用的方式就是全链路灰度产品化的能力。它们通过创建一个小流量验证的泳道,从而实现小流量验证的场景。
MSE 的全链路灰度能力会随着客户场景的深入而不断迭代与扩展,只有经过客户打磨的产品才会愈发历久弥新。