当前位置:首页 > 数码 > 微服务全链路灰度颁布施行指南 (微服务全链路追踪)

微服务全链路灰度颁布施行指南 (微服务全链路追踪)

admin7个月前 (05-01)数码32

灰度颁布(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指定>配置中心或者本配置

您可以根据自己需求,自由定义灰度发布规则,灵活实现微服务的灰度发布。

源码位置:

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: 微服务

“微服务全链路灰度颁布施行指南 (微服务全链路追踪)” 的相关文章

单体与微服务的技术抉择-拆分还是整合 (单体微服务架构是什么意思)

单体与微服务的技术抉择-拆分还是整合 (单体微服务架构是什么意思)

作者|AshleyDavis 译者|明知山 筹划|丁晓昀 继续之战:单体架构与微服务 随着亚马逊云科技在他们的官博中宣称他们丢弃了微服务并回归单体架构,单体架构与微服务之间...

微服务容量规划的最佳实践-确保应用程序的高可用性和性能 (微服务需要多少内存)

微服务容量规划的最佳实践-确保应用程序的高可用性和性能 (微服务需要多少内存)

维护众多的服务需要巨大的努力,手动操作已不再可行。以微博的动态推送功能为例,仅远程过程调用(RPC)服务就接近40种。这些服务接口的性能和需求各不相同,一些接口虽然处理请求量大,但响应迅速,称为轻...

Netflix-微服务设计必看-Eureka-的内部运作机制-深入剖析 (netflix)

Netflix-微服务设计必看-Eureka-的内部运作机制-深入剖析 (netflix)

在微服务架构中,服务发现和注册是确保各个微服务之间通信和协作的核心组件。Netflix Eureka 作为一款开源的服务发现和注册工具,在现代分布式系统中扮演着重要角色。本文将从代码层面深入探...

Netflix-Ribbon-分布式微服务架构的负载均衡神器-深入剖析 (netflix)

Netflix-Ribbon-分布式微服务架构的负载均衡神器-深入剖析 (netflix)

在现代分布式微服务架构中,负载均衡是保证系统高可用、高性能的关键组件之一。Netflix Ribbon 作为 Netflix 开源的负载均衡库,为微服务架构提供了强大的负载均衡能力,极大地促进了微...

别慌!丐版架构图带你秒懂-没用过微服务-轻松面试过关

别慌!丐版架构图带你秒懂-没用过微服务-轻松面试过关

微服务丐版架构图:面试必备 摘要 尽管大模型和云原生备受关注,微服务仍然在软件开发中占有重要地位。本文提供了一张丐版微服务架构图,帮助开发者在面试中了解微服务的基本概念和相关组件。 微服务架构...

稳如泰山!-开发微服务眼花缭乱-掌握这9个最佳实践 (稳如泰山心不乱打一最佳生肖)

稳如泰山!-开发微服务眼花缭乱-掌握这9个最佳实践 (稳如泰山心不乱打一最佳生肖)

微服务最佳实践:构建高效且复杂的生态系统 微服务架构已成为现代软件开发中最流行和先进的架构模式之一。它通过将应用程序分解为独立的、松散耦合的服务,实现了对解决方案的解耦,从而促进了持续交付和开发。...

微服务开发的九个最佳实践 (微服务开发的首选框架)

微服务开发的九个最佳实践 (微服务开发的首选框架)

微服务最佳实践:构建高效且可维护的架构 微服务架构作为服务器端代码开发和管理方式的演变,对软件开发产生了重大影响。遵循最佳实践对于减轻其固有复杂性至关重要,确保有效和可维护的微服务生态系统。 1...