IT袋

当前位置:主页 > 经验教程 > 建站编程 >

微服务灰度发布的底层实现

微服务灰度发布的底层实现 微服务灰度发布的技术实现方式(3)

时间:2024-03-06 21:21:17 来源:IT袋 作者:马勇
导读:微服务灰度发布的底层实现,以上代码为自定义负载均衡器,并使用了轮询算法。如果 Header 中有灰度标签,则只查询灰度服务的节点实例,否则则查询出所有的正式节点实例(以供服

微服务灰度发布的底层实现

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

4.3、网关传递灰度标识

要在网关 Spring Cloud Gateway 中传递灰度标识,只需要在 Gateway 的全局自定义过滤器中设置 Response 的 Header 即可,具体实现代码如下:

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;
@Component
public 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,我们需要在微服务间继续传递灰度标签,它的实现代码如下:

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;
@Component
public 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;
    }
}

上述的关于微服务灰度发布的底层实现的全面知识讲解,IT袋网网小编希望能帮到您。

相关阅读

  • 深入理解Adam优化器:工作原理与深度学习的应用

    深入理解Adam优化器:工作原理与深度学习的应用

    今日重点为您介绍深入理解Adam优化器的相关经验,接下来IT袋网小编就来介绍。 介绍Adam优化器 Adam优化器是一种用于深度学习模型训练的优化算法,自2015年提出以来,已广泛应用于各种机器学

  • Javascript基础入门 学习Javascript的基础知识

    Javascript基础入门 学习Javascript的基础知识

    今日IT小知识分享:Javascript基础入门的介绍,一起来看看吧! JavaScript, 是一门能够运行在浏览器上的脚本语言. 简称JS. 首先,,Javascript这个名字的由来就很有意思, 不少人认为Javascript和Java貌似

  • dnf模型补丁制作教程 关于dnf补丁最全的网站

    dnf模型补丁制作教程 关于dnf补丁最全的网站

    一篇方法教程,与您分享dnf模型补丁制作教程和关于dnf补丁最全的网站方面的内容,接下来就是全面介绍。 我发了很多游戏补丁的视频,很多小伙伴都下载了,但是却很多人不会使用,虽然说

  • 现在小说网站投稿哪里好 适合短篇小说投稿的网站推荐

    现在小说网站投稿哪里好 适合短篇小说投稿的网站推荐

    本文核心内容:现在小说网站投稿哪里好和适合短篇小说投稿的网站推荐方面的内容,请看下面详细的介绍。 很多朋友想通过写网络小说赚钱,又不知道哪个平台好,哪个平台适合自己。下面