是什么

Feign是一个声明式Web Service客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。

怎么用

官方github项目(readme里写得很详细,代码里还有示例)

我遇到的一些特殊请求:

(1)POST请求方式,但是请求参数放在查询字符串里:

一般的查询字符串添加可以用@QueryMap Map<String, Object>(为什么要用这个,因为不是用的spring cloud分支下封装过的feign,不支持直接用spring的注解)

  1. @RequestLine("POST /example/foo/token")
    String getAccessToken(@QueryMap Map<String, Object> queryMap);

(2)查询字符串里带特殊拼接符号如加号(实现形如GET /Groups?filter=displayName+Eq+{roleName}的查询): https://stackoverflow.com/questions/43868680/feign-client-does-not-resolve-query-parameter

  1. @RequestLine("GET /Groups?filter={roleName}")
  2. String isValidRole(@Param(value = "roleName", expander = PrefixExpander.class) String roleName);
  3.  
  4. static final class PrefixExpander implements Param.Expander {
  5. @Override
  6. public String expand(Object value) {
  7. return "displayName+Eq+" + value;
  8. }
  9. }

(3)feign添加自定义httpheader:

  1. @RequestLine("POST /add")
  2. @Headers("TOKEN: {userToken}")
  3. Response addRecord(RecordVO recordVO,
  4. @Param("TOKEN") String userToken);

普通项目示例(<-这是一个原文链接,稍微修改了下)

maven依赖

  1. <!-- open-feign -->
    <dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-core</artifactId>
    <version>10.0.1</version>
    </dependency>
    <dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-gson</artifactId>
    <version>10.0.1</version>
    </dependency>

自定义接口

  1. import feign.Param;
  2. import feign.RequestLine;
  3.  
  4. public interface RemoteService {
  5.  
  6. @RequestLine("GET /users/list?name={name}")
  7. String getOwner(@Param(value = "name") String name);
  8. }

通过@RequestLine指定HTTP协议及URL地址

配置类

  1. RemoteService service = Feign.builder()
  2. .options(new Options(1000, 3500))
  3. .retryer(new Retryer.Default(5000, 5000, 3)).encoder(new GsonEncoder()).target(RemoteService.class, "http://127.0.0.1:8085");

options方法指定连接超时时长及响应超时时长,retryer方法指定重试策略,target方法绑定接口与服务端地址。返回类型为绑定的接口类型。

(ps.还可以指定其他的:比如

.encoder(new GsonEncoder())
.decoder(new GsonDecoder())
.logger(new Logger.ErrorLogger())
.logLevel(Logger.Level.BASIC))

调用:

  1. String result = service.getOwner("scott");

与调用本地方法相同的方式调用feign包装的接口,直接获取远程服务提供的返回值。

spring cloud 项目示例(<-这是一个原文链接)

maven依赖

  1. <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
    </dependency>

在启动类上加@EnableFeignClients

注解,如果你的Feign接口定义跟你的启动类不在一个包名下,还需要制定扫描的包名@ EnableFeignClients(basePackages = "com.fangjia.api.client")

配置类

  1. @Configuration
  2. public class FeignConfiguration {
  3. @Bean
  4. Logger.Level feignLoggerLevel() {
  5. return Logger.Level.FULL;
  6. }
  7. }

自定义接口

  1. @FeignClient(value = "fangjia-fsh-house-service", path = "/house", configuration = FeignConfiguration.class, fallback = HouseRemoteClientHystrix.class)
  2. public interface HouseRemoteClient {
  3.  
  4. /**
  5. * 获取企业下某用户的有效房产信息
  6. * @param eid 企业编号
  7. * @param uid 用户编号
  8. * @return
  9. */
  10. @GetMapping("/list/{eid}/{uid}")
  11. public HouseListDto hosueList(@PathVariable("eid")Long eid, @PathVariable("uid")String uid);
  12.  
  13. /**
  14. * 获取房产详细信息
  15. * @param houseId 房产编号
  16. * @return
  17. */
  18. @GetMapping("/{houseId}")
  19. public HouseInfoDto hosueInfo(@PathVariable("houseId")Long houseId);
  20.  
  21. }

熔断回调处理

  1. @Component
  2. public class HouseRemoteClientHystrix implements HouseRemoteClient {
  3.  
  4. @Override
  5. public HouseListDto hosueList(Long eid, String uid) {
  6. return new HouseListDto();
  7. }
  8.  
  9. @Override
  10. public HouseInfoDto hosueInfo(Long houseId) {
  11. return new HouseInfoDto();
  12. }
  13. }

原理(<-这是一个原文链接)

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

OpenFeign使用笔记的更多相关文章

  1. SpringCloud学习笔记(3):使用Feign实现声明式服务调用

    简介 Feign是一个声明式的Web Service客户端,它简化了Web服务客户端的编写操作,相对于Ribbon+RestTemplate的方式,开发者只需通过简单的接口和注解来调用HTTP API ...

  2. SpringCloud学习笔记(4):Hystrix容错机制

    简介 在微服务架构中,微服务之间的依赖关系错综复杂,难免的某些服务会出现故障,导致服务调用方出现远程调度的线程阻塞.在高负载的场景下,如果不做任何处理,可能会引起级联故障,导致服务调用方的资源耗尽甚至 ...

  3. 肝了很久,冰河整理出这份4万字的SpringCloud与SpringCloudAlibaba学习笔记!!

    写在前面 不少小伙伴让我整理下有关SpringCloud和SpringCloudAlibaba的知识点,经过3天的收集和整理,冰河整理出这份4万字的SpringCloud与SpringCloudAli ...

  4. 保姆级尚硅谷SpringCloud学习笔记(更新中)

    目录 前言 正文内容 001_课程说明 002_零基础微服务架构理论入门 微服务优缺点[^1] SpringCloud与微服务的关系 SpringCloud技术栈 003_第二季Boot和Cloud版 ...

  5. 【微服务】- 服务调用 - OpenFeign

    服务调用 - OpenFeign 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 介绍 O ...

  6. git-简单流程(学习笔记)

    这是阅读廖雪峰的官方网站的笔记,用于自己以后回看 1.进入项目文件夹 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file ...

  7. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  8. SQL Server技术内幕笔记合集

    SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...

  9. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

随机推荐

  1. springMVC中不通过注解方式获取指定Service的javabean

    如TestService,其实现为TestServiceImpl,则可以通过 TestService testService = (TestService)SpringContextHolder.ge ...

  2. Looper.loop() android线程中的消息循环

    Looper用于封装了android线程中的消息循环,默认情况下一个线程是不存在消息循环(message loop)的,需要调用Looper.prepare()来给线程创建一个消息循环,调用Loope ...

  3. Angular i18n

    Angular2中使用ngx-translate进行国际化http://blog.csdn.net/u014291497/article/details/61233033 在 Angular 项目中添 ...

  4. mysql 常见数据类型

    ---恢复内容开始--- MySQL常见的数据类型 一.数据类型是什么? 数据类型是指列.存储过程参数.表达式和局部变量的数据特征,它决定了数据的存储格式,代表了不同的信息类型. 有一些数据是要存储为 ...

  5. 线程的同步之Synchronized的使用

       一.介绍        线程的同步:一般的并发指的就是多个线程访问同一份资源.多个线程同时访问(修改)同一份资源的话,就会有可能造成资源数据有误. 如果多个线程访问多个不同资源,就不会造成线程同 ...

  6. python 列表构造时的引用问题

    以前老是不注意python对象引用,平时也没遇到这样的问题,昨天在这个小问题纠结了半天时间.真是TMD啊 先说明一下我的目的,我有一个包含16个元素的列表,每个元素也是一个小列表.我想每四个子列表为一 ...

  7. Jmeter-配置元件

    CSV Data Set Config(CSV数据集配置) 参考:http://www.cnblogs.com/yanzhe/p/7728139.html DNS Cache Manager(DNS缓 ...

  8. Java进行数据库导出导入 亲测可用

    /** * @param hostIP ip地址,可以是本机也可以是远程 * @param userName 数据库的用户名 * @param password 数据库的密码 * @param sav ...

  9. 【liunx】nslookup命令

    “nslookup”域名解析是什么? 假设我们要开个网站,首先我们要去提供域名申请的机构申请域名,然后绑定一个IP地址, 域名比较容易记忆,不像IP地址都是数字,申请完域名,绑定域名,DNS就写入域名 ...

  10. fackbook flow 简单使用

    flow 是一个javascript 静态检查的工具,由facebook 开发, 使用起来简单,方便. 安装 项目初始化 yarn init -y 编译器安装 yarn add --dev babel ...