使用Feign进行微服务之间的接口调用:Spring Cloud Alibaba中的声明式服务调用

一、Feign介绍

        Feign是一个声明式的HTTP客户端框架,用于简化微服务架构中服务之间的通信。它是Spring Cloud框架的一部分,旨在提供一种优雅且易于使用的方式来定义和调用HTTP请求。

        Feign的设计目标是让服务之间的通信变得更加简单和直观。通常情况下,在微服务架构中,一个服务需要调用另一个服务的API来获取数据或执行操作。使用传统的方式,我们需要手动编写HTTP请求、处理请求和响应等操作,而Feign的出现简化了这个过程。

        使用Feign,只需定义一个接口来描述要调用的服务的API,然后通过注解来配置请求和响应的处理方式。Feign会根据接口定义自动生成可用的HTTP请求,将请求发送到目标服务,并将响应转换为适当的对象类型返回。

Feign具有以下特性和优势:

  1. 声明式的API定义:通过简单地定义接口,可以清晰地描述服务之间的通信,而不必关注底层的HTTP细节。
  2. 内置负载均衡支持:Feign与Spring Cloud的服务注册和发现机制集成,可以自动实现负载均衡,轻松处理多个实例的服务调用。
  3. 请求和响应的自动序列化和反序列化:Feign可以自动处理请求和响应的序列化和反序列化,使您能够以面向对象的方式处理数据。
  4. 整合服务熔断和限流:Feign与Spring Cloud的熔断器(如Hystrix)和限流器(如Sentinel)集成,可以提供服务熔断和限流的能力,增加系统的稳定性和可靠性。
  5. 易于扩展:Feign提供了可插拔的机制,允许您通过自定义配置和拦截器等方式来扩展和定制其行为。

 二、Feign的使用

这里我以 pig 项目为例进行说明。项目地址:https://gitee.com/log4j/pig

1. 项目模块说明

pig
├── pig-auth -- 授权服务提供[3000]
└── pig-common -- 系统公共模块├── pig-common-bom -- 全局依赖管理控制├── pig-common-core -- 公共工具类核心包├── pig-common-datasource -- 动态数据源包├── pig-common-job -- xxl-job 封装├── pig-common-log -- 日志服务├── pig-common-mybatis -- mybatis 扩展封装├── pig-common-seata -- 分布式事务├── pig-common-security -- 安全工具类├── pig-common-swagger -- 接口文档├── pig-common-feign -- feign 扩展封装└── pig-common-xss -- xss 安全封装
├── pig-register -- Nacos Server[8848]
├── pig-gateway -- Spring Cloud Gateway网关[9999]
└── pig-upms -- 通用用户权限管理模块└── pig-upms-api -- 通用用户权限管理系统公共api模块└── pig-upms-biz -- 通用用户权限管理系统业务处理模块[4000]
└── pig-visual└── pig-monitor -- 服务监控 [5001]├── pig-codegen -- 图形化代码生成 [5002]├── pig-sentinel-dashboard -- 流量高可用 [5003]└── pig-xxl-job-admin -- 分布式定时任务管理台 [5004]

 2. Feign客户端定义

(1)引入Feign依赖

在pig-upms-api模块和pig-upms-biz模块都需要引入feign依赖:

        <!--feign 注解依赖--><dependency><groupId>com.pig4cloud</groupId><artifactId>pig-common-feign</artifactId><optional>true</optional></dependency>

(2)定义位置

        在代码中可以看到,Feign的客户端定义在了 pig-upms-api 模块中。将Feign的客户端定义在pig-upms-api模块下是一种常见的设计模式。这种模式的目的是将Feign的客户端接口定义为API模块的一部分,使得其他模块可以通过引入pig-upms-api依赖来使用该API,并通过Feign实现与pig-upms-biz模块(通用用户权限管理系统的业务处理模块)之间的通信。

 (3)Feign客户端定义

RemoteUserService为例:

//标识这是一个Feign客户端接口,contextId指定客户端的id,用于和其他客户端区分
//value="pig-upms-biz" 指定了要调用的服务名称
@FeignClient(contextId = "remoteUserService", value = ServiceNameConstants.UMPS_SERVICE)
public interface RemoteUserService {//通过用户名查询用户、角色信息//@GetMapping注解指定了要调用的HTTP GET请求的路径。这里是 /user/info/{username}//headers指定了请求的头部信息,这里HEADER_FROM_IN的值是"from=Y"@GetMapping(value = "/user/info/{username}", headers = SecurityConstants.HEADER_FROM_IN)R<UserInfo> info(@PathVariable("username") String username);//通过手机号码查询用户、角色信息@GetMapping(value = "/app/info/{phone}", headers = SecurityConstants.HEADER_FROM_IN)R<UserInfo> infoByMobile(@PathVariable("phone") String phone);//根据部门id,查询对应的用户 id 集合@GetMapping(value = "/user/ids", headers = SecurityConstants.HEADER_FROM_IN)R<List<Long>> listUserIdByDeptIds(@RequestParam("deptIds") Set<Long> deptIds);}

实际上这个Feign客户端会发送请求到SysUserController

 (4)在其他模块测试

比如说,我想要在 pig-codegen 模块下使用 Feign 进行接口调用,需要先在 codegen 模块引入 pig-upms-api 的依赖,因为我们将Feign的客户端定义在了pig-upms-api下。

        <!--upms api、model 模块--><dependency><groupId>com.pig4cloud</groupId><artifactId>pig-upms-api</artifactId></dependency>

编写一个测试Controller:

@RestController
@RequiredArgsConstructor  //自动生成构造方法,在生成FeignDemoController会将remoteUserService传入
@RequestMapping("/feignDemo")
public class FeignDemoController {//注入Feign客户端接口 RemoteUserService//定义为final 确保在实例化后变量不会发生意外改变private final RemoteUserService remoteUserService;@Inner(value = false)@GetMapping("/test")public R<UserInfo> test() {//假设传入的用户名是 adminString username = "admin";//调用feign中的info方法return remoteUserService.info(username);}
}

启动服务测试,可以看到成功获取到了admin用户的信息:

补充:关于在两种注入方式的理解:

在注入remoteUserService属性时,可以使用@RequiredArgsConstructor注解或@Autowired注解两种方式。这两种方式有以下区别:

  1. @RequiredArgsConstructor: 当在类上使用@RequiredArgsConstructor注解时,它会自动为您生成一个构造方法,该构造方法会将remoteUserService作为参数传入并进行注入。这种方式是通过构造函数注入依赖。使用@RequiredArgsConstructor注解可以简化代码,减少手动编写构造方法的工作。

  2. @Autowired: 当在属性上使用@Autowired注解时,它会自动将相应类型的实例注入到该属性中。这种方式是通过字段注入依赖。Spring框架会自动扫描并查找与RemoteUserService类型匹配的实例,并将其注入到remoteUserService属性中。使用@Autowired注解可以方便地进行依赖注入,但需要确保所需的实例存在且唯一。

总体而言,这两种注入方式的效果是一样的,都会将RemoteUserService注入到remoteUserService属性中。选择使用哪种方式取决于偏好和项目中的约定。使用@RequiredArgsConstructor可以提供更简洁的代码,而使用@Autowired则更加灵活,可以适应更多不同的场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/18463.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构中队列的操作方式,一目了然

队列的概念 首先我们联想一下链表&#xff0c;在单链表中&#xff0c;我们只能对他的链表表尾进行插入&#xff0c;对链表的表头进行结点的删除&#xff0c;这样强限制性的链表&#xff0c;就是我们所说的队列。 也就是说&#xff0c;队列&#xff08;queue&#xff09;是限定…

代码随想录算法训练营第十二天 | 二叉树系列3

二叉树系列3 二叉树 看到二叉树就想到递归404 左叶子之和重点代码随想录的代码我的代码(当日晚上自己理解后写) 513 找树左下角的值重点代码随想录的代码我的代码(当日晚上自己理解后写)我去&#xff0c;我怎么能写出这样的代码&#xff0c;没有return的递归&#xff0c;大错特…

在Visual Studio Code里导出8266固件

1.编辑 .vscode目录下 arduion.json 添加 一个配置项output即输出目录.当然你不设置其它软固件一样会生成,只是就不知道你能不能找到了.我的配置如下 当然这个路径你想写什么 就是什么 . 2. 切换到 arduion的项目文件 xxxx.ino.点击vsc右上的验证 即可在上面设置的目录下找到…

Java面试题大全(2023牛客网最新版)大厂面试题附答案详解

很多 Java 工程师的技术不错&#xff0c;但是一面试就头疼&#xff0c;10 次面试 9 次都是被刷&#xff0c;过的那次还是去了家不知名的小公司。 问题就在于&#xff1a;面试有技巧&#xff0c;而你不会把自己的能力表达给面试官。 应届生&#xff1a;你该如何准备简历&#…

IntegrityError: FOREIGN KEY constraint failed解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

阿里云AliYun物联网平台使用-申请免费试用及完成初始配置

一、项目简介 本专栏文章将围绕阿里云物联网平台&#xff0c;实现其设备向云平台的数据上传&#xff0c;客户端获取云平台数据。设备通过NBIOT技术实现无线采集&#xff0c;定时上传。 二、阿里云平台申请 阿里云物联网平台试用申请地址 进入上述超链接网址&#xff1a; 由于是…

This application failed to start?

大家好&#xff0c;最近在搞一个定制的图像分割项目&#xff0c;其中需要自己构建数据集。 这里我用到了基于paddle开发高效智能的交互式分割标注软件 EISeg(Efficient Interactive Segmentation)。 它涵盖了通用、人像、遥感、医疗、视频等不同方向的高质量交互式分割模型。另…

Linux安装配置Oracle+plsql安装配置(详细)

如果觉得本文不够详细&#xff0c;没有效果图&#xff0c;可移步详细版&#xff1a; Linux安装配置Oracleplsql安装配置&#xff08;超详细&#xff09;_超爱慢的博客-CSDN博客 目录 1.安装虚拟机系统 1.安装虚拟机 2.配置虚拟机 1.设置机器名 2.修改域名映射 3.固定IP…

JavaEE——常见的锁策略、CAS、synchronized 原理(八股)

文章目录 一、常见的锁策略1.乐观锁 & 悲观锁2.轻量级锁 & 重量级锁3.自旋锁 & 挂起等待锁4.互斥锁 & 读写锁5. 公平锁 & 非公平锁 二、CAS1、什么是 CAS2. CAS 的应用场景2.实现自旋锁3. CAS 中的 ABA 问题 三、 Synchronized 原理 一、常见的锁策略 当前…

MySQL数据库基础

目录 为什么使用数据库&#xff1f; 主流数据库 数据库基本使用 连接服务器 服务器管理 理解服务器、数据库、表的关系 使用示例 MySQL架构 MySQL架构分层 MySQL架构的主要组件&#xff1a; SQL分类 存储引擎 为什么使用数据库&#xff1f; 我们平时存储数据常用各…

简要介绍 | 融合深度学习与符号逻辑:神经符号结合的探索

注1&#xff1a;本文系“简要介绍”系列之一&#xff0c;仅从概念上对神经符号结合进行非常简要的介绍&#xff0c;不适合用于深入和详细的了解。 融合深度学习与符号逻辑&#xff1a;神经符号结合的探索 Neuro-Symbolic AI 本文将探讨神经符号结合的概念、原理、研究现状、挑战…

电脑应用程序发生异常怎么办?

有时候我们打开电脑上面的某个软件时&#xff0c;会打不开&#xff0c;并且会弹出如下的错误提示“应用程序发生异常 未知的软件异常&#xff08;&#xff58;&#xff58;&#xff58;&#xff09;&#xff0c;位置为&#xff58;&#xff58;”。相信大多数的人在使用电脑的时…