学向勤中得,萤窗万卷书。这篇文章主要讲述#yyds干货盘点#使用Ribbon完成应用灰度发布相关的知识,希望能为你提供帮助。
使用Ribbon完成应用灰度发布定义RibbonRequestContext
public class RibbonRequestContext private final Map<
String, String>
attr = new HashMap<
>
();
public String put(String key, String value)
return attr.put(key, value);
public String remove(String key)
return attr.remove(key);
public String get(String key)
return attr.get(key);
【#yyds干货盘点#使用Ribbon完成应用灰度发布】维护一个map,用于透传解析的请求信息。
RibbonRequestContextHolder:
public class RibbonRequestContextHolder private static ThreadLocal<
RibbonRequestContext>
holder = new ThreadLocal<
RibbonRequestContext>
()
@Override
protected RibbonRequestContext initialValue()
return new RibbonRequestContext();
;
public static RibbonRequestContext getCurrentContext()
return holder.get();
public static void setCurrentContext(RibbonRequestContext context)
holder.set(context);
public static void clearContext()
holder.remove();
持有自定义的RibbonRequestContext
然后定义GrayRequestInterceptor
public class GrayInterceptor implements ClientHttpRequestInterceptor @Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
throws IOException
if (request.getHeaders().containsKey("Gray"))
String value = https://www.songbingjia.com/android/request.getHeaders().getFirst("Gray");
if (value.equals("true"))
RibbonRequestContextHolder.getCurrentContext().put("Gray", Boolean.TRUE.toString());
ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
attributes.setAttribute("Gray", Boolean.TRUE.toString(), 0);
return execution.execute(request, body);
GrayRequestInterceptor加入到RestTemplate
@Bean
@LoadBalanced
public RestTemplate restTemplate()
RestTemplate restTemplate = new RestTemplate();
restTemplate.getInterceptors().add(new GrayInterceptor());
return restTemplate;
@Bean
public IRule myRule()
return new GrayRule();
自定义IRule:
ublic class GrayRule extends AbstractLoadBalancerRule private Random random = new Random();
@Override
public void initWithNiwsConfig(IClientConfig clientConfig) @Override
public Server choose(Object key)
boolean grayInvocation = false;
try
String grayTag = RibbonRequestContextHolder.getCurrentContext().get("Gray");
if(!StringUtils.isEmpty(grayTag) &
&
grayTag.equals(Boolean.TRUE.toString()))
grayInvocation = true;
List<
Server>
serverList = this.getLoadBalancer().getReachableServers();
List<
Server>
grayServerList = new ArrayList<
>
();
List<
Server>
normalServerList = new ArrayList<
>
();
for(Server server : serverList)
NacosServer nacosServer = (NacosServer) server;
if(nacosServer.getMetadata().containsKey("gray") &
&
nacosServer.getMetadata().get("gray").equals("true"))
grayServerList.add(server);
else
normalServerList.add(server);
if(grayInvocation)
return grayServerList.get(random.nextInt(grayServerList.size()));
else
return normalServerList.get(random.nextInt(normalServerList.size()));
finally
RibbonRequestContextHolder.clearContext();
服务提供者通过spring.cloud.nacos.discovery.metadata.gray=false 配置项决定元数据内容
最后发起服务调用的时候传递Header中的Gray信息,如果为true,只会路由到灰度实例,否则路由到正常实例。
OpenFeign配置拦截:
public class GrayRequestInterceptor implements RequestInterceptor
@Override
public void apply(RequestTemplate template)
if (template.headers().containsKey("Gray"))
String value = https://www.songbingjia.com/android/template.headers().get("Gray").iterator().next();
if (value.equals("true"))
RibbonRequestContextHolder.getCurrentContext().put("Gray", Boolean.TRUE.toString());
推荐阅读
- Java抽象类
- 数组String
- Object类
- Android技术分享| Android WebRTC 对 AudioRecord 的使用
- java中this关键字的基本使用
- 深度介绍Flink在字节跳动数据流的实践
- Java向上转型和向下转型
- java基础知识简化
- #yyds干货盘点#分布式技术专题「Zookeeper中间件」给大家学习一下Zookeeper的”开发伴侣”—Curator-Framework(基础篇)