SpringCloud之LoadBalancer负载均衡器的简单使用

SpringCloud之LoadBalancer负载均衡器的简单使用

loadbalancer用于对提供服务的集群做一个节点的选取规则。

如图所示,load balancer集成在调用方

示例

  1. 创建loadbalance-base模块,并引入相关依赖
xml 复制代码
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
</dependencies>

版本信息

xml 复制代码
<properties>	
		<spring-boot.version>2.4.2</spring-boot.version>
        <spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
        <nacos.version>2021.1</nacos.version>
        <spring-cloud.version>2020.0.1</spring-cloud.version>
        <spring-cloud-bootstrap.version>3.0.3</spring-cloud-bootstrap.version>
        <spring-cloud-loadbalancer.version>3.0.1</spring-cloud-loadbalancer.version>
</properties>
  1. 创建服务提供者模块loadbalancer-provider-service
  • 主类
java 复制代码
@EnableDiscoveryClient
@SpringBootApplication
public class LoadBalanceProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(LoadBalanceProviderApplication.class, args);
    }
}
  • 配置
yaml 复制代码
spring:
  application:
    name: loadbalance-provider-service
  cloud:
    nacos:
      config:
        group: loadbalance-group
        namespace: loadbalance
        server-addr: 192.168.56.102:8848
        file-extension: yml
        prefix: ${spring.application.name}
      discovery:
        group: loadbalance-group
        namespace: loadbalance
        server-addr: 192.168.56.102:8848
        weight: 5

server:
  port: 8082
  • 服务类
java 复制代码
@RestController
public class TestController {
    @Value("${server.port}")
    private int port;

    @GetMapping("/service")
    public String test(){
        return "provicer servvice: [from port]:" + port;
    }
}
  • 启动nacos,创建响应的命名空间,并开启多实例服务,分别开启8081,和8082的两个loadbalance-provider-service服务实例
  1. 创建loadbalancer-consumer-service
  • 主类
java 复制代码
@SpringBootApplication
@EnableDiscoveryClient
public class LoadBalanceConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(LoadBalanceConsumerApplication.class, args);
    }
}
  • restTemplate配置类,此处必须在restTemplate上加上@LoadBalanced注解
java 复制代码
@Configuration
public class LoadConfiguration {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}
  • 服务类,restTemplate调用host:port改为服务提供者的名称
java 复制代码
@RestController
public class TestController {
    @Resource
    private RestTemplate restTemplate;

    @GetMapping("/service")
    public String test(){
      
        return restTemplate.getForObject("http://loadbalance-provider-service/service", String.class);
    }
}
  • 配置
yaml 复制代码
spring:
  application:
    name: loadbalance-consumer-service
  cloud:
    nacos:
      config:
        group: loadbalance-group
        namespace: loadbalance
        server-addr: 192.168.56.102:8848
        file-extension: yml
        prefix: ${spring.application.name}
      discovery:
        group: loadbalance-group
        namespace: loadbalance
        server-addr: 192.168.56.102:8848
        weight: 1

server:
  port: 9091
  • 启动loadbalacer-consumer-service服务

访问localhost:9091/service,并多次刷新,可以看到8081,和8082两个服务交替

provicer servvice: [from port]:8081
provicer servvice: [from port]:8082
provicer servvice: [from port]:8081
provicer servvice: [from port]:8082
provicer servvice: [from port]:8081
provicer servvice: [from port]:8082
....

Load Balancer提供的策略

  1. RoundRobin: 轮询策略,意思循环往复的的服务进行选取。
  2. Random: 随机策略,随机对服务选取一个节点

Load Balancer的默认负载策略

RoundRobin: 轮询策略,意思循环往复的的服务进行选取。

替换默认的负载策略,使用随机策略模式

  • 新建RandomLoadBalanceConfiguration配置类,将随机策略配置进去
java 复制代码
public class RandomLoadBalanceConfiguration {
    @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);
    }
}

按照官方说法配置类The classes you pass as @LoadBalancerClient or @LoadBalancerClients configuration arguments should either not be annotated with @Configuration or be outside component scan scope.

配置类不能加@Configuation注解或者要放在不被Spring容器扫描到的地方,意思要放在和主类平级的包下,不能放在主类的包或者子包。

  • 在主类或者某个能被扫描到的配置类上加上@LoadBalancerClients
  1. 配置全局策略
java 复制代码
@LoadBalancerClients(defaultConfiguration = WeightLoadBalanceConfiguration.class)
  1. 针对服务配置策略
java 复制代码
@LoadBalancerClients({
        @LoadBalancerClient(name = "loadbalance-provider-service", configuration = RandomLoadBalanceConfiguration.class)
})
相关推荐
ღ᭄ꦿ࿐Never say never꧂几秒前
微服务架构中的负载均衡与服务注册中心(Nacos)
java·spring boot·后端·spring cloud·微服务·架构·负载均衡
.生产的驴9 分钟前
SpringBoot 消息队列RabbitMQ 消息确认机制确保消息发送成功和失败 生产者确认
java·javascript·spring boot·后端·rabbitmq·负载均衡·java-rabbitmq
听封27 分钟前
Thymeleaf 的创建
java·spring boot·spring·maven
韶君34 分钟前
Spring Cloud Alibaba-(4)Sentinel【流控和降级】
spring cloud
huapiaoy1 小时前
Spring mvc
java·spring·mvc
你知道“铁甲小宝”吗丶2 小时前
【第34章】Spring Cloud之SkyWalking分布式日志
java·spring boot·spring·spring cloud·skywalking
一颗知足的心5 小时前
SpringCloud Alibaba五大组件之——Sentinel
spring·spring cloud·sentinel
wang_book8 小时前
Gitlab学习(007 gitlab项目操作)
java·运维·git·学习·spring·gitlab
一个诺诺前行的后端程序员10 小时前
springcloud微服务实战<1>
spring·spring cloud·微服务
Tatakai2513 小时前
Mybatis Plus分页查询返回total为0问题
java·spring·bug·mybatis