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
    

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

相关推荐
程序猿小D11 分钟前
第二百六十九节 JPA教程 - JPA查询OrderBy两个属性示例
java·开发语言·数据库·windows·jpa
极客先躯1 小时前
高级java每日一道面试题-2024年10月3日-分布式篇-分布式系统中的容错策略都有哪些?
java·分布式·版本控制·共识算法·超时重试·心跳检测·容错策略
夜月行者1 小时前
如何使用ssm实现基于SSM的宠物服务平台的设计与实现+vue
java·后端·ssm
程序猿小D1 小时前
第二百六十七节 JPA教程 - JPA查询AND条件示例
java·开发语言·前端·数据库·windows·python·jpa
sdg_advance2 小时前
Spring Cloud之OpenFeign的具体实践
后端·spring cloud·openfeign
潘多编程2 小时前
Java中的状态机实现:使用Spring State Machine管理复杂状态流转
java·开发语言·spring
_阿伟_2 小时前
SpringMVC
java·spring
代码在改了2 小时前
springboot厨房达人美食分享平台(源码+文档+调试+答疑)
java·spring boot
猿java2 小时前
使用 Kafka面临的挑战
java·后端·kafka
wclass-zhengge3 小时前
数据结构篇(绪论)
java·数据结构·算法