SpringCloud中LoadBalancer负载均衡器配置

SpringCloud中LoadBalancer负载均衡器配置

依赖

xml 复制代码
<dependencies>
        <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>

服务提供者

java 复制代码
@RestController
public class TestController {
    @Value("${server.port}")
    private int port;

    @GetMapping("/service")
    public String test(){
        return "服务端口:" + port;
    }
}

服务启动

启动服务user第一个实例,端口8080

启动服务user第二个实例,端口8081

网关配置

yml 复制代码
server:
  port: 888
spring:
  profiles:
    active: dev
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      discovery:
        namespace: dev
      config:
        namespace: dev
        file-extension: yml
        extension-configs:
          - data-id: all-dev.yml
      ## 网关公共配置
    gateway:
      routes: # 路由集合[路由 就是指定当请求满足什么条件的时候转到哪个微服务]
        - id: user # 当前路由的标识, 要求唯一
          uri: lb://user-server # lb指的是从nacos中按照名称获取微服务,并遵循负载均衡策略
          predicates:  #匹配规则,全部满足才行
            - Path=/api/user/**
    

访问

连续4次请求 http://127.0.0.1:888/api/user/service

复制代码
服务端口:8080
服务端口:8081
服务端口:8080
服务端口:8081
服务端口:8080
服务端口:8081

说明: 默认情况下,负载均衡为轮训

Load Balancer提供的策略

RoundRobin: 轮询策略,意思循环往复的的服务进行选取。(Load Balancer的默认负载策略)

Random: 随机策略,随机对服务选取一个节点

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

  • 新建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);
    }
}

注意: 此处不要加**@Configuration**,因为这个配置类生效会在@LoadBalancerClients配置

  • 在启动或者某个能被扫描到的配置类上加上@LoadBalancerClients

  • 配置策略(全局配置和针对某个服务配置)

    java 复制代码
    package com.cdn.shopgateway;
    
    import com.cdn.shopgateway.config.RandomLoadBalancerConfig;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient;
    import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients;
    
    @EnableDiscoveryClient  
    @SpringBootApplication
    @LoadBalancerClients(defaultConfiguration = RandomLoadBalancerConfig.class) // 全局修改loadBanance默认的负载策略,默认是轮训
    // @LoadBalancerClients({
    //         @LoadBalancerClient(name = "user", configuration = RandomLoadBalancerConfig.class)
    // })  // 正对loadbalance-provider-service服务修改loadBanance默认的负载策略,默认是轮训
    public class GatewayApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(GatewayApplication.class, args);
            System.out.println("===========网关启动成功============");
        }
    
    
    }

    再次访问

    连续6次请求 http://127.0.0.1:888/api/user/service

    复制代码
    服务端口:8081
    服务端口:8080
    服务端口:8080
    服务端口:8081
    服务端口:8081
    服务端口:8081

    说明: 此时,负载策略变为随机

相关推荐
百***464513 小时前
Java进阶-在Ubuntu上部署SpringBoot应用
java·spring boot·ubuntu
serve the people13 小时前
Prompts for Chat Models in LangChain
java·linux·langchain
一叶飘零_sweeeet14 小时前
不止于 API 调用:解锁 Java 工具类设计的三重境界 —— 可复用性、线程安全与性能优化
java·工具类
q***766615 小时前
Spring Boot 从 2.7.x 升级到 3.3注意事项
数据库·hive·spring boot
A阳俊yi15 小时前
Spring Data JPA
java·开发语言
小王不爱笑13215 小时前
Spring AOP(AOP+JDBC 模板 + 转账案例)
java·后端·spring
遇印记15 小时前
蓝桥java蜗牛
java·学习·蓝桥杯
m0_5656111316 小时前
Java-泛型
java·windows
张np16 小时前
java基础-集合接口(Collection)
java·开发语言
jakeswang16 小时前
ServletLess架构简介
java·后端·servletless