paint-brush
HTTP 客户端和 Spring Boot 微服务的基本指南经过@aksenov
13,174 讀數
13,174 讀數

HTTP 客户端和 Spring Boot 微服务的基本指南

经过 Viacheslav Aksenov6m2023/03/03
Read on Terminal Reader

太長; 讀書

Spring Boot 提供了几个用于实现同步 HTTP 客户端的选项,包括`RestTemplate`、`WebClient`。我们还将讨论 Feign 库。
featured image - HTTP 客户端和 Spring Boot 微服务的基本指南
Viacheslav Aksenov HackerNoon profile picture
0-item

你好!我叫 Viacheslav Aksenov,我是一名后端开发人员,专门用 Java 和 Kotlin 开发复杂的后端系统。此外,我还有许多小宠物项目,您可以在我的 GitHub 上找到它们:https: //github.com/v-aksenov

什么是微服务?

微服务是一种小型的独立服务,旨在在较大的应用程序中执行特定任务或一组任务。每个微服务都独立于系统中的其他微服务进行开发和部署,并通过API与其他微服务进行通信。


微服务还提供了其他一些好处,包括改进的可扩展性、更好的容错能力和更高的敏捷性。通过将应用程序分解为更小、更独立的服务,开发人员可以根据需要轻松扩展或缩减单个组件,并可以快速响应用户需求或市场条件的变化。


然而,微服务也带来了一些挑战,例如需要强大的 API 管理、服务发现和分布式跟踪。正确设计和实施微服务需要整个开发团队的仔细规划和协调,以及对正在开发的系统的独特要求和约束的深刻理解。


微服务什么时候需要 HTTP 客户端?

要回答这个问题,我们需要回答“当前服务负责什么?”这个问题。


在服务业务逻辑中,经常会出现需要从第三方 API 获取响应的情况。或者,我们有几个链式微服务来处理我们的业务流程。在这些情况下,我们必须在我们的微服务中实现 HTTP 客户端。


在微服务架构中,HTTP 客户端是通过 HTTP 协议与其他微服务通信的软件组件。 HTTP 客户端负责向其他微服务发出请求并接收返回的响应。


当一个微服务需要与另一个微服务通信时,它通常会向另一个微服务的适当端点发送 HTTP 请求。 HTTP 请求可能包括数据的有效负载,例如 JSON 对象或 XML 文档,接收微服务可以使用它来执行其任务。


如何在 Spring Boot 微服务中实现 HTTP 客户端?


您可以选择多种方式在 Spring Boot 服务中实现 HTTP 客户端。首先你需要选择——它是同步客户端还是异步客户端?


例如,如果您有同步架构,您可以选择 Spring Boot 提供的解决方案之一。


在 Spring Boot 中,同步 HTTP 客户端是一个组件,用于向其他服务或端点发出 HTTP 请求,并阻塞当前线程,直到收到响应。 Spring Boot 提供了几个用于实现同步 HTTP 客户端的选项,包括RestTemplateWebClient类。


RestTemplate是在 Spring Boot 中实现同步 HTTP 客户端的流行选择。它为发出 HTTP 请求和处理响应提供了一个简单直观的 API,并支持广泛的 HTTP 方法、请求和响应类型以及消息转换器。要使用RestTemplate ,您需要在您的应用程序上下文中将它配置为一个 bean,然后通过调用它的各种方法使用它来发出 HTTP 请求。


有一个使用 RestTemplate 用于 POST HTTP 请求的例子:


 public RegisterResponse registerUser(UserDto userDto) { HttpEntity<UserDto> requestEntity = new HttpEntity<>(user, headers); ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, requestEntity, RegisterResponse.class); if (responseEntity.getStatusCode() == HttpStatus.OK) { RegisterResponse response = responseEntity.getBody(); // handle the response } else { // handle the error } }


在 Spring Boot 中实现同步 HTTP 客户端的另一种选择是使用WebClient类。 WebClient是一个响应式 HTTP 客户端,它提供了一个非阻塞 API 来发出 HTTP 请求和处理响应,并且非常适合需要高水平并发性或可伸缩性的应用程序。要使用WebClient ,您需要在您的应用程序上下文中将其配置为一个 bean,然后通过调用其各种方法使用它来发出 HTTP 请求。


 public RegisterResponse registerUser(UserDto userDto) { Mono<String> responseMono = webClient.post() .uri(endpointPath) .contentType(MediaType.APPLICATION_JSON) .body(Mono.just(user), UserDto.class) .retrieve() .bodyToMono(RegisterResponse.class); responseMono.subscribe(response -> { // handle the response }, error -> { // handle the error }); }


请务必注意,使用同步 HTTP 客户端可能会阻塞当前线程,这会对应用程序的整体性能和可伸缩性产生负面影响。因此,建议尽可能使用异步 HTTP 客户端,例如具有反应式编程的WebClient ,以提高应用程序响应能力和资源利用率。


使用 RestTemplate 和 WebClient 时有几个缺点:

  • 你需要写很多样板逻辑来处理积极和消极的场景
  • 您需要手动配置每个客户端
  • 常规 GET/POST HTTP 请求的方法具有复杂的语义,您需要记住它


如何让它更简单?

简短的回答——你可以使用 Feign 库。它是什么?


Feign 是一个 Java 库,可以让开发者轻松创建 HTTP 客户端,专为构建 RESTful 微服务而设计。它提供了一种声明式的方式来定义可以从您的代码中调用的 HTTP API,就好像它们是本地方法调用一样,从而使使用 API 和使用不同微服务的资源变得更加容易。


使用 Feign,您可以轻松创建接口,为您的 RESTful 端点定义 HTTP 方法、请求参数和响应类型。然后,Feign 负责剩下的工作,包括请求和响应的序列化和反序列化、URL 编码、错误处理和连接管理。


以下是使用 Feign 进行用户注册的 POST 请求示例:

 // Client describes as interface with configuration: @FeignClient(name = "exampleRegisterClient") public interface RegisterClient { @PostMapping("/register") RegisterResponse registerUser(@RequestBody UserDto user); } // Bean creation in Spring configuration: @Bean public RegisterClient registerUserApi() { return Feign.builder().target(RegisterClient.class, "https://localhost:9090/api); }


Feign 提供了一种简单且声明式的方式来与 HTTP API 进行交互,使开发人员可以专注于其微服务的业务逻辑,而不是发出 HTTP 请求的细节。


结论。

总之,Spring Boot 为在微服务中实现 HTTP 客户端提供了多种选择,包括 RestTemplate、WebClient 和 Feign。 RestTemplate 是一个简单且广泛使用的客户端,它提供同步 HTTP 通信。 WebClient 是一种更现代和响应式的替代方案,它提供与函数式 API 的非阻塞 HTTP 通信。 Feign 是一个声明式和类型安全的客户端,它根据 API 定义生成代码,为 RESTful 微服务提供一个易于使用的接口。


在选择要使用的 HTTP 客户端时,重要的是要考虑微服务的要求,例如性能、可伸缩性和易用性。 RestTemplate 是需要同步通信的简单用例的不错选择。 WebClient 是需要高性能和可扩展性的反应式和非阻塞用例的不错选择。对于需要简化 API 和改善开发人员体验的声明性和类型安全用例,Feign 是一个不错的选择。


无论您选择哪种 HTTP 客户端,编写集成测试以确保您的微服务在与外部服务交互时行为正确是很重要的。通过测试您的 HTTP 客户端,您可以确保您的微服务在不同情况下如预期行为,例如网络故障或来自外部服务的意外响应。


您可以在我的 GitHub 上找到我实现不同方式编写 HTTP 客户端的示例:https: //github.com/v-aksenov

ThisisEngineering RAEngUnsplash上拍摄的照片