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、自定义策略实现

接口:
image
依赖已实现:
image

通过了解源码:可以发现,目前存在的负载均衡策略,都是通过实现ReactorServiceInstanceLoadBalancer这个接口实现的

进入实现类,发现:
image

public Mono<Response<ServiceInstance>> choose(Request request) {}
这个类中实现了,获取服务的完整逻辑,所以,我们如果要自定义负载均衡配置,就可以参考这些实现;
posted @ 2024-12-16 22:47  代码红了一大片  阅读(90)  评论(0编辑  收藏  举报