灰度发布的三种方式(实现可用)

您所在的位置:网站首页 灰度映射的三种方式 灰度发布的三种方式(实现可用)

灰度发布的三种方式(实现可用)

2024-07-15 19:34| 来源: 网络整理| 查看: 265

一、利用网关zuul对服务的调用

服务配置元数据,在网关中拦截请求,根据用户对应的级别,分发到不同的服务,实现灰度发布。

1、被调用服务service-sms的配置文件如下application.yml: eureka: client: service-url: defaultZone: http://localhost:7900/eureka/ registry-fetch-interval-seconds: 30 enabled: true #,http://localhost:7901/eureka/,http://localhost:7902/eureka/ instance: lease-renewal-interval-in-seconds: 30 --- spring: profiles: v1 eureka: instance: metadata-map: version: v1 server: #服务端口 port: 8003 --- spring: profiles: v2 eureka: instance: metadata-map: version: v2 server: #服务端口 port: 8004 2)网关服务中编写拦截器

引入maven依赖

io.jmnarloch ribbon-discovery-filter-spring-cloud-starter 2.1.0

编写filter

@Component public class GrayFilter extends ZuulFilter { @Override public String filterType() { return FilterConstants.PRE_TYPE; } @Override public int filterOrder() { return 0; } @Override public boolean shouldFilter() { return true; } @Override public Object run() throws ZuulException { RequestContext currentContext = RequestContext.getCurrentContext(); HttpServletRequest request = currentContext.getRequest(); int userId = Integer.parseInt(request.getHeader("userId")); // 根据用户id 查 规则 查库 v1,meata // 金丝雀 if (userId == 1){ RibbonFilterContextHolder.getCurrentContext().add("version","v1"); // 普通用户 }else if (userId == 2){ RibbonFilterContextHolder.getCurrentContext().add("version","v2"); } return null; } } 3)psotman测试

http://localhost:9100/service-sms/test/sms-test3 在这里插入图片描述

二、在客户端service-sms利用ribbon编写自定义规则进行负载

思路:在请求进入的时候,通过spring aop技术拦截请求,将请求的用户id和对应的version通过ThreadLocal进行设置值。在请求出口处,获取到ThreadLocal内的值,通过ribbon进行服务选择。

1、定义一个规则类继承AbstractLoadBalancerRule public class GrayRule extends AbstractLoadBalancerRule { /** * 根据用户选出一个服务 * @param iClientConfig * @return */ @Override public void initWithNiwsConfig(IClientConfig iClientConfig) { } @Override public Server choose(Object key) { return choose(getLoadBalancer(),key); } public Server choose(ILoadBalancer lb, Object key){ System.out.println("灰度 rule"); Server server = null; while (server == null){ // 获取所有 可达的服务 List reachableServers = lb.getReachableServers(); // 获取 当前线程的参数 用户id verion=1 Map map = RibbonParameters.get(); String version = ""; if (map != null && map.containsKey("version")){ version = map.get("version"); } System.out.println("当前rule version:"+version); // 根据用户选服务 for (int i = 0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3