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();
        }
    }
  • 相关阅读:
    conio
    create file in Linux
    单向链表
    面向对象(Object Oriented,OO)
    LLVM每日谈之五 LLVM文档介绍
    Team Geek 阅读笔记之 第三章 Every Boat Needs a Captain
    重温堆和拷贝构造函数
    LLVM每日谈之六 LLVM的源码结构
    LLVM每日谈之七 Clang
    LLVM每日谈之三 如何创建一个LLVM工程
  • 原文地址:https://www.cnblogs.com/zhangjianbin/p/7228341.html
Copyright © 2011-2022 走看看