关键词:负载均衡 Spring Cloud LoadBalancer
Spring Cloud不仅提供了使用Ribbon进行客户端负载均衡,还提供了Spring Cloud LoadBalancer。相比较于Ribbon,Spring Cloud LoadBalancer不仅能够支持RestTemplate,还支持WebClient。WeClient是Spring Web Flux中提供的功能,可以实现响应式异步请求,因此学习Spring Cloud LoadBalancer之前,建议先了解下Spring Web Flux。
█ 使用
公共依赖:
Spring Cloud依赖,版本是Hoxton.RELEASE。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
搭建服务注册中心-Eureka:
关于Eureka的使用,请戳《服务注册与发现-Spring Cloud Netflix-Eureka》
搭建服务端:
(1)引入依赖:
<dependency>
<!-- 使用web,使用Spring MVC对外提供服务 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<!-- Eureka客户端,用于向Eureka服务端注册服务 -->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
(2)创建Controller,对外提供访问接口:
@RestController
@RequestMapping("/base")
public class BaseController {
@Value("${server.port}")
private Integer port;
@GetMapping("/string")
public String getString() {
return "my server get string ---->"+port;
}
}
(3)编写application.yml配置:
# 服务端口号
server:
port: 8081
# 服务名
spring:
application:
name: myServer
# Eureka
eureka:
client:
# 不从Eureka注册中心获取服务列表
fetch-registry: false
# 向Eureka注册中心注册当前服务
register-with-eureka: true
# Eureka服务地址
service-url:
defaultZone: http://localhost:8899/eureka
(4)分别以两个不同的端口号启动服务端项目,比如:8081、8082
搭建客户端:
(1)引入依赖:
<dependency>
<!-- Spring Cloud loadbalancer 负载均衡-->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<!-- Eureka客户端,用于向Eureka服务端获取已注册服务列表 -->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
(2)编写application.yml配置:
server:
port: 80
eureka:
client:
fetch-registry: true
register-with-eureka: false
service-url:
defaultZone: http://localhost:8899/eureka
在《服务负载均衡-Spring Cloud Netflix-Ribbon》中,Spring Cloud提供了@LoadBalanced注解配合RestTemplate使用Spring Cloud Ribbon实现了客户端的负载均衡。对于Spring Cloud LoadBalancer也可以使用相同的方式。另外Spring Cloud LoadBalancer也提供了接合Spring Web Flux的负载均衡,如果你客户端使用Spring Web Flux完成服务端的访问,也只需相似的配置就能实现客户端负载均衡。
如果在项目的类路径下存在Spring Cloud Ribbon相关的类,需要通过配置关闭Ribbon功能,因为Spring Cloud默认优先使用Ribbon:
spring:
cloud:
loadbalancer:
ribbon:
enabled: false
(3)客户端调用服务端接口
客户端可以使用两种方式访问服务端接口,一种是使用RestTemplate,一种是WebClient。
- RestTemplate
①引入依赖:
<dependency>
<!-- 使用web,使用Spring MVC对外提供服务 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
②编写配置,创建RestTemplate类型的Bean:
需要在方法上标注@LoadBalanced注解。
@Configuration
public class LoadbalanceConfiguration {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
③编写Controller,客户端实现访问服务端资源,并对外提供访问接口:
通过@Autowired,会注入第①个步骤中创建的RestTemplate实例。
@RestController
@RequestMapping("/rt/client")
public class RestClient {
// myServer是服务端的服务名,spring.application.name的配置
private static final String BASE_URL = "http://myServer";
@Autowired
private RestTemplate restTemplate;
@GetMapping("/getString")
public String getString() {
// 调用服务端提供的接口
return restTemplate.getForObject(BASE_URL+"/base/string", String.class);
}
}
④启动服务端,调用接口:localhost:80/rt/client/getString
访问客户端接口,客户端通过负载均衡,选择一个可用的服务端接口调用。
- WebClient
WebClient是Spring Web Flux中提供的类,通过使用WebClient可以通过响应式编程的方式异步访问服务端接口。
WebClient.Bulider是WebClient的内部类,也是编程的入口。
①引入依赖:
<dependency>
<!-- Spring Webflux响应式web编程-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
②编写配置,创建WebClient.Bulider类型的Bean:
同样需要在方法上标注@LoadBalanced注解。
@Configuration
public class LoadbalanceConfiguration {
@Bean
@LoadBalanced
public WebClient.Builder builder() {
return WebClient.builder();
}
}
③编写Controller,客户端实现访问服务端资源,并对外提供访问接口:
@RestController
@RequestMapping("/rx/client")
public class ReactiveClient {
private static final String BASE_URL = "http://myServer";
@Autowired
private WebClient.Builder clientBuilder;
@GetMapping(&#