ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SpringCloud中FeignClient

2020-03-08 16:52:51  阅读:281  来源: 互联网

标签:FeignClient Feign 调用 服务 SpringCloud 接口 注解


介绍

服务间通信简介

一个系统可以由不同的微服务构成,比如一个电商系统可以由订单服务、商品服务、用户服务等共同组成。 这些服务相互独立,但又相互依赖。由于它们相互依赖,所以需要通过通信的方式来进行相互调用。

服务间通信方式主要有两种:

(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

标签:FeignClient,Feign,调用,服务,SpringCloud,接口,注解
来源: https://www.cnblogs.com/liaowenhui/p/12443341.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有