Выпуск Spring Cloud Alibaba Nacos в оттенках серого (обмен идеями)

Java

Сегодня я поделюсь с вами идеей того, как я изучаю Nacos и хочу использовать его для публикации в градациях серого.

Что такое публикация в оттенках серого, см. следующую ссылку:Encyclopedia.Baidu.com/item/%E7%81…

Итак, переходя к сути, после того, как семейство Netflix остыло одно за другим, компонент Ribbon всегда был сильным и также используется в Spring Cloud Alibaba Nacos. На самом деле, чтобы сделать релиз в градациях серого на основе Nacos, нужно также делать что-то на Ribbon.

Первый шаг — расширить предикат метаданных.

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<String,String> versionMap = new HashMap<>();
        versionMap.put("version",versionNo);
        final Set<Map.Entry<String,String>> attributes =
                Collections.unmodifiableSet(versionMap.entrySet());
        final Map<String,String> metadata = nacosServer.getInstance().getMetadata();
        return metadata.entrySet().containsAll(attributes);
    }
}

Второй шаг расширяет правило метаданных

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();
    }
}

Наконец

Публикация в градациях серого на самом деле очень сложная система.Приведенный выше код просто дает вам небольшое представление, и это блюдо также изучается.

В то же время для всех рекомендовать очень хорошее издательскую структуру Grey (Worly Brother работает),GitHub.com/NEP West Oh You/DIS…