当前位置:首页 > 科技  > 软件

微服务如何灰度发布?你会吗?

来源: 责编: 时间:2024-05-17 17:44:54 244观看
导读微服务中的灰度发布(又称为金丝雀发布)是一种持续部署策略,它允许在正式环境的小部分用户群体上先部署新版本的应用程序或服务,而不是一次性对所有用户同时发布全新的版本。这种方式有助于在生产环境中逐步验证新版本的稳

微服务中的灰度发布(又称为金丝雀发布)是一种持续部署策略,它允许在正式环境的小部分用户群体上先部署新版本的应用程序或服务,而不是一次性对所有用户同时发布全新的版本。MEL28资讯网——每日最新资讯28at.com

这种方式有助于在生产环境中逐步验证新版本的稳定性和兼容性,同时最小化潜在风险,不影响大部分用户的正常使用。MEL28资讯网——每日最新资讯28at.com

1.灰度发布关键步骤

在 Spring Cloud 微服务架构中,实现灰度发布通常涉及到以下几个方面:MEL28资讯网——每日最新资讯28at.com

  1. 流量分割

根据一定的策略(如用户 ID、请求头信息、IP 地址等)将流入的请求分配给不同版本的服务实例。MEL28资讯网——每日最新资讯28at.com

使用 Spring Cloud Gateway、Zuul 等 API 网关组件实现路由规则,将部分请求定向至新版本的服务节点。MEL28资讯网——每日最新资讯28at.com

  1. 版本标识

新版本服务启动时会注册带有特定版本标签的服务实例到服务注册中心(如 Eureka 或 Nacos)。MEL28资讯网——每日最新资讯28at.com

请求在路由时可以根据版本标签选择相应版本的服务实例。MEL28资讯网——每日最新资讯28at.com

  1. 监控与评估MEL28资讯网——每日最新资讯28at.com

在灰度发布的阶段,运维团队会对新版本服务的性能、稳定性以及用户体验等方面进行实时监控和评估。MEL28资讯网——每日最新资讯28at.com

如果新版本表现良好,则可以逐渐扩大灰度范围直至全面替换旧版本。MEL28资讯网——每日最新资讯28at.com

  1. 故障恢复与回滚:若新版本出现问题,可通过快速撤销灰度发布策略,使所有流量恢复到旧版本服务,实现快速回滚,确保服务整体可用性。MEL28资讯网——每日最新资讯28at.com

通过 Spring Cloud 的扩展组件和自定义路由策略,开发人员可以轻松实现灰度发布功能,确保在微服务架构中安全、平滑地进行版本迭代升级。MEL28资讯网——每日最新资讯28at.com

2.实现思路

灰色发布的常见实现思路有以下几种:MEL28资讯网——每日最新资讯28at.com

  • 根据用户划分:根据用户标识或用户组进行划分,在整个用户群体中只选择一小部分用户获得新功能。
  • 根据地域划分:在不同地区或不同节点上进行划分,在其中的一小部分地区或节点进行新功能的发布。
  • 根据流量划分:根据流量的百分比或请求次数进行划分,只将一部分请求流量引导到新功能上。

而在生产环境中,比较常用的是根据用户标识来实现灰色发布,也就是说先让一小部分用户体验新功能,以发现新服务中可能存在的某种缺陷或不足。MEL28资讯网——每日最新资讯28at.com

3.底层实现

Spring Cloud 全链路灰色发布的关键实现思路如下图所示:MEL28资讯网——每日最新资讯28at.com

图片图片MEL28资讯网——每日最新资讯28at.com

灰度发布的具体实现步骤如下:MEL28资讯网——每日最新资讯28at.com

  1. 前端程序在灰度测试的用户 Header 头中打上标签,例如在 Header 中添加“gray-tag: true”,其表示要进行灰常测试(访问灰度服务),而其他则为访问正式服务。
  2. 在负载均衡器 Spring Cloud LoadBalancer 中,拿到 Header 中的“gray-tag”进行判断,如果此标签不为空,并等于“true”的话,表示要访问灰度发布的服务,否则只访问正式的服务。
  3. 在网关 Spring Cloud Gateway 中,将 Header 标签“gray-tag: true”继续往下一个调用服务中传递。
  4. 在后续的调用服务中,需要实现以下两个关键功能:

在负载均衡器 Spring Cloud LoadBalancer 中,判断灰度发布标签,将请求分发到对应服务。MEL28资讯网——每日最新资讯28at.com

将灰度发布标签(如果存在),继续传递给下一个调用的服务。MEL28资讯网——每日最新资讯28at.com

经过第四步的反复传递之后,整个 Spring Cloud 全链路的灰度发布就完成了。MEL28资讯网——每日最新资讯28at.com

4.具体实现

4.1 版本标识

在灰度发布的执行流程中,有一个核心的问题,如果在 Spring Cloud LoadBalancer 进行服务调用时,区分正式服务和灰度服务呢?MEL28资讯网——每日最新资讯28at.com

这个问题的解决方案是:在灰度服务既注册中心的 MetaData(元数据)中标识自己为灰度服务即可,而元数据中没有标识(灰度服务)的则为正式服务,以 Nacos 为例,它的设置如下:MEL28资讯网——每日最新资讯28at.com

spring:  application:    name: gray-user-service  cloud:    nacos:      discovery:        username: nacos        password: nacos        server-addr: localhost:8848        namespace: public        register-enabled: true         metadata: { "gray-tag":"true" } # 标识自己为灰度服务

4.2 负载均衡调用灰度服务

Spring Cloud LoadBalancer 判断并调用灰度服务的关键实现代码如下:MEL28资讯网——每日最新资讯28at.com

private Response<ServiceInstance> getInstanceResponse(List<ServiceInstance> instances,                                                          Request request) {        // 实例为空        if (instances.isEmpty()) {            if (log.isWarnEnabled()) {                log.warn("No servers available for service: " + this.serviceId);            }            return new EmptyResponse();        } else { // 服务不为空            RequestDataContext dataContext = (RequestDataContext) request.getContext();            HttpHeaders headers = dataContext.getClientRequest().getHeaders();            // 判断是否为灰度发布(请求)            if (headers.get(GlobalVariables.GRAY_KEY) != null &&                    headers.get(GlobalVariables.GRAY_KEY).get(0).equals("true")) {                // 灰度发布请求,得到新服务实例列表                List<ServiceInstance> findInstances = instances.stream().                        filter(s -> s.getMetadata().get(GlobalVariables.GRAY_KEY) != null &&                                s.getMetadata().get(GlobalVariables.GRAY_KEY).equals("true"))                        .toList();                if (findInstances.size() > 0) { // 存在灰度发布节点                    instances = findInstances;                }            } else { // 查询非灰度发布节点                // 灰度发布测试请求,得到新服务实例列表                instances = instances.stream().                        filter(s -> s.getMetadata().get(GlobalVariables.GRAY_KEY) == null ||                                !s.getMetadata().get(GlobalVariables.GRAY_KEY).equals("true"))                        .toList();            }            // 随机正数值 ++i( & 去负数)            int pos = this.position.incrementAndGet() & Integer.MAX_VALUE;            // ++i 数值 % 实例数 取模 -> 轮询算法            int index = pos % instances.size();            // 得到服务实例方法            ServiceInstance instance = (ServiceInstance) instances.get(index);            return new DefaultResponse(instance);        }    }

以上代码为自定义负载均衡器,并使用了轮询算法。如果 Header 中有灰度标签,则只查询灰度服务的节点实例,否则则查询出所有的正式节点实例(以供服务调用或服务转发)。MEL28资讯网——每日最新资讯28at.com

4.3 网关传递灰度标识

要在网关 Spring Cloud Gateway 中传递灰度标识,只需要在 Gateway 的全局自定义过滤器中设置 Response 的 Header 即可,具体实现代码如下:MEL28资讯网——每日最新资讯28at.com

package com.example.gateway.config;import com.loadbalancer.canary.common.GlobalVariables;import org.springframework.cloud.gateway.filter.GatewayFilterChain;import org.springframework.cloud.gateway.filter.GlobalFilter;import org.springframework.core.Ordered;import org.springframework.http.HttpStatus;import org.springframework.http.server.reactive.ServerHttpRequest;import org.springframework.http.server.reactive.ServerHttpResponse;import org.springframework.stereotype.Component;import org.springframework.web.server.ServerWebExchange;import reactor.core.publisher.Mono;@Componentpublic class LoadBalancerFilter implements GlobalFilter {    @Override    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {        // 得到 request、response 对象        ServerHttpRequest request = exchange.getRequest();        ServerHttpResponse response = exchange.getResponse();        if (request.getQueryParams().getFirst(GlobalVariables.GRAY_KEY) != null) {            // 设置金丝雀标识            response.getHeaders().set(GlobalVariables.GRAY_KEY,                    "true");        }        // 此步骤正常,执行下一步        return chain.filter(exchange);    }}

4.4 微服务中传递灰度标签

HTTP 调用工具 Openfeign,我们需要在微服务间继续传递灰度标签,它的实现代码如下:MEL28资讯网——每日最新资讯28at.com

import feign.RequestInterceptor;import feign.RequestTemplate;import jakarta.servlet.http.HttpServletRequest;import org.springframework.stereotype.Component;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes;import java.util.Enumeration;import java.util.LinkedHashMap;import java.util.Map;@Componentpublic class FeignRequestInterceptor implements RequestInterceptor {    @Override    public void apply(RequestTemplate template) {        // 从 RequestContextHolder 中获取 HttpServletRequest        ServletRequestAttributes attributes = (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());        }    }    /**     * 获取原请求头     */    private Map<String, String> getHeaders(HttpServletRequest request) {        Map<String, String> map = new LinkedHashMap<>();        Enumeration<String> enumeration = request.getHeaderNames();        if (enumeration != null) {            while (enumeration.hasMoreElements()) {                String key = enumeration.nextElement();                String value = request.getHeader(key);                map.put(key, value);            }        }        return map;    }}


MEL28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-88919-0.html微服务如何灰度发布?你会吗?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 一篇文章带你了解JavaScript While 循环

下一篇: C++ algorithm.h 头文件的常见算法的使用

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • 卢伟冰长文解析K60至尊版 对Redmi有着里程碑式的意义

    在今天的Redmi后性能时代战略发布会结束之后,Redmi总经理卢伟冰又带来了一篇长文,详解了为什么 Redmi 要开启后性能时代?为什么选择和 MediaTek、Pixelworks 深度合作?以及后性
  • 多线程开发带来的问题与解决方法

    使用多线程主要会带来以下几个问题:(一)线程安全问题  线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程
  • JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • 深度探索 Elasticsearch 8.X:function_score 参数解读与实战案例分析

    在 Elasticsearch 中,function_score 可以让我们在查询的同时对搜索结果进行自定义评分。function_score 提供了一系列的参数和函数让我们可以根据需求灵活地进行设置。近期
  • 慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz&ldquo;难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?&rdquo;这一番话,出自百合网联合创
  • 腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之&ldquo;想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!&rdquo;曾凭借直播腾讯旗下代理格斗游戏《DNF》一
  • iQOO 11S新品发布会

    iQOO将在7月4日19:00举行新品发布会,推出杭州亚运会电竞赛事官方用机iQOO 11S。
  • 荣耀Magicbook V 14 2021曙光蓝版本正式开售,拥有触摸屏

    荣耀 Magicbook V 14 2021 曙光蓝版本正式开售,搭载 i7-11390H 处理器与 MX450 显卡,配备 16GB 内存与 512GB SSD,重 1.48kg,厚 14.5mm,具有 1.5mm 键盘键程、
Top