修改某個服務
配置檔案方式
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資訊。