使用OpenFeign实现服务远程调用

前言

当微服务架构日益普及,服务之间的远程调用变得至关重要。在这一背景下,OpenFeign作为一个强大的HTTP客户端框架简化了服务之间的远程通信。本文旨在介绍如何运用OpenFeign实现服务远程调用。


一、OpenFeign介绍

Spring Cloud OpenFeign是一个基于Spring Cloud的声明式REST客户端,旨在简化与HTTP服务的交互过程。它将REST客户端的定义转化为Java接口,并使用注解来声明请求参数、请求方式、请求头等信息,使得客户端的使用更加便捷和简洁。另外,它还提供了负载均衡和服务发现等功能,可与注册中心集成使用,是构建微服务架构的重要工具之一。

英文文档地址:

Spring Cloud OpenFeign

中文文档地址:

Spring Cloud OpenFeign 中文文档 (springdoc.cn)

二、OpenFeign作用

  • 简化HTTP客户端的编写:使用Feign接口和注解,开发者可以更加便捷地定义HTTP请求,无需手动编写HTTP请求代码,从而减少代码量,提高开发效率。
  • 统一配置:OpenFeign支持在应用程序启动时加载配置文件,实现了统一配置,方便了配置的管理和维护,降低了配置管理的复杂度。
  • 支持多种HTTP客户端:OpenFeign支持多种HTTP客户端,如OkHttp、HttpClient等,可以根据实际需求选择合适的HTTP客户端。
  • 支持负载均衡:OpenFeign内置了负载均衡机制,可以自动实现请求的负载均衡,提高了系统的性能和可伸缩性。

三、OpenFeign使用示例

1.不使用OpenFeign实现服务远程调用(RestTemplate)

基于RestTemplate 实现的远程服务调用,代码可能较为复杂,但远程调用的关键核心主要集中在四个方面:请求方法请求路径请求参数返回值类型

less 复制代码
// 发现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, ",") // 请求参数
);

2.使用OpenFeign实现服务远程调用

OpenFeign则利用SpringMVC的相关注解来声明上述四个参数。通过动态代理,OpenFeign能够自动生成远程调用的代码,从而避免了手动编写,极大地提高了便利性。步骤如下:

(1) 引入依赖

在服务的pom.xml中引入OpenFeign的依赖和loadBalancer依赖:

xml 复制代码
  <!--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>

(2) 启用OpenFeign

通过 @EnableFeignClients注解,启用OpenFeign功能:

less 复制代码
@EnableFeignClients
@SpringBootApplication
public class CartApplication {// ...  }

(3) 编写OpenFeign客户端

less 复制代码
@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 ids 声明请求参数
List 声明返回值类型

OpenFeign 可以利用动态代理 实现这个方法,并且向 http://item-service/items 发送一个GET请求,携带 ids 为请求参数,并自动将返回值处理为 List 类型。

(4) 使用FeignClient

最终在 cart-service 中进行代码改造,通过直接调用 ItemClient 的方法,OpenFeign 将完成服务的拉取、负载均衡和HTTP请求发送等所有工作:

ini 复制代码
List<ItemDTO> items = itemClient.queryItemByIds(List.of(1,2,3));

总结

本文主要介绍了如何运用OpenFeign实现服务远程调用,希望对大家有所帮助。

相关推荐
MrWho不迷糊6 分钟前
企业级权限系统怎么设计四 —— ABAC模型统一功能权限与数据权限
后端·微服务
落尘29828 分钟前
Spring MVC——传递参数的方式
后端
ITCharge43 分钟前
Docker 万字教程:从入门到掌握
后端·docker·容器
落尘2981 小时前
Bean 的作用域和生命周期
后端
是店小二呀1 小时前
处理Linux下磁盘空间不足问题的实用指南
后端
落尘2981 小时前
如何通过 JWT 来解决登录认证问题
后端
是店小二呀1 小时前
处理Linux下内存泄漏问题的诊断与解决方法
后端
倚栏听风雨1 小时前
IDEA 插件开发 对文件夹下的类进行 语法检查
后端
郝同学的测开笔记1 小时前
云原生探索系列(十七):Go 语言sync.Cond
后端·云原生·go
uhakadotcom1 小时前
持续写作的“农耕思维”:如何像农民一样播种,收获稳定成长与收入
后端·面试·github