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
    

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

相关推荐
Daniel 大东30 分钟前
BugJson因为json格式问题OOM怎么办
java·安全
Theodore_10225 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
冰帝海岸6 小时前
01-spring security认证笔记
java·笔记·spring
世间万物皆对象6 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了7 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
小二·7 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic7 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王7 小时前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康7 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
qq_17448285758 小时前
springboot基于微信小程序的旧衣回收系统的设计与实现
spring boot·后端·微信小程序