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
-
配置策略(全局配置和针对某个服务配置)
javapackage 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
说明: 此时,负载策略变为随机