SpringCloud --服务调用Feign
介绍
服务间通信简介
一个系统可以由不同的微服务构成,比如一个电商系统可以由订单服务、商品服务、用户服务等共同组成。 这些服务相互独立,但又相互依赖。由于它们相互依赖,所以需要通过通信的方式来进行相互调用。
服务间通信方式主要有两种:
(1) 基于HTTP的REST(SpringCloud)
(2) RPC(Dubbo)
SpringCloud服务间调用方式有两种:
(1) RestTemplate
(2) FeignClient
这两种方式都是通过REST接口调用服务的http接口
SpringCloud搭建各种微服务之后,服务间通常存在相互调用的需求,SpringCloud提供了@FeignClient 注解非常优雅的解决了这个问题,Feign的中文名称翻译过来是伪装。
实战中使用Feign进行服务间通信
1. 增加依赖(WKD项目中使用)
1 <dependency>
2 <groupId>org.springframework.cloud</groupId>
3 <artifactId>spring-cloud-starter-openfeign</artifactId>
4 </dependency>
说明:依赖有分feign和openfeign
(1) Feign本身不支持Spring MVC的注解,它有一套自己的注解;
(2) Spring Cloud OpenFeign是在Feign的基础上扩展了对Spring MVC注解的支持,如@RequesMapping等等,同时还整合了Ribbon和Eureka来提供均衡负载的HTTP客户端实现。
2、增加注解@EnableFeignClients
(1) 在Application启动类上增加注解@EnableFeignClients

(2)写在一个专门的配置文件中

说明:FeignClinentConfig 外部Restful接口引入:
如果Feignclien是外部包引入的,可能需要指定扫描路径,在注解@EnableFeignClients中指定
@EnableFeignClients(/*basePackages={"package.contains.fegin.clients"}*/)手写的Feigclient 在 .assemble.fegin 中通过组件@FeignClient 引入,就是说你需要加上你可能要调用中心的API的包路径,好比你的找个配置文件在库存中心inventory,你可能要调用到基础数据中心data,那你得加上扫描路径(类似com.xxx.center.data.api)。
3、新建一个feign接口

参数说明:
name:指定FeignClient的名称(微服务的名称),name属性会作为微服务的名称,用于服务发现(如果使用Nacos实现服务注册发现,name与服务的名称一致,使用eureka也一样);
url: url一般用于调试,可以手动指定@FeignClient调用的地址;
path: 定义当前FeignClient所有方法的requestMapping的统一前缀,,类似与controller类上的requestMapping;
4、调用feign
假如应用中心stock调用库存中心inventory,实现类中注入inventory中心的Api接口,直接调用。
1 @Service
2 public class BandServiceImpl implements IBandService {
3
4 @Resource
5 private IBandQueryApi bandQueryApi;
6
7 ......
8
9 @Override
10 public RestResponse<BandRespDto> queryBandById(Long id) {
11 //调用库存中心
12 return bandQueryApi.queryBandById(id);
13 }
14 }
FeignClient原理简述
(1)当程序启动时,会进行包扫描,扫描所有包下有@FeignClient注解的类,并将这些类注入到Spring IOC容器中。
(2)当定义的Feign接口中的方法被调用时,Feign通过JDK的动态代理为每个接口方法创建一个RequestTemplate对象。这个RequestTemplate对象中包含请求的所有信息,如请求参数,请求URL等。
(3)然后RequestTemplate生成Request,将Request交给Client处理,这个Client默认是JDK的HTTPUrlConnection,也可以是OKhttp、Apache的HTTPClient等。
(4)最后Client被封装成LoadBaLanceClient类,这个类结合Ribbon负载均衡发起服务之间的调用。
参考/好文
Spring Cloud中的服务间通信(RestTemplate和Feign)
https://blog.csdn.net/zhaohongfei_358/article/details/83148623
Feign的工作原理
https://juejin.im/post/5ccbe82851882544da5008ce
SpringCloud --服务调用Feign的更多相关文章
- SpringCloud 源码系列(6)—— 声明式服务调用 Feign
SpringCloud 源码系列(1)-- 注册中心 Eureka(上) SpringCloud 源码系列(2)-- 注册中心 Eureka(中) SpringCloud 源码系列(3)-- 注册中心 ...
- SpringCloud之声明式服务调用 Feign(三)
一 Feign简介 Feign是一种声明式.模板化的HTTP客户端,也是netflix公司组件.使用feign可以在远程调用另外服务的API,如果调用本地API一样.我们知道,阿里巴巴的doubbo采 ...
- SpringCloud开发学习总结(七)—— 声明式服务调用Feign(一)
在实践的过程中,我们会发现在微服务架构中实现客户端负载均衡的服务调用技术Spring Cloud Ribbon<SpringCloud开发学习总结(四)—— 客户端负载均衡Ribbon> ...
- springCloud中的服务调用feign
springCloud中的服务调用(要在调用端写) 前提进行了服务注册 流程: 1.在服务模块中添加依赖 <!--服务调用--> <dependency> <groupI ...
- 四、springcloud之服务调用Feign(二)
一.Fegin的常见应用 Feign的Encoder.Decoder和ErrorDecoder Feign将方法签名中方法参数对象序列化为请求参数放到HTTP请求中的过程,是由编码器(Encoder) ...
- 【Dalston】【第三章】声明式服务调用(Feign)
当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率低下,并且显得好傻.那 ...
- 客户端负载均衡Feign之一:申明式服务调用Feign入门示例
Spring Cloud提供了Ribbon和Feign作为客户端的负载均衡. 前面使用了Ribbon做客户端负载均衡,使用Hystrix做容错保护,这两者被作为基础工具类框架被广泛地应用在各个微服务的 ...
- SpringCloud服务调用源码解析汇总
相信我,你会收藏这篇文章的,本篇文章涉及Ribbon.Hystrix.Feign三个组件的源码解析 Ribbon架构剖析 这篇文章介绍了Ribbon的基础架构,也就是下图涉及到的6大组件: Ribbo ...
- Spring Cloud 声明式服务调用 Feign
一.简介 在上一篇中,我们介绍注册中心Eureka,但是没有服务注册和服务调用,服务注册和服务调用本来应该在上一章就应该给出例子的,但是我觉得还是和Feign一起讲比较好,因为在实际项目中,都是使用声 ...
随机推荐
- 《Machine Learning in Action》—— Taoye给你讲讲Logistic回归是咋回事
在手撕机器学习系列文章的上一篇,我们详细讲解了线性回归的问题,并且最后通过梯度下降算法拟合了一条直线,从而使得这条直线尽可能的切合数据样本集,已到达模型损失值最小的目的. 在本篇文章中,我们主要是手撕 ...
- Fiddle抓包应用概述
抓包: 抓包(packet capture)就是将网络传输发送与接收的数据包进行截获.重发.编辑.转存等操作,也用来检查网络安全.抓包也经常被用来进行数据截取等.说简单点就是抓取前端发送给服务器的数据 ...
- linux进程管理(linux命令安装、进程生命周期、进程状态)
1 linux下如何杀掉进程 1)找到包名所占用的端口: ps aux | grep cbs_portal-1.0.1.jar(包名) 2)杀掉进程: kill 10942(端口号) PS: //-- ...
- 基于gin的golang web开发:服务间调用
微服务开发中服务间调用的主流方式有两种HTTP.RPC,HTTP相对来说比较简单.本文将使用 Resty 包来实现基于HTTP的微服务调用. Resty简介 Resty 是一个简单的HTTP和REST ...
- 利用神经网络算法的C#手写数字识别(二)
利用神经网络算法的C#手写数字识别(二) 本篇主要内容: 让项目编译通过,并能打开图片进行识别. 1. 从上一篇<利用神经网络算法的C#手写数字识别>中的源码地址下载源码与资源, ...
- html标签学习1
html:超文本标记语言 超文本标记语言的结构包括"头"部分(英语:Head).和"主体"部分(英语:Body),其中"头"部提供关于网页的 ...
- 数据结构与算法——图(游戏中的自动寻路-A*算法)
在复杂的 3D 游戏环境中如何能使非玩家控制角色准确实现自动寻路功能成为了 3D 游戏开 发技术中一大研究热点.其中 A*算法得到了大量的运用,A*算法较之传统的路径规划算法,实时性更高.灵活性更强, ...
- jmeter__问题记录,中文乱码问题(json参数化)
这种情况在jmeter3.0的版本中才会产生,注意:这不是乱码,而是由于3.0中优化body data后,使用默认的字体(Consolas)不支持汉字的显示.这样的情况可以这样调整:进入jmeter. ...
- 【C#】DockPanelSuite 中 DockState.Document 状态下子窗体控件不显示的解决方案
DockPanelSuite 是 Winform 中优秀的布局控件,但是这次使用过程中却出了个问题. 我遇到的问题是这样的,主窗体是通过 ShowDialog 显示的,子窗体的停靠状态为 DockSt ...
- Kubernetes【K8S】(五):Service
Service概念 Kubernetes Service定义了一个Pod的逻辑分组,一种可以访问它们的策略.这组Pod能被Service访问到,通常是通过label Selector. Service ...