微服务全链路灰度颁布施行指南 (微服务全链路追踪)
灰度颁布(GrayRelease,也称为灰度颁布或金丝雀颁布)是指在软件或服务颁布环节中,将新版本的性能或服务以较小的比例引入到消费环境中,仅向局部用户或节点提供新性能的一种颁布战略。
在传统的全量颁布中,新版本的性能会一次性性所有部署到一切的用户或节点上。但是,这种形式潜在的危险是,假设新版本存在毛病或疑问,或者会对一切用户或节点发生重大的影响,造成系统解体或服务无法用。
相比之下,灰度颁布驳回较小的规模,并逐渐将新版本的性能引入到消费环境中,仅向一小局部用户或节点提供新性能。经过继续监测和评价,可以在发现疑问时及时回滚或修复。这种逐渐引入新版本的形式可以降落危险,并提高系统的稳固性和牢靠性。
1.成功思绪
灰色颁布的经常出现成功思绪有以下几种:
而在消费环境中,比拟罕用的是依据用户标识来成功灰色颁布,也就是说先让一小局部用户体验新性能,以发现新服务中或者存在的某种毛病或无余。
2.详细成功
SpringCloud全链路灰色颁布的关键成功思绪如下图所示:
图片
灰度颁布的详细成功步骤如下:
经过第四步的重复传递之后,整个SpringCloud全链路的灰度颁布就成功了。
3.外围成功思绪和代码
灰度颁布的关键成功技术和代码如下。
3.1辨别正式服务和灰度服务
在灰度颁布的口头流程中,有一个外围的疑问,假设在SpringCloudLoadBalancer启动服务调用时,辨别正式服务和灰度服务呢?
这个疑问的处置打算是:在灰度服务既注册中心的MetaData(元数据)中标识自己为灰度服务即可,而元数据中没有标识(灰度服务)的则为正式服务,以Nacos为例,它的设置如下:
spring:lication:name:canary-user-servicecloud:nacos:discovery:username:nacospass:nacosserver-addr:localhost:8848namespace:publicregister-enabled:truemetadata:{"grap-tag":"true"}#标识自己为灰度服务
3.2负载平衡调用灰度服务
SpringCloudLoadBalancer判别并调用灰度服务的关键实现代码如下:
privateResponse<ServiceInstance>getInstanceResponse(List<ServiceInstance>instances,Requestrequest){//实例为空if(instances.isEmpty()){if(log.isWarnEnabled()){log.warn("Noserversavailableforservice:"+this.serviceId);}returnnewEmptyResponse();}else{//服务不为空RequestDataContext>packagecom.example.gateway.config;importcom.loadbalancer.canary.common.GlobalVariables;importorg.springframework.cloud.gateway.filter.GatewayFilterChain;importorg.springframework.cloud.gateway.filter.GlobalFilter;importorg.springframework.core.Ordered;importorg.springframework.http.HttpStatus;importorg.springframework.http.server.reactive.ServerHttpRequest;importorg.springframework.http.server.reactive.ServerHttpResponse;importorg.springframework.stereotype.Component;importorg.springframework.web.server.ServerWebExchange;importreactor.core.publisher.Mono;@ComponentpublicclassLoadBalancerFilterimplementsGlobalFilter{@OverridepublicMono<Void>filter(ServerWebExchangeexchange,GatewayFilterChainchain){//失掉request、response对象ServerHttpRequestrequest=exchange.getRequest();ServerHttpResponseresponse=exchange.getResponse();if(request.getQueryParams().getFirst(GlobalVariables.GRAY_KEY)!=null){//设置金丝雀标识response.getHeaders().set(GlobalVariables.GRAY_KEY,"true");}//此步骤反常,口头下一步returnchain.filter(exchange);}}
3.4Openfeign传递灰度标签
HTTP调用工具Openfeign传递灰度标签的实现代码如下:
importfeign.RequestInterceptor;importfeign.RequestTemplate;importjakarta.servlet.http.HttpServletRequest;importorg.springframework.stereotype.Component;importorg.springframework.web.context.request.RequestContextHolder;importorg.springframework.web.context.request.ServletRequestAttributes;import.util.Enumeration;importjava.util.LinkedHashMap;importjava.util.Map;@ComponentpublicclassFeignRequestInterceptorimplementsRequestInterceptor{@Overridepublicvoidapply(RequestTemplatetemplate){//从RequestContextHolder中失掉HttpServletRequestServletRequestAttributesattributes=(ServletRequestAttributes)RequestContextHolder.getRequestAttributes();//失掉RequestContextHolder中的信息Map<String,String>headers=getHeaders(attributes.getRequest());//放入openfeign的RequestTemplate中for(Map.Entry<String,String>entry:headers.entrySet()){template.header(entry.getKey(),entry.getValue());}}/***失掉原恳求头*/privateMap<String,String>getHeaders(HttpServletRequestrequest){Map<String,String>map=newLinkedHashMap<>();Enumeration<String>enumeration=request.getHeaderNames();if(enumeration!=null){while(enumeration.hasMoreElements()){Stringkey=enumeration.nextElement();Stringvalue=request.getHeader(key);map.put(key,value);}}returnmap;}}
小结
灰度颁布是微服务时代保障消费环境安保的必备措施,而其关键成功思绪是:
1、注册中心辨别反常服务和灰度服务;
2、负载平衡正确转发反常服务和灰度服务;
3、网关和HTTP工具传递灰度标签。
这样,咱们就完整的成功SpringCloud全链路灰度颁布性能了。
Spring微服务灰度发布(热部署)的实现(二)
接着上篇说,我们微服务中用到的nepxion discovery主要采用了三种灰度发布方式,一种是web图形化界面发布,二是zuul过滤器灰度发布,三是业务参数策略灰度发布。下面将重点介绍三种方式的实现。
一、web图形化界面灰度发布
因为我们项目用到了eureka注册中心,所以选择web图形化界面灰度发布比较合适。
1) 首先需要建立一个discovery控制台工程console, 端口为2222,控制台工程负责web图形化界面请求的处理,运行console工程。
2) 下载discovery ui,地址:,运行discovery UI,端口为8090
3)浏览器中输入localhost:8090,即可打开控制台,如下
注意:全链路灰度发布需要在“配置中心”下才可用。灰度发布配置中心,负责存储全链路灰度发布规则,并将规则推送到各个微服务中。而配置中心可用nacos,redis等,Discovery 中提供了相应配置中心的插件包。
二、zuul网关过滤器灰度发布
通过网关过滤器传递Http Header的方式传递全链路灰度路由规则。下面代码只适用于Zuul和Spring Cloud Gateway网关,Service微服务不需要加该方式。
三、业务参数在策略类中自定义灰度路由规则
通过策略方式自定义灰度路由规则。下面代码既适用于Zuul和Spring Cloud Gateway网关,也适用于Service微服务,同时全链路中网关和服务都必须加该方式
上面说了具体灰度规则发布方式,那究竟怎么定义灰度规则呢??
规则是基于XML或者Json为配置方式,存储于本地文件或者远程配置中心,可以通过远程配置中心修改的方式达到规则动态化。其核心代码参考discovery-plugin-framework以及它的扩展、discovery-plugin-config-center以及它的扩展和discovery-plugin-admin-center等,规则示例
XML示例(Json示例见discovery-springcloud-example-service下的)
黑/白名单的IP地址注册的过滤规则
微服务启动的时候,禁止指定的IP地址注册到服务注册发现中心。支持黑/白名单,白名单表示只允许指定IP地址前缀注册,黑名单表示不允许指定IP地址前缀注册。规则如何使用,见示例说明
最大注册数的限制的过滤规则
微服务启动的时候,一旦微服务集群下注册的实例数目已经达到上限(可配置),将禁止后续的微服务进行注册。规则如何使用,见示例说明
黑/白名单的IP地址发现的过滤规则
微服务启动的时候,禁止指定的IP地址被服务发现。它使用的方式和“黑/白名单的IP地址注册的过滤规则”一致
版本访问的灰度发布规则
版本权重的灰度发布规则
全局版本权重的灰度发布规则
区域权重的灰度发布规则
全局区域权重的灰度发布规则
网关端全链路路由策略的灰度发布规则
注意 路由策略的入口有三个(以{discovery-springcloud-example-a:1.0, discovery-springcloud-example-b:1.0, discovery-springcloud-example-c:1.0;1.2})为例:
其作用的优先级为外界传入>网关Filter指定>配置中心或者本配置
您可以根据自己需求,自由定义灰度发布规则,灵活实现微服务的灰度发布。
源码位置:
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。