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

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

相关推荐
Dcs15 分钟前
VSCode等多款主流 IDE 爆出安全漏洞!插件“伪装认证”可执行恶意命令!
java
保持学习ing21 分钟前
day1--项目搭建and内容管理模块
java·数据库·后端·docker·虚拟机
京东云开发者32 分钟前
Java的SPI机制详解
java
超级小忍1 小时前
服务端向客户端主动推送数据的几种方法(Spring Boot 环境)
java·spring boot·后端
程序无bug1 小时前
Spring IoC注解式开发无敌详细(细节丰富)
java·后端
小莫分享1 小时前
Java Lombok 入门
java
程序无bug1 小时前
Spring 对于事务上的应用的详细说明
java·后端
食亨技术团队1 小时前
被忽略的 SAAS 生命线:操作日志有多重要
java·后端
苦学编程的谢1 小时前
Maven
java·maven·intellij-idea
考虑考虑1 小时前
Maven 依赖范围(Scope)
java·后端·maven