Сегодня я поделюсь с вами идеей того, как я изучаю 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…