使用WebClient的Spring Boot微服务通信示例

x33g5p2x  于2022-10-12 转载在 Spring  
字(3.2k)|赞(0)|评价(0)|浏览(1256)

在前面的教程中,我们已经看到了使用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调用,以获取特定的用户部门。

步骤1:添加Spring WebFlux依赖项

打开user-service项目的pom.xml文件并添加以下依赖项:

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-webflux</artifactId>
		</dependency>

步骤2:将WebClient配置为SpringBean

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();
    }

步骤3:注入并使用WebClient调用REST API

让我们注入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-serviceuser-service REST API调用。

获取用户REST API:

请注意,响应中包含一个用户部门。这表明我们已成功使用WebClientuser-service调用到department-service

结论

在本教程中,我们学习了如何使用e1d21d1在多个微服务之间进行REST API调用(同步通信)。

相关文章