zoukankan      html  css  js  c++  java
  • springcloud基于ribbon的canary路由方案

    思路

    根据eureka的metadata进行自定义元数据,然后使用ribbon对该元数据进行过滤和匹配,选择server。

    实现

    这里使用header来传递路由信息,改造ribbon-discovery-filter-spring-cloud-starter,使其不影响静态server list。

    filter

    public class TagFilter extends ZuulFilter {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(TagFilter.class);
    
        @Override
        public String filterType() {
            return "pre";
        }
    
        @Override
        public int filterOrder() {
            return 7;
        }
    
        @Override
        public boolean shouldFilter() {
            return true;
        }
    
        @Override
        public Object run() {
            RequestContext requestContext = RequestContext.getCurrentContext();
            HttpServletRequest request = requestContext.getRequest();
            String tag = request.getHeader("tag");
    
            RibbonFilterContextHolder.getCurrentContext().add("tag", tag);
            LOGGER.info("route {} to {}",request.getRequestURI(),tag);
    
            return null;
        }
    }

    predicate

    public class MetadataAwarePredicate extends AbstractServerPredicate{
    
        @Override
        public boolean apply(PredicateKey input) {
            if(input == null || !(input.getServer() instanceof DiscoveryEnabledServer)){
                return true;
            }
            DiscoveryEnabledServer server = (DiscoveryEnabledServer) input.getServer();
            final RibbonFilterContext context = RibbonFilterContextHolder.getCurrentContext();
            final Set<Map.Entry<String, String>> attributes = Collections.unmodifiableSet(context.getAttributes().entrySet());
            final Map<String, String> metadata = server.getInstanceInfo().getMetadata();
            return metadata.entrySet().containsAll(attributes);
        }
    }

    rule

    public class MetadataAwareRule extends ZoneAvoidanceRule {
    
        @Override
        public AbstractServerPredicate getPredicate() {
            return new MetadataAwarePredicate();
        }
    }

    autoconfig

    @Configuration
    @ConditionalOnClass(DiscoveryEnabledNIWSServerList.class)
    @AutoConfigureBefore(RibbonClientConfiguration.class)
    @ConditionalOnProperty(value = "ribbon.filter.metadata.enabled", matchIfMissing = true)
    public class RibbonMetaFilterAutoConfiguration {
    
        @Bean
        @ConditionalOnMissingBean
        @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
        public MetadataAwareRule metadataAwareRule() {
            return new MetadataAwareRule();
        }
    }
  • 相关阅读:
    linux命令练习
    Centos修改用户密码
    Git使用
    使用SecureCRT连接虚拟机中Linux系统 和 虚拟机网络配置
    CentOS里Tomcat端口开放
    Linux下安装Tomcat
    laravel 中将DB::select 得到的内容转为数组
    nginx 转发 由于php语法错误 导致的 50x
    windows 下后台启动 redis
    sublime 非常好用的注释工具
  • 原文地址:https://www.cnblogs.com/zhangjianbin/p/7228341.html
Copyright © 2011-2022 走看看