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)
})
相关推荐
xyy202510 小时前
Spring事务的传播方式
java·数据库·spring
Jabes.yang13 小时前
Java大厂面试实录:从Spring Boot到微服务的技术探讨
java·spring boot·spring cloud·微服务·技术面试
不能再留遗憾了15 小时前
【SpringCloud】Sentinel
spring·spring cloud·sentinel
whltaoin16 小时前
AI 超级智能体全栈项目阶段五:RAG 四大流程详解、最佳实践与调优(基于 Spring AI 实现)
java·人工智能·spring·rag·springai
心勤则明17 小时前
Spring AI 文档ETL实战:集成text-embedding-v4 与 Milvus
人工智能·spring·etl
艾菜籽17 小时前
Spring Web MVC入门补充1
java·后端·spring·mvc
艾菜籽20 小时前
Spring MVC入门补充2
java·spring·mvc
熙客1 天前
阿里云负载均衡SLB的使用
网络·阿里云·云原生·云计算·负载均衡
为java加瓦1 天前
Spring 方法注入机制深度解析:Lookup与Replace Method原理与应用
java·数据库·spring
无名客01 天前
SpringCloud中的网关(Gateway)的作用是什么?
spring·spring cloud·gateway