第四节:Ribbon负载均衡使用

本文介绍了Ribbon负载均衡的两种配置方式:注解注入和配置文件设置。详细解析了如何通过@Bean注解添加自定义负载均衡策略,并通过配置文件为特定服务指定负载均衡策略。此外还介绍了如何开启Ribbon的饥饿加载来减少首次请求延迟。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、注入的方式

添加Bean

    @Bean
    public IRule getRule(){
        return new RandomRule();
    }

再次启动项目,发送请求,就是随机的了。

实现方式在这RibbonClientConfiguration中:

	@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;
	}

	@Bean
	@ConditionalOnMissingBean
	public ILoadBalancer ribbonLoadBalancer(IClientConfig config,
			ServerList<Server> serverList, ServerListFilter<Server> serverListFilter,
			IRule rule, IPing ping, ServerListUpdater serverListUpdater) {
		if (this.propertiesFactory.isSet(ILoadBalancer.class, name)) {
			return this.propertiesFactory.get(ILoadBalancer.class, config, name);
		}
		return new ZoneAwareLoadBalancer<>(config, rule, ping, serverList,
				serverListFilter, serverListUpdater);
	}

如果没有IRule,那么就使用默认的,不过先从propertiesFactory中找。

然后将IRule放入到ILoadBalancer中稍后使用。

从这里我们就能看出,第二种使用方式,那就是从propertiesFactory中获取。

2、配置方式

2.1实现

在RibbonAutoConfiguration中,注入了propertiesFactory

@Bean
@ConditionalOnMissingBean
public PropertiesFactory propertiesFactory() {
   return new PropertiesFactory();
}

该类通过Spring的Environment获取配置:

public class PropertiesFactory {
	@Autowired
	private Environment environment;
	private Map<Class, String> classToProperty = new HashMap<>();
	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);
      //environment.get("client.ribbon.NFLoadBalancerRuleClassName")
			String className = environment
					.getProperty(name + "." + NAMESPACE + "." + classNameProperty);
			return className;
		}
		return null;
	}

其中22行的name来自下面的配置,默认值是client,在使用过程中,会添加ribbon.client.name=对应的服务名

	@RibbonClientName
	private String name = "client";
	
@Value("${ribbon.client.name}")
public @interface RibbonClientName {

}

我们修改代码,也能看出,配置文件的优先级大于注入的方式。

2.2 使用

添加配置:

user-service:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

重启服务,测试通过。

3、总结

注解的方式是全局的,但是配置的方式只是针对某一个服务的。

4、懒加载

Ribbon默认是采用懒加载,即第一次访问时才会去创建请求服务的LoadBalanceClient,请求时间会很长。而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:

ribbon:
  eager-load:
    enabled: true
    clients: #需要饥饿加载的服务
      - user-service
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七号公园的忧伤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值