微服务负载均衡器 LoadBalancer

Java
432
0
0
2022-11-11
标签   微服务

一、什么是 SpringCloud LoadBalancer

Spring Cloud LoadBalance 是 Spring Cloud 官方自己提供的客户端负载均衡器,用来替代 Ribbon,

Spring官方提供了两种负载均衡的客户端:

RestTemplate

RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTemplate 提供 了多种便捷访问远程 Http 服务的方法,能够大大提高客户端的编写效率。默认情况下,RestTemplate 默认依赖 jdk 的 HTTP 连接工具。

WebClient

WebClient 是 从Spring WebFlux 5.0 版本开始提供的一个非阻塞的基于响应式编程的进行 Http 请求的客户端工具。它的响应式编程的基于 Reactor 的。WebClient 中提供了标准 Http 请求方式对应的 get、post、put、delete等方法, 可以用来发起相应的请求。

二、创建项目

<dependencies> 
    <!-- nacos 服务注册与发现 移除 ribbon 支持  --> 
    <dependency> 
        <groupId>com.alibaba.cloud</groupId> 
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> 
        <exclusions> 
            <exclusion> 
                <groupId>org.springframework.cloud</groupId> 
                <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> 
            </exclusion> 
        </exclusions> 
    </dependency>

    <!--添加 load balance 依赖,需要添加 spring-cloud 依赖,在父工程以及引入--> 
    <dependency> 
        <groupId>org.springframework.cloud</groupId> 
        <artifactId>spring-cloud-starter-loadbalancer</artifactId> 
    </dependency>
</dependencies>

在 yml 文件中禁用 ribbon

spring: 
  application: 
    name: order-server 
  cloud: 
    nacos: 
      server-addr: 192.168.33.62:8847 
    # 不使用 ribbon 
    loadbalancer: 
      ribbon: 
        enabled: false

项目目录结构如下

微服务负载均衡器 LoadBalancer

再次启动项目stock-nacos以及order-loadbalancer,访问http://localhost:8031/order/add,发现实现了随机负载均衡的效果。

三、自定义负载均衡策略

Loadbalancer 默认实现了如下两种负载均衡策略:

  • RandomLoadBalancer - 随机分配策略
  • (默认) RoundRobinLoadBalancer - 轮询分配策略

3.1、创建配置类

如果想要修改默认的负载均衡策略,比如采用随机分配策略。则可以如下创建配置类,不需要添加Configuration注解

public class LoadBalancerConfig {
    @Bean 
    public ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory){
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
    }
}

3.2、修改主启动类

@SpringBootApplication
@LoadBalancerClient(name = "PAYMENT-SERVER", configuration = LoadBalancerConfig.class)
public class MainApplication {
    public static void main(String[] args) {
        SpringApplication.run(MainApplication .class, args);
    }
}