Spring Cloud 负载均衡配置 (@LoadBalanced)
一、负载均衡 目前是两种 Ribbon 和 spring-cloud-loadbalancer
- Ribbon
- 已经闭源
- 配置策略较多 :轮询,随机,权重,自定义 四种负载均衡方案
- 配置方式
- yml
- 注解
- spring-cloud-loadbalancer
- 属于springcloud,项目兼容性更好
- 配置策略: 更注重 自定义(默认为轮询)
- 配置方式
- 注解
二、使用Ribbon进行自定义负载均衡配置
1、使用yml配置
ribbon: # 配置负载均衡策略
"order-service":
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule # 这里配置负载均衡策略为 RoundRobin # 使用轮询策略
ILoadBalancer:
RetryHandler: com.netflix.loadbalancer.RetryHandler
PingInterval: 1000 # 设置ping的间隔
2、使用自定义配置
在配置类中配置的负载均衡策略,会运用与全局,所以指定的话,需要使用 @RibbonClients
和@RibbonClien 配置设置
@Configuration
public class LoadBalancerConfig { // 为 order-service 配置轮询负载均衡策略
@Bean
public IRule orderServiceLoadBalancerRule() {
return new RoundRobinRule(); // 使用轮询策略
}
// 为 stock-service 配置随机负载均衡策略
@Bean
public IRule stockServiceLoadBalancerRule() {
return new RandomRule();
// 使用随机策略
}
}
注意:定义一个全局使用的配置类,不能放在启动类的目录,会被全局扫描,需要放在一个启动类不会扫描的类(启动类会扫描和它相同包里面的所有配置)
@RibbonClients({
@RibbonClient(name = "order-service", configuration = OrderServiceRibbonConfig.class),
@RibbonClient(name = "stock-service", configuration = StockServiceRibbonConfig.class)
})
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
3、自定义策略实现:
通过实现 IRule 接口 并 实现 其 choose 方法,自定义定义负载均衡策略
自行查询,配置方案
三、使用 spring-cloud-loadbalancer 实现负载均衡配置
目前:loadbalancer 只支持通过注解来设置负载均衡器
1、通过注解配置
@LoadBalancerClients({
@LoadBalancerClient(value = "stock-service",name = "stock-service", configuration = OrderConfig.class),
@LoadBalancerClient(value = "order-service",name = "stock-service", configuration = RandomLoadBalancer.class),
})
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
如上,不同的服务使用不同的配置,可按照上述的内容配置;
2、自定义策略实现
接口:
依赖已实现:
通过了解源码:可以发现,目前存在的负载均衡策略,都是通过实现
ReactorServiceInstanceLoadBalancer这个接口实现的
进入实现类,发现:
public Mono<Response<ServiceInstance>> choose(Request request) {}
这个类中实现了,获取服务的完整逻辑,所以,我们如果要自定义负载均衡配置,就可以参考这些实现;