使用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.mzph.cn/news/453.shtml

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

相关文章

opencv 基础学习08-图像通道操作

opencv 基础学习08-图像通道操作 什么是图像通道&#xff1f;通道操作&#xff1a;**1 通过索引拆分**2 通过opencv 函数拆分通道合并 什么是图像通道&#xff1f; OpenCV的通道拆分功能可用于将多通道图像拆分成单独的通道&#xff0c;这在图像处理和计算机视觉任务中具有许多…

你的隐私被泄漏了吗

近日&#xff0c;某高校毕业生在校期间窃取学校内网数据&#xff0c;收集全校学生个人隐私信息的新闻引发了人们对互联网生活中个人信息安全问题的再度关注。在大数据时代&#xff0c;算法分发带来了隐私侵犯&#xff0c;在享受消费生活等便捷权利的同时&#xff0c;似乎又有不…

【Vue3】setup参数细讲!computed计算属性和watch监听属性

setup参数细讲&#xff01;computed计算属性和watch监听属性 setup细讲!setup参数&#xff0c;steup&#xff08;props&#xff0c;context&#xff09;参数1.props&#xff0c;负责接收父组件传过来的值参数2.contextcontext.attrscontext.emitcontext.slots&#xff0c; 插槽…

.Net Core Restful Api 版本区分第一种

前言&#xff1a;在我们进行Web Api开发时&#xff0c;版本的区分&#xff0c;是必须要考虑的&#xff0c;涉及到我们的版本发布&#xff0c;切换等&#xff0c;如何从旧版本无缝的切换到新版本&#xff1f; 下面&#xff0c;我们通过使用[ApiVersion]特性&#xff0c;实现两个…

Spring MVC 系列1 -- 初识Spring MVC

目录 1. 什么是 Spring MVC&#xff1f; 2. MVC定义 3. 创建SpringMVC项目 ​4. Spring MVC要学习哪些? 1. 什么是 Spring MVC&#xff1f; 官⽅对于 Spring MVC 的描述是这样的&#xff1a; 翻译成中文 从上述定义我们可以得出两个关键信息&#xff1a; 1. Spring MVC 是…

conda疑难杂症

annaconda、miniconda和conda的关系 conda官网 https://docs.conda.io/projects/conda/en/latest/ 下载安装Anaconda: https://www.anaconda.com/products/distribution#Downloads 下载安装Miniconda&#xff1a;https://docs.conda.io/en/latest/miniconda.html 安装 安装…

7月6日华为云盘古气象大模型登上《Nature》杂志:相比传统数值预报快10000倍

7月6日&#xff0c;国际顶级学术期刊《自然》&#xff08;Nature&#xff09;杂志正刊发表了华为云盘古大模型研发团队的最新研究成果——《三维神经网络用于精准中期全球天气预报》&#xff08;《Accurate medium-range global weather forecasting with 3D neural networks》…

C/C++实现高并发http服务器

http高并发服务器实现 基础知识 html&#xff0c;全称为html markup language&#xff0c;超文本标记语言。 http&#xff0c;全称hyper text transfer protocol&#xff0c;超文本传输协议。用于从万维网&#xff08;WWW&#xff1a;World Wide Web&#xff09;服务器传输超…

win10远程桌面控制Ubuntu服务器 - 内网穿透实现公网远程

文章目录 前言视频教程1. ubuntu安装XRDP2.局域网测试连接3. Ubuntu安装cpolar内网穿透4.cpolar公网地址测试访问5.固定域名公网地址 转载自cpolar极点云文章&#xff1a;树莓派使用Nginx 搭建轻量级网站远程访问 前言 XRDP是一种开源工具&#xff0c;它允许用户通过Windows R…

【已解决】Flask项目报错TypeError: tuple indices must be integers or slices, not str

文章目录 问题情境报错及分析报错代码分析 解决方案必要的解决方法可能有用的解决方法 问题情境 本解决方案适用情境&#xff1a;在本地可以正常运行的flask项目&#xff0c;放到云服务器报错TypeError: tuple indices must be integers or slices, not str&#xff0c;即代码…

Tomcat之配置文件详解

Tomcat 目录 安装好 Tomcat 后&#xff0c;打开它的文件夹&#xff0c;可以看到以下目录 bin:存放各种启动、关闭和其它程序的脚本 conf:配置文件及相关数据文件存放的目录 lib:Tomcat 使用的库文件存放的目录&#xff0c;如存放 Servlet 规范的 API logs:默认日志文件存放…

《生活教育》期刊简介及投稿邮箱

《生活教育》期刊简介及投稿邮箱 《生活教育》杂志创办于1934&#xff0c;是中华人民共和国教育部主管的国家重点学术期刊&#xff0c;国家级期刊&#xff0c;中国知网全文收录G4期刊&#xff0c;它的理论是陶行知教育思想的主线和重要基石&#xff0c;陶行知的教育理论&#…

基于单片机的老人防摔倒的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;通过LCD1602液晶显示屏显示当前的经纬度及时间的信息&#xff1b;温度传感器采集当前体温&#xff1b;通过GPS接收模块获得当前位置的位置的经度、纬度、时间和高度等信息&#xff1b;通过ADXL345检测老人摔倒的一瞬间重力加速度通…

面试题更新之-vue2x监听方面有什么缺点?所以才有了vue3.0

文章目录 vue2x监听vue3.0监听vue2x监听方面有什么缺点&#xff1f;所以才有了vue3.0 vue2x监听 在Vue.js 2.x中&#xff0c;你可以通过监听属性来响应数据的变化。以下是几种常见的监听方式&#xff1a; 监听计算属性&#xff1a;你可以使用computed属性来创建一个计算属性&…

排序算法第二辑——选择排序

一&#xff0c;选择排序 选择排序算是简单排序中的渣渣&#xff0c;这种算法基本上是没有什么用处的。但是作为一个初学者&#xff0c;我又必须要会写这种算法。这种算法的实现实现思想和它的名字一样&#xff0c;就是在一个范围内选择最大或者最小的数据然后再交换数据实现排序…

Maynor的博客专家成长之路——暨2023年中复盘

文章目录 博客专家成长之路——暨2023年中复盘前言念念不忘的博客专家每天只做三件事敲代码写博客健健身 我的感悟 不足之处未来&#xff1a;和CSDN共同成长最后 博客专家成长之路——暨2023年中复盘 前言 ​ 2023年不知不觉已经过去了半年有余&#xff0c;也是时候作年中复盘…

10.25UEC++/小试牛刀(笨鸟先飞案例)

1.思路整理&#xff1a; 如何入手&#xff1f; 角色可能是每个游戏的最重要的部分&#xff0c;所以一般可以先从角色入手&#xff0c;如果游戏很复杂&#xff0c;可以进行拆分设计。 蓝图创建地图&#xff1a; 创建默认Pawn&#xff1a; 编写GameMode默认构造函数&#xff1a;…

Springboot整合Activiti详解

文章目录 版本依赖配置文件需要注意的问题画流程图activiti服务类进行编写流程部署流程定义启动流程流程实例 测试流程启动流程完成任务受理任务 版本依赖 开发工具 IDEASpringBoot 2.4.5&#xff08;这里我试过SpringBoot 3.1.1版本&#xff0c;Activiti没有启动&#xff0c;…

Nginx-负载均衡

文章目录 nginx 负载均衡负载均衡策略&#xff08;方法、算法&#xff09;nginx配置round-robin加权轮询least-connectedip-hasp使用Https realip后端real server不使用realip模块后端real server使用realip模块 ab压力测试不同负载四层负载 7层负载4层和7层 nginx 负载均衡 负…

银河麒麟系统无法进入桌面拷贝备份文件

最近使用VMWare搭建银河麒麟系统升级后&#xff0c;无法进入桌面&#xff0c;而是进入tty1界面 这个时候如何想导出里面的文件就可以用文件共享的方式右键到虚拟机设置-选项&#xff0c;如图所示 选择一个共享目录 如d盘vm目录 登录tty1账号密码 ls列出文件 如图进行文件拷贝…