赞
踩
目录
1.不使用OpenFeign实现服务远程调用(RestTemplate)
当微服务架构日益普及,服务之间的远程调用变得至关重要。在这一背景下,OpenFeign作为一个强大的HTTP客户端框架简化了服务之间的远程通信。本文旨在介绍如何运用OpenFeign实现服务远程调用。
Spring Cloud OpenFeign是一个基于Spring Cloud的声明式REST客户端,旨在简化与HTTP服务的交互过程。它将REST客户端的定义转化为Java接口,并使用注解来声明请求参数、请求方式、请求头等信息,使得客户端的使用更加便捷和简洁。另外,它还提供了负载均衡和服务发现等功能,可与注册中心集成使用,是构建微服务架构的重要工具之一。
英文文档地址:
Spring Cloud OpenFeignhttps://spring.io/projects/spring-cloud-openfeign中文文档地址:
Spring Cloud OpenFeign 中文文档 (springdoc.cn)https://springdoc.cn/spring-cloud-openfeign/
基于RestTemplate实现的远程服务调用,代码可能较为复杂,但远程调用的关键核心主要集中在四个方面:请求方法、请求路径、请求参数、返回值类型。
- // 发现item-service服务的实例列表
- List<ServiceInstance> instances = discoveryClient.getInstances("item-service");
- // 负载均衡,挑选一个实例
- ServiceInstance instance = instances.get(RandomUtil.randomInt(instances.size()));
- // 发送请求,查询商品
- ResponseEntity<List<ItemDTO>> response = restTemplate.exchange(
- instance.getUri() + "/items?ids={ids}", // 请求路径
- HttpMethod.GET, // 请求方式
- null, // 请求实体
- new ParameterizedTypeReference<List<ItemDTO>>() {}, // 返回值类型
- Map.of("ids", CollUtil.join(itemIds, ",") // 请求参数
- );
OpenFeign则利用SpringMVC的相关注解来声明上述四个参数。通过动态代理,OpenFeign能够自动生成远程调用的代码,从而避免了手动编写,极大地提高了便利性。步骤如下:
在服务的pom.xml中引入OpenFeign的依赖和loadBalancer依赖:
- <!--openFeign-->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-openfeign</artifactId>
- </dependency>
- <!--负载均衡器-->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-loadbalancer</artifactId>
- </dependency>
通过@EnableFeignClients注解,启用OpenFeign功能:
- @EnableFeignClients
- @SpringBootApplication
- public class CartApplication {// ... }
- @FeignClient("item-service")
- public interface ItemClient {
-
- @GetMapping("/items")
- List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);
- }
这里只需要声明接口,无需实现方法。接口中的几个关键信息如下:
@FeignClient("item-service") | 声明服务名称 |
@GetMapping | 声明请求方式 |
@GetMapping("/items") | 声明请求路径 |
@RequestParam("ids") Collection<Long> ids | 声明请求参数 |
List<ItemDTO> | 声明返回值类型 |
OpenFeign可以利用动态代理实现这个方法,并且向 http://item-service/items 发送一个GET请求,携带 ids 为请求参数,并自动将返回值处理为 List<ItemDTO> 类型。
最终在 cart-service 中进行代码改造,通过直接调用 ItemClient 的方法,OpenFeign 将完成服务的拉取、负载均衡和HTTP请求发送等所有工作:
List<ItemDTO> items = itemClient.queryItemByIds(List.of(1,2,3));
本文主要介绍了如何运用OpenFeign实现服务远程调用,希望对大家有所帮助。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。