批改某个服务

配置文件形式

Ribbon - 负载平衡流程提过了propertiesFactory.isSet,这个次要是用于批改某个服务的负载平衡。

@Bean@ConditionalOnMissingBeanpublic 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扫描到。

@Configurablepublic 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信息。