在前面的教程中,我们已经看到了使用RestTemplate的SpringBoot Microservices通信示例。
从5.0开始,RestTemplate
类处于维护模式,不久将被弃用。因此,Spring团队建议使用org.springframework.web.reactive.client.WebClient
that具有现代API,并支持同步、异步和流式场景。
在本教程中,我们将学习如何使用e1d2d1在多个微服务之间进行REST API调用(同步通信)。WebClient
是一个执行HTTP请求的非阻塞、React式客户端,在底层HTTP客户端库(如Reactor Netty)上公开流畅、React式API。
要在Spring引导项目中使用WebClient
,我们必须向类路径添加Spring WebFlux
依赖项。
我们将创建两个微服务,例如部门服务和用户服务,并使用WebClient
从用户服务到部门服务进行REST API调用,以获取特定的用户部门。
打开user-service
项目的pom.xml
文件并添加以下依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
package net.javaguides.userservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.reactive.function.client.WebClient;
@SpringBootApplication
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
@Bean
public WebClient webClient(){
return WebClient.builder().build();
}
}
我们已经将WebClient
配置为Springbean:
@Bean
public WebClient webClient(){
return WebClient.builder().build();
}
让我们注入WebClient
并使用它进行REST API调用:
DepartmentDto departmentDto = webClient.get()
.uri("http://localhost:8080/api/departments/" + user.getDepartmentId())
.retrieve()
.bodyToMono(DepartmentDto.class)
.block();
以下是UserServiceImpl
类的完整代码,供您参考:
package net.javaguides.userservice.service.impl;
import lombok.AllArgsConstructor;
import net.javaguides.userservice.dto.DepartmentDto;
import net.javaguides.userservice.dto.ResponseDto;
import net.javaguides.userservice.dto.UserDto;
import net.javaguides.userservice.entity.User;
import net.javaguides.userservice.repository.UserRepository;
import net.javaguides.userservice.service.UserService;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
@Service
@AllArgsConstructor
public class UserServiceImpl implements UserService {
private UserRepository userRepository;
private RestTemplate restTemplate;
private WebClient webClient;
private APIClient apiClient;
@Override
public User saveUser(User user) {
return userRepository.save(user);
}
@Override
public ResponseDto getUser(Long userId) {
ResponseDto responseDto = new ResponseDto();
User user = userRepository.findById(userId).get();
UserDto userDto = mapToUser(user);
DepartmentDto departmentDto = webClient.get()
.uri("http://localhost:8080/api/departments/" + user.getDepartmentId())
.retrieve()
.bodyToMono(DepartmentDto.class)
.block();
responseDto.setUser(userDto);
responseDto.setDepartment(departmentDto);
return responseDto;
}
private UserDto mapToUser(User user){
UserDto userDto = new UserDto();
userDto.setId(user.getId());
userDto.setFirstName(user.getFirstName());
userDto.setLastName(user.getLastName());
userDto.setEmail(user.getEmail());
return userDto;
}
}
就这样。现在运行两个微服务,让我们测试一下。
首先,启动department-service
项目,然后启动一个user-service
工程。
一旦这两个项目都启动并在不同的端口上运行。接下来,让我们调用Get-User REST API来测试对department-service
的user-service
REST API调用。
请注意,响应中包含一个用户部门。这表明我们已成功使用WebClient
从user-service
调用到department-service
。
在本教程中,我们学习了如何使用e1d21d1在多个微服务之间进行REST API调用(同步通信)。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://www.javaguides.net/2022/10/spring-boot-microservices-communication-using-webclient.html
内容来源于网络,如有侵权,请联系作者删除!