微服务系列-使用WebFlux的WebClient进行Spring Boot 微服务通信示例 ...

打印 上一主题 下一主题

主题 886|帖子 886|积分 2658

公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。
概述

在之前的教程中,我们看到了使用 RestTemplate 的 Spring Boot 微服务通信示例
从 5.0 开始,RestTemplate处于维护模式,很快就会被弃用。因此 Spring 团队建议使用org.springframework.web.reactive.client.WebClient ,它支持同步、异步和流场景。
在本教程中,我们将学习如何使用WebClient在多个微服务之间进行 REST API 调用(同步通信)。
WebClient是一个非阻塞的响应式客户端,用于执行 HTTP 请求,通过底层 HTTP 客户端库(例如 Reactor Netty)来实现。
要在 Spring boot 项目中使用WebClient,我们必须将Spring WebFlux依赖项添加到类路径中。
我们需要做什么

下面将创建两个微服务,例如 部门服务 和 用户服务,并且我们将使用WebClient从 用户服务 到 部门服务 进行 REST API 调用 ,以获取特定的用户部门数据。

基础配置

我们在上一篇文章中创建了两个微服务: 使用 RestTemplate 的 Spring Boot 微服务通信示例。
第1步:添加Spring WebFlux依赖

打开user-service项目的pom.xml文件并添加以下依赖项:
  1.                 <dependency>
  2.                         <groupId>org.springframework.boot</groupId>
  3.                         <artifactId>spring-boot-starter-webflux</artifactId>
  4.                 </dependency>
  5.                 <dependency>
  6.                         <groupId>io.netty</groupId>
  7.                         <artifactId>netty-resolver-dns-native-macos</artifactId>
  8.                         <classifier>osx-aarch_64</classifier>
  9.                 </dependency>
复制代码
可以看到上面还添加了netty-resolver-dns-native-macos的pom,原因是如果不添加此报会抛出相关异常,问题详情
第2步:将WebClient配置为Spring Bean
  1. package io.wz.userservice;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.web.reactive.function.client.WebClient;
  6. @SpringBootApplication
  7. public class UserServiceApplication {
  8.     public static void main(String[] args) {
  9.         SpringApplication.run(UserServiceApplication.class, args);
  10.     }
  11.     @Bean
  12.     public WebClient webClient(){
  13.         return WebClient.builder().build();
  14.     }
  15. }
复制代码
第三步:注入并使用WebClient调用REST API

让我们注入WebClient并使用它来进行 REST API 调用:
  1. DepartmentDto departmentDto = webClient.get()
  2.                  .uri("http://localhost:8080/api/departments/" + user.getDepartmentId())
  3.                          .retrieve()
  4.                                  .bodyToMono(DepartmentDto.class)
  5.                                          .block();
复制代码
下面是UserServiceImpl类的完整代码, 供大家参考:
  1. package io.wz.userservice.service.impl;
  2. import io.wz.userservice.dto.DepartmentDto;
  3. import io.wz.userservice.dto.ResponseDto;
  4. import io.wz.userservice.dto.UserDto;
  5. import io.wz.userservice.entity.User;
  6. import io.wz.userservice.repository.UserRepository;
  7. import io.wz.userservice.service.UserService;
  8. import lombok.AllArgsConstructor;
  9. import org.springframework.stereotype.Service;
  10. import org.springframework.web.reactive.function.client.WebClient;
  11. @Service
  12. @AllArgsConstructor
  13. public class UserServiceImpl implements UserService {
  14.     private UserRepository userRepository;
  15.     private WebClient webClient;
  16.     @Override
  17.     public User saveUser(User user) {
  18.         return userRepository.save(user);
  19.     }
  20.     @Override
  21.     public ResponseDto getUser(Long userId) {
  22.         ResponseDto responseDto = new ResponseDto();
  23.         User user = userRepository.findById(userId).get();
  24.         UserDto userDto = mapToUser(user);
  25.         DepartmentDto departmentDto = webClient.get()
  26.                 .uri("http://localhost:8080/api/departments/" + user.getDepartmentId())
  27.                 .retrieve()
  28.                 .bodyToMono(DepartmentDto.class)
  29.                 .block();
  30.         responseDto.setUser(userDto);
  31.         responseDto.setDepartment(departmentDto);
  32.         return responseDto;
  33.     }
  34.     private UserDto mapToUser(User user){
  35.         UserDto userDto = new UserDto();
  36.         userDto.setId(user.getId());
  37.         userDto.setFirstName(user.getFirstName());
  38.         userDto.setLastName(user.getLastName());
  39.         userDto.setEmail(user.getEmail());
  40.         return userDto;
  41.     }
  42. }
复制代码
下面运行两个微服务并进行测试。
测试:启动两个微服务

首先启动部门服务项目,然后启动用户服务项目,一旦两个项目都启动并在不同的端口上运行。接下来,我们调用Get User REST API来测试user-service REST API 对Department-service 的调用。
获取用户 REST API:


请注意,响应结果包含了用户的部门。这说明我们已成功使用WebClient从用户服务到部门服务进行 REST API 调用。
结论

在本教程中,我们学习了 如何使用WebClient 在多个微服务之间进行 REST API 调用(同步通信)。
源码下载:
github
gitee

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

兜兜零元

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表