微服务 见 调用请求头传递_微服务平台之灰度发布

本文介绍了EOS8微服务平台的灰度发布,包括灰度发布的概念、实践操作,如设置实例组注册、流量策略以及请求路由。在实践中,通过Spring Cloud Netflix和Spring Cloud Gateway实现动态路由,并在灰度发布后通过监控确保版本正确性和功能稳定性。
摘要由CSDN通过智能技术生成

bfccb87d5bd8fcc42ce4abafe5b64bc4.png

转载本文需注明出处:微信公众号EAWorld,违者必究。

引言:

灰度发布是指在应用的新、旧版本间平滑过渡的一种发布方式。根据特定的规则,挑选一部分用户访问灰度版本的服务,并逐步扩大范围,最终把所有用户访问迁移到新的版本上来。灰度发布时,主要涉及设置流控规则和部署新版本这两个动作,本次主要是介绍在EOS8微服务平台里灰度发布的流量控制。

目录:

一、灰度发布介绍

二、灰度发布实践

三、灰度发布后的监控

一、灰度发布介绍

954c34fc3fd9ec9c90f313894f318010.png

灰度发布是指在应用的新、旧版本间平滑过渡的一种发布方式。在应用发布与产品迭代中,通常会采用灰度发布来控制上线风险。在发布前先进行小规模的生产环境验证,让新版本的应用实例来承接、处理限定规模或范围的业务流量。通过收集使用体验的数据,对应用新版本的功能、性能、稳定性等指标进行评判,进而决定扩大新版本部署范围直至全量升级或回滚至老版本。

灰度发布时,主要涉及设置流控规则和部署新版本这两个动作,这2个动作没有一定的先后次序。可以:

1.部署新版本 -> 设置流控规则:可能的问题是在灰度规则设置生效前,进入新版本应用实例的流量可能不是灰度的。

2.设置流控规则 -> 部署新版本:可能的问题是新版本未部署前,灰度流量会降级路由到非灰度环境,在第一批新版本实例在发布后,有受到全部灰度流量冲击的风险。

二、灰度发布实践

下面主要介绍下EOS8微服务平台里灰度发布的流量控制。

1、概念介绍

d2717e1aa215b88d74fc757a6b5f78e5.png

这是EOS8里的【系统】相关的概念模型:

1.一个系统有多个应用组成,一个应用就是一个微服务,一个应用可以有多个实例组

2.一个系统有一个网关,跨系统之间的API调用需要经过该网关

3.一个系统上可以配置多个流量策略,该流量策略对系统内应用和网关同时起作用

2、实例组注册

9866e1199738cc66a9be03e6be460038.png

实例组是一个逻辑概念。EOS8通过在应用的application.yml文件里的注册中心相关配置里,增加一个key为eos.inst-grp-code的自定义的metadata,用来指定分组,value可以是应用版本或其它值。

3、流量策略设置

1c3eaee7c6d653f7f13ebd5e2af64b54.png

通过EOS8的Governor页面可以设置一个系统的流量策略。一个系统内可以有多个流量策略,流量策略可以设置优先级以及是否启用。一个策略主要由2部分组成:

1.规则:用于定义的用于匹配请求来源,支持HTTP_HEADER、源应用以及IP段3种规则。

2.目标应用:用于定义满足【规则】的请求会被路由到本系统的哪个应用以及哪个实例组。

1396a3099fc6f34d143b47c819ed0abf.png

流量策略会保存在Apollo的配置中心,这样可以方便应用和网关监听流量策略配置的变化。

我们会给每个系统在Apollo上创建一个项目,项目名称为 “SYS.”+系统编码,系统编码要求全局唯一。在该项目下,我们会创建一个Apollo公共的Namespace,名称为 ”ATP.”+系统编码,使用公共namespace是为了让应用和网关都可以使用该namespace的配置。

保存在Apollo上的配置,是以目标应用编码为key,value是和该目标编码相关的流量策略集合。

4、请求路由

8afa7f31058cf7aab3676d6bd835e05a.png

调用请求分类分为2部分:

1.系统内调用:系统内应用互相调用,这种调用不需要经过网关,由应用之间直接互调,支持RestTemplate和Feign

2.跨系统调用:跨系统的应用互相调用,需要经过网关路由转发

EOS8的微服务平台里使用的是Spring Cloud Netflix和Spring Cloud Gateway,所以以上2种情况可以归纳为如何在Ribbon Client上实现流量策略的路由转发,不同点在于:

1.系统内调用时,如果规则是HTTP_HEADER,匹配的是Client(RestTemplate或者Feign)发送时的请求头

2.跨系统调用时,如果规则是HTTP_HEADER,匹配的是网关收到的请求头

663dad2bc9c9c0acfdf3dead83358b90.png

Ribbon 是一种客户端负载,配合注册中心一起使用时,可以根据被调用的服务名选取合适的实例进行服务调用。Spring Cloud Netflix Ribbon 也提供了比较方便的扩展,可以自定义IRule并通过AutoConfiguration自动注入。

可以在自定义的IRule里实现根据流控策略选择合适应用实例进行服务调用,配合Apollo Client一起使用,可以达到动态修改流控策略的效果。

需要注意的是如果是Hystrix和Ribbon一起使用的时候,可能会遇到跨线程传递数据的问题,可以有以下几种方案选择:

1.使用HystrixRequestVariableDefault

2.自定义HystrixConcurrencyStrategy

3.使用Spring Cloud Sleuth

5、实现流程

94c012ec703000e8995311db85603378.png

总结一下,灰度发布的大概实现流程:

1.应用启动时指定实例分组,并注册到注册中心

2.应用连接到Apollo,获取本系统的流量策略,并设置Apollo的监听器,监听流量策略配置的变化

3.Governor修改流量策略并保存到配置中心

4.当有请求访问时,不论Gateway还是App都会在Ribbon上做负载均衡,做负载均衡时就会根据要访问的应用编码查看是否有流控策略,如果有流控策略则按流控策略路由,如果所有流控策略都不满足会就会路由到默认组;如果没有流控策略也是路由到默认组

三、灰度发布后的监控

93696a116754bccd10cd43c1ff84043e.png

灰度发布后,需要监控灰度发布的版本是否正确,比如:

1.是否有不满足流控策略的请求路由到灰度版本实例,或者应该路由到灰度版本的请求

2.灰度版本的程序功能是否正确,响应时间是否正常等

3.灰度版本的整个请求链路日志是否正确

这些可以通过Governor的业务链路来查看,监控信息主要来自于SkyWalking以及ES的日志。确认无误后,可以增加灰度版本实例,并下线老版本。

de8d41aae5d47960a35edd5a171be631.png

关于作者:普元高级软件工程师,开源技术爱好者,容器技术专家,曾参与浦东发展银行BPM项目、银联PAASV1等项目。

关于EAWorld:微服务,DevOps,数据治理,移动架构原创技术分享。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
微服务架构中,如果使用Feign来进行服务间的通信,并且希望在调用链路中传递MDC(Mapped Diagnostic Context),可以按照以下步骤进行配置: 1. 配置Feign的RequestInterceptor:通过实现Feign的RequestInterceptor接口,可以在请求被发送之前拦截请求并修改请求的头部信息。在这个拦截器中,你可以将MDC的数据添加到请求头中。 ```java public class MDCFeignRequestInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate template) { // 获取MDC的数据并添加到请求头 template.header("X-MDC-Data", MDC.getCopyOfContextMap().toString()); } } ``` 2. 注册MDCFeignRequestInterceptor:将上述的拦截器注册到Feign客户端中。 ```java @Configuration public class FeignConfig { @Bean public MDCFeignRequestInterceptor mdcFeignRequestInterceptor() { return new MDCFeignRequestInterceptor(); } @Bean public feign.RequestInterceptor requestInterceptor() { return mdcFeignRequestInterceptor(); } } ``` 3. 在服务调用的地方使用@FeignClient注解指定feign.RequestInterceptor的Bean。 ```java @FeignClient(name = "service-name", configuration = FeignConfig.class) public interface MyFeignClient { // Feign接口定义 } ``` 通过以上配置,MDC的数据就会被传递到Feign请求的头部中。在服务提供方接收到请求后,可以从请求头中获取MDC的数据,并将其设置到MDC中,以保证在服务提供方的日志中能够正确地记录MDC的相关信息。 当然,在使用上述方法传递MDC时,需要确保各个微服务的日志框架都支持MDC,并且在日志输出时正确地处理MDC的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值