Spring Cloud Alibaba Nacos 之 灰度发布(思路分享)

在netflix全家桶相继凉凉后,Ribbon组件确一直坚挺包括在Spring Cloud Alibaba Nacos中也在使用。其实要基于Nacos做灰度发布,也是在Ribbon上做手脚。

第一步扩展Metadata Predicate

public abstract class DiscoveryEnabledPredicate extends AbstractServerPredicate {


    @Override
    public boolean apply(@Nullable PredicateKey input) {
    	//由于NacosServer继承了Ribbon的Server,那么扩展成其他配置中心同理
        return input != null
                && input.getServer() instanceof NacosServer
                && apply((NacosServer) input.getServer());
    }

    protected abstract boolean apply(NacosServer nacosServer);
}
public class MetadataAwarePredicate extends DiscoveryEnabledPredicate{
    @Override
    protected boolean apply(NacosServer nacosServer) {
    	//根据客户端传入的版本号进行过滤,此处可自行设计扩展
        HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder
                .getRequestAttributes()).getRequest();
        String versionNo = request.getHeader("version");
        Map versionMap = new HashMap<>();
        versionMap.put("version",versionNo);
        final Set> attributes =
                Collections.unmodifiableSet(versionMap.entrySet());
        final Map metadata = nacosServer.getInstance().getMetadata();
        return metadata.entrySet().containsAll(attributes);
    }}

第二步扩展Metadata Rule

public abstract class DiscoveryEnabledRule extends PredicateBasedRule {

    private final CompositePredicate predicate;

    public DiscoveryEnabledRule(DiscoveryEnabledPredicate  discoveryEnabledPredicate) {
        Assert.notNull(discoveryEnabledPredicate, "Parameter 'discoveryEnabledPredicate' can't be null");
        this.predicate = createCompositePredicate(discoveryEnabledPredicate,new AvailabilityPredicate(this,null));
    }



    @Override
    public AbstractServerPredicate getPredicate() {
        return this.predicate;
    }

    private CompositePredicate createCompositePredicate(DiscoveryEnabledPredicate discoveryEnabledPredicate,
                                                        AvailabilityPredicate availabilityPredicate) {
        return CompositePredicate.withPredicates(discoveryEnabledPredicate, availabilityPredicate)
                .build();
    }
}
public class MetadataAwareRule extends DiscoveryEnabledRule{


    public MetadataAwareRule(){
        this(new MetadataAwarePredicate());
    }

    public MetadataAwareRule(DiscoveryEnabledPredicate predicate) {
        super(predicate);
    }
}

第三步丢进Spring容器

@Configuration
public class RibbonDiscoveryRuleAutoConfiguration {

    @Bean
    public DiscoveryEnabledRule metadataAwareRule(){
        return new MetadataAwareRule();
    }
}

最后
灰度发布其实是一个挺复杂的系统,上述代码只是给大家提供一丢丢思路,本菜也在学习中。
顺便在此给大家推荐一个Java方面的交流学习群:957734884,里面会分享一些高级面试题,还有资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系,主要针对Java开发人员提升自己,突破瓶颈,相信你来学习,会有提升和收获。在这个群里会有你需要的内容 朋友们请抓紧时间加入进来吧

Spring Cloud Alibaba Nacos 之 灰度发布(思路分享)_第1张图片
Spring Cloud Alibaba Nacos 之 灰度发布(思路分享)_第2张图片

你可能感兴趣的:(Spring Cloud Alibaba Nacos 之 灰度发布(思路分享))