批改某个服务
配置文件形式
Ribbon – 负载平衡流程提过了 propertiesFactory.isSet,这个次要是用于批改某个服务的负载平衡。
@Bean
@ConditionalOnMissingBean
public IRule ribbonRule(IClientConfig config) {if (this.propertiesFactory.isSet(IRule.class, name)) {return this.propertiesFactory.get(IRule.class, config, name);
}
ZoneAvoidanceRule rule = new ZoneAvoidanceRule();
rule.initWithNiwsConfig(config);
return rule;
}
调用 isSet 的时候,会判断 getClassName 是否有找到对应的配置文件,如果有,则应用配置文件对应的规定。
public PropertiesFactory() {classToProperty.put(ILoadBalancer.class, "NFLoadBalancerClassName");
classToProperty.put(IPing.class, "NFLoadBalancerPingClassName");
classToProperty.put(IRule.class, "NFLoadBalancerRuleClassName");
classToProperty.put(ServerList.class, "NIWSServerListClassName");
classToProperty.put(ServerListFilter.class, "NIWSServerListFilterClassName");
}
public boolean isSet(Class clazz, String name) {return StringUtils.hasText(getClassName(clazz, name));
}
public String getClassName(Class clazz, String name) {if (this.classToProperty.containsKey(clazz)) {String classNameProperty = this.classToProperty.get(clazz);
String className = environment
.getProperty(name + "." + NAMESPACE + "." + classNameProperty);
return className;
}
return null;
}
我本地的配置,这样就把轮询改为随机了。
eureka-provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
注解形式
首先要写一个 @Configurable,外面蕴含了对应要重写的规定。这个 @Configurable 不能被 spring 扫描到。
@Configurable
public class CustomerConfiguration {
// 定义负载平衡策略
@Bean
public IRule ribbonRule() {return new RandomRule();
}
}
而后在 ConsumerApplication(也能够在其余能被扫描的中央)加上 @RibbonClient 注解。@RibbonClient(value = “eureka-provider”, configuration = a.b.c.CustomerConfiguration.class)。
启动后,对于 eureka-provider 的负载平衡策略,就是 RandomRule。
那为什么 CustomerConfiguration 不能扫描呢,Ribbon – 负载平衡流程中提过整个流程,这边针对这个 CustomerConfiguration 被扫描的状况下大略讲一下。
全局批改
注解形式
@RibbonClients(defaultConfiguration= a.b.c.CustomerConfiguration.class),通过 RibbonClients 注解配置全局。
Ribbon – 初始化提过 @RibbonClients 的解决,他会通过 RibbonClientConfigurationRegistrar 把 @RibbonClients 的配置最终保留在 SpringClientFactory 中,而后 AnnotationConfigApplicationContext 调用 refresh 的时候,就会注入 CustomerConfiguration,而后加载咱们自定义的 IRule 等其余 bean 信息。