Ribbon的使用
场景描述:
注册中心使用本地的nacos,微服务nacos-server(两个实例)、nacos-client注册到nacos;
调用nacos-client的ClientController时,通过http客户端,使用负载均衡算法选择一个nacos-server服务实例进行调用。
父pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.demo</groupId>
<artifactId>spring-cloud-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-cloud-demo</name>
<packaging>pom</packaging>
<modules>
<module>nacos-client</module>
<module>nacos-server</module>
</modules>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.5.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
服务提供方nacos-server、服务调用方nacos-client引入以下依赖
由于nacos-discovery中整合了ribbon,因此不需要再重复引入ribbon依赖
<!-- 提供RestTemplate支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
</dependency>
<!-- nacos服务注册与发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
服务提供方nacos-server
代码以及配置
server:
port: 8039
spring:
application:
name: nacos-server #微服务名称
#配置nacos注册中心地址
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
@RestController
@RequestMapping("/hello")
public class HelloController {
@RequestMapping("/test")
public String test() {
System.out.println("hello test!!");
return "hello test!!";
}
}
@SpringBootApplication
public class NacosServerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosServerApplication.class, args);
}
}
服务调用方nacos-client
代码以及配置
server:
port: 8041
spring:
application:
name: nacos-client #微服务名称
#配置nacos注册中心地址
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
@Configuration
public class RestConfig {
@Bean("loadbalancerRestTemplate")
@LoadBalanced
public RestTemplate loadbalancerRestTemplate() {
// 具有负载均衡功能RestTemplate
return new RestTemplate();
}
@Bean
public RestTemplate restTemplate() {
// 普通的RestTemplate
return new RestTemplate();
}
}
@RestController
@RequestMapping("/client")
public class ClientController {
@Autowired
private RestTemplate loadbalancerRestTemplate;
@RequestMapping(value = "hello")
public String hello() {
String url = "http://nacos-server/hello/test";
String result = loadbalancerRestTemplate.getForObject(url, String.class);
return result;
}
}
@SpringBootApplication
public class NacosClientApplication {
public static void main(String[] args) {
SpringApplication.run(NacosClientApplication.class, args);
}
}
启动两个服务提供方nacos-server,端口分别为8039、8040;启动服务调用方nacos-client,端口为8041
使用浏览器访问http://localhost:8041/client/hello,则nacos-client用RestTemplate客户端通过ribbon从服务实例列表中选择一个nacos-server实例进行调用
Loadbalancer使用
Spring官方提供以下两种客户端都可以使用loadbalancer
整合RestTemplate
RestTemplate是Spring提供的用于访问Rest服务的http客户端
nacos-client服务调用方pom依赖中去除ribbon依赖,添加loadbalancer依赖;如果不移除,也可以在yml中配置不使用ribbon,spring.cloud.loadbalancer.ribbon.enabled属性为false。
方式一:修改pom文件
<!-- 提供RestTemplate支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- nacos服务注册与发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>```
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
方式二:修改yml配置
spring:
application:
name: nacos-client #微服务名称
#配置nacos注册中心地址
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
loadbalancer:
ribbon:
enabled: false
使用浏览器访问http://localhost:8041/client/hello,则nacos-client用RestTemplate客户端通过loadbalancer从服务实例列表中选择一个nacos-server实例进行调用
整合WebClient
WebClient是从Spring WebFlux 提供的一个非阻塞的基于响应式编程的进行Http请求的客户端工具
新增webClient配置类
@Configuration
public class WebClientConfig {
@Bean
@LoadBalanced
WebClient.Builder webClientBuilder() {
// 使WebClient具有负载均衡功能
return WebClient.builder();
}
@Bean
WebClient webClient() {
return webClientBuilder().build();
}
}
ClientController类增加webClient调用
@RestController
@RequestMapping("/client")
public class ClientController {
@Autowired
private WebClient webClient;
@RequestMapping(value = "hello1")
public Mono<String> helloWebClient() {
String url = "http://nacos-server/hello/test";
Mono<String> result = webClient.get().uri(url).retrieve().bodyToMono(String.class);
return result;
}
}
使用浏览器访问http://localhost:8041/client/hello1,则nacos-client用webclient响应式客户端通过loadbalancer从服务实例列表中选择一个nacos-server实例进行调用