乐趣区

关于ribbon:Ribbon-几种自定义负载均衡策略

批改某个服务

配置文件形式

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

退出移动版