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一起讲比较好,因为在实际项目中,都是使用声 ...
随机推荐
- js内存泄漏的问题?
内存泄漏指任何对象在您不再拥有或需要它之后仍然存在. 垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量.如果一个对象的引用数量为 0(没有其他对象引用过该对象),或对该对象的惟一引用是循环 ...
- bootstrap 扩展参数
后台接受的参数形式 前端加载bootstrap时做的处理
- vertical-align什么时候使用?常用的值分别有什么作用?
设置元素的垂直对齐方式 常用的值: 1.baseline:默认.元素放置在父元素的基线上. 2.sub:垂直对齐文本的下标. 3.super:垂直对齐文本的上标 4.top:把元素的顶端与行中最高元素 ...
- Trie 练习记录
蒟蒻以前写的逊爆讲解 Trie CF665E Beautiful Subarrays 代码 把之前每个前缀和放进 trie 树里,然后 trie 树上查询即可. CF37C Old Berland L ...
- 本文帮你在 Unix 下玩转 C 语言
shell是一种特殊的应用程序(命令行解释器),他为运行其他应用程序提供了一个接口. posix规范了操作系统是什么样 每个进程都有一个工作目录(又叫当前目录),相对路径都是从工作目录开始解释. Ct ...
- Angular:使用前端proxy代理解决跨域问题
①在项目文件的根目录下新建文件proxy.config.json { "/": { "target": "http://127.0.0.1:3000& ...
- js基本数据类型--null和undefined的区别
1. null类型 只有一个值null,逻辑上表示一个空对象的指针,如果要定义一个变量来保存对象,最好将该变量初始化为null,比如let a="",而不要let b这样,其实nu ...
- Java File类的简单使用
Java File的简单使用(创建.删除.遍历.判断是否存在等) Java文件类以抽象的方式代表文件名和目录路径名.该类本身不能用来读数据或写数据,它主要用于磁盘上文件和目录的创建.文件的查找和文件的 ...
- Private jre vs Public jre
今天说一下java环境构建中,jre相关的小知识点. private jre:一般是C:\Program Files\jdk1.8.0\jre,必须安装,它为jdk的运行提供必需的环境. public ...
- 【震惊】padding-top的百分比值参考对象竟是父级元素的宽度
引言 书写页面样式与布局是前端工程师Coding 中必不可少的一项工作,在定义页面元素的样式时,padding 属性也是经常被使用到的. padding 属性用于设置元素的内边距,其值可以是lengt ...