以上代码为自定义负载均衡器,并使用了轮询算法 。如果 Header 中有灰度标签,则只查询灰度服务的节点实例,否则则查询出所有的正式节点实例(以供服务调用或服务转发) 。
3.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;@Componentpublic class LoadBalancerFilter implements GlobalFilter {@Overridepublic 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);}}
3.4 Openfeign 传递灰度标签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;@Componentpublic class FeignRequestInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate template) {// 从 RequestContextHolder 中获取 HttpServletRequestServletRequestAttributes 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 = https://www.isolves.com/it/cxkf/kj/2023-11-14/request.getHeader(key);map.put(key, value);}}return map;}}
小结灰度发布是微服务时代保证生产环境安全的必备措施 , 而其关键实现思路是:
1、注册中心区分正常服务和灰度服务;
2、负载均衡正确转发正常服务和灰度服务;
3、网关和 HTTP 工具传递灰度标签 。
这样,我们就完整的实现 Spring Cloud 全链路灰度发布功能了 。
推荐阅读
- C++异常处理:如何使用try、catch、throw
- 如何构建最小和最大堆
- 新手应该如何避免过度健身?
- 如何在户外进行有效的慢跑
- 太极拳如何做到脚下生根?
- 怎么保养化妆刷 如何正确清洗保养化妆刷
- 有了乳液,还要用面霜吗?学习如何选择最适合自己肌肤的护肤方法
- 看vivo手机如何换电池,iqoo手机怎么能换原装电池
- 怎样除去杯子上的标签贴纸,如何干净地去除杯子上的标签
- ppt能咋全屏显示,ppt如何使表格全屏显示