在使用Spring Cloud开发微服务应用时中,各个微服务服务提供者都是以HTTP接口的形式对外提供服务,因此服务消费者在调用服务提供者时,通过HTTP Client的方式访问。当然我们可以使用JDK原生的`URLConnection`、`Apache的Http Client`、`Netty的异步HTTP Client`, Spring的`RestTemplate`去实现服务间的调用。Spring Cloud对Fegin进行了增强,使Fegin支持了Spring MVC的注解,并整合了Ribbon和Eureka,从而让Fegin的使用更加方便(在Spring Cloud中使用Feign, 我们可以做到使用HTTP请求远程服务时能与调用本地方法一样的编码体验)。

一、FeignClient工作原理

总结来说,Feign的源码实现的过程如下:

  • 首先通过@EnableFeignCleints注解开启FeignCleint
  • 根据Feign的规则实现接口,并加@FeignCleint注解
  • 程序启动后,会进行包扫描,扫描所有的@ FeignCleint的注解的类,并将这些信息注入到ioc容器中
  • 当接口的方法被调用,通过jdk的代理,来生成具体的RequesTemplate
  • RequesTemplate在生成Request
  • Request交给Client去处理,其中Client可以是HttpUrlConnection、HttpClient也可以是Okhttp
  • 最后Client被封装到LoadBalanceClient类,这个类结合类Ribbon做到了负载均衡

工作原理参见:https://zhuanlan.zhihu.com/p/28593019

二、示例

FeignClient相当于Spring Cloud中的RPC,使用示例如下:

(1)Eureka-Server注册中心

application.yml配置如下:

#application.yml
server: port: 1111
spring:application:name:eureka-server
eureka:client:register-with-eureka: falsefetch-registry: falseserver-url:defaultZone: http://localhost:${server.port}/eureka/

EurekaServerApplication配置如下:

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class,args)}
}

(2)Eureka-Producer配置

定义远程服务HelloController

@RestController
public class HelloController {@GetMapping("/hello")public String xxx(@RequstParam String name) {return "hello" + name + ", I'm eureka producer service!";}
}

Eureka-Client中application.yml配置

server:port: 1112
spring:application:name: eureka-producer
eureka:client:server-url:defaultZone: http://localhost:1111/eureka/

EurekaProducerApplication

@EnableDiscoveryClient
@SpringBootApplication
public class EurekaProducerApplication {public static void main(String[] args) {SpringApplication.run(EurekaProducerApplication.class,args)}
}

(3)Eureka-Consumer配置

Controller层服务配置如下:

@RestController
public class ConsumerController {@AutowiredHelloRemote helloRemote;@RequestMapping("/hello/{name}")public String hello(@PathVariable("name") String name) {return helloRemote.hello(name);}
}

 HelloRemote配置

@FeignClient(name="eureka-producer")
public interface HelloRemote {@RequstMapping("/hello")String hello(@RequstParam(value="name") String name);
}

application.yml文件配置

server:port: 1113
spring:application:name: eureka-consumer
eureka:client:server-url:defaultZone: http://localhost:1111/eureka

EurekaConsumerApplication配置

@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaConsumerApplication {public static void main(String[] args) {SpringApplication.run(EurekaConsumerApplication.class,args)}
}

参见:http://www.voidcn.com/article/p-kodllxvn-hr.html

http://xujin.org/sc/sc-fegin01/

http://www.cnblogs.com/jalja/p/7011439.html

http://www.jianshu.com/p/f908171b5025

http://spring-cloud.io/reference/feign/

FeignClient使用相关推荐

  1. FeignClient源码深度解析

    微信公众号:吉姆餐厅ak 学习更多源码知识,欢迎关注. 全文共16984字左右. 概述 springCloud feign主要对netflix feign进行了增强和包装,本篇从源码角度带你过一遍装配 ...

  2. feignclient多个配置_@FeignClient同一个name使用多个配置类的解决方案

    Feign有一个局限性,即对于同一个service-id只能使用一个配置类,如果有多个@FeignClient注解使用了相同的name属性,则注解的configuration参数会被覆盖.至于谁覆盖谁 ...

  3. Spring Cloud 使用 FeignClient 启动报错

    我们首先来看一下报错信息 Description:Field businessFeignClient in com.ysc.service.BusinessConfigService required ...

  4. feignclient url_Spring Cloud Feign 请求动态URL

    1.  FeignClient 中不要写url, 使用 @RequestLine修饰方法 2. 调用地方必须引入  FeignClientConfiguration, 必须有Decoder, Enco ...

  5. 异常解决——Spring Cloud FeignClient: BeanCreationException: Error creating bean with

    最近自己搭建了Spring Cloud 架构,在做客户端的时候,FeignClient标注的Service接口 无法注入,can not be autowired . 网上找了一堆资料也没发现可用的. ...

  6. @FeignClient 接口调用

    在项目的启动文件加入:@EnableFeignClients 注解, 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import org.springframew ...

  7. FeignClient调用服务及上传文件的注意点及问题

    目录 代码示例 文件服务接口 调用方 注意点: 2021.3.16更新:发新的坑 坑点: 原因分析 部分异常及解决方案 异常一:[Method has too many Body parameters ...

  8. feignclient注解使用_从 Feign 使用注意点到 RESTFUL 接口设计规范

    最近项目中大量使用了Spring Cloud Feign来对接http接口,踩了不少坑,也产生了一些对RESTFUL接口设计的想法,特此一篇记录下. SpringMVC的请求参数绑定机制 了解Feig ...

  9. @FeignClient中的@RequestMapping也被SpringMVC加载的问题解决

    问题描述 在之前发布的<Spring Cloud实战小贴士:Feign的继承特性(伪RPC模式)>一文中,我们介绍了如果使用Feign的继承特性来完成服务的提供以及服务的消费,实现了类似R ...

最新文章

  1. Exchange 2013/2016动态通讯组成员查询
  2. C++中内存分配、函数调用和返回值问题
  3. 目的港无人提货的法律风险及风险承担
  4. 使用前端框架Foundation 4来帮助简化响应式设计开发
  5. C#3.0 自动属性——只能在简单属性上偷懒
  6. mysql排序时设置主次_Mysql实现Rownum()排序后根据条件获取名次
  7. 云服务器的发展历程,盘点微软Azure云服务器的发展历程
  8. 【java】深入理解Java的动态编译
  9. PHP回顾之多进程编程
  10. 拓端tecdat|Python用Markowitz马克维兹有效边界构建最优投资组合可视化分析四只股票
  11. Win10 解决端口占用问题
  12. 菜鸟学习日志3.界面控件的设置
  13. SLAB内存泄露分析实践
  14. qtdesigner设计表格_使用Qt Designer进行布局
  15. 第十二届蓝桥杯时间显示问题 python解法
  16. 有信仰与无信仰家族200年对比,让世人震惊!!
  17. matlab 统计数组频数_matlab如何找出一个数在数组中出现次数
  18. C语言报告书学生信息管理系统,C语言实训 学生信息管理系统
  19. 8051 Microcontroller仿真(一)- Proteus原理图
  20. 联发科有没有高端处理器_联发科官宣,全球第六款7nm处理器来袭,专为游戏而生...

热门文章

  1. 润飞rf1800支持解密吗_《密逃2》新一期来袭:还是你期待的样子吗?
  2. php写web服务器端,如何用php实现一个web服务器
  3. 头像裁剪_课堂裁剪|19级油画班油画头像写生作品
  4. win2012每次启动显示服务器管理器,win2012r2服务器管理器打开角色.功能出错
  5. Deeplearning:windows多版本cuda安装、管理
  6. 【视频课】一课掌握模型设计核心理论与实战技巧
  7. 【每周NLP论文推荐】从预训练模型掌握NLP的基本发展脉络
  8. 全球及中国无服务器应用程序行业应用调研与投资前景规划报告2022版
  9. lazadashopee代运营服务有哪些,能帮商家解决哪些问题?
  10. 廊田镇楼下村定点帮扶-农业大健康·李喜贵:功能性农业深加工