【254期】面试官:来谈谈微服务组件Feign的工作原理吧

Feign的工作原理

主程序入口添加了@EnableFeignClients注解开启对FeignClient扫描加载处理。根据Feign Client的开发规范,定义接口并加@FeignClientd注解。

当程序启动时,会进行包扫描,扫描所有@FeignClients的注解的类,并且将这些信息注入Spring IOC容器中,当定义的的Feign接口中的方法被调用时,通过JDK的代理方式,来生成具体的RequestTemplate.

当生成代理时,Feign会为每个接口方法创建一个RequestTemplate。当生成代理时,Feign会为每个接口方法创建一个RequestTemplate对象,该对象封装了HTTP请求需要的全部信息,如请求参数名,请求方法等信息都是在这个过程中确定的。

然后RequestTemplate生成Request,然后把Request交给Client去处理,这里指的是Client可以是JDK原生的URLConnection,Apache的HttpClient,也可以是OKhttp,最后Client被封装到LoadBalanceClient类,这个类结合Ribbon负载均衡发起服务之间的调用。

Feign注解剖析

@FeignClient注解主要被@Target({ElementType.TYPE})修饰,表示该注解主要使用在接口上。它具备了如下的属性:

  • name:指定FeignClient的名称,如果使用了Ribbon,name就作为微服务的名称,用于服务发现。

  • url:url一般用于调试,可以指定@FeignClient调用的地址。

  • decode404: 当发生404错误时,如果该字段为true,会调用decoder进行解码,否则抛出FeignException.

  • configuration:Feign配置类,可以自定或者配置Feign的Encoder,Decoder,LogLevel,Contract。

  • fallback:定义容错的处理类,当调用远程接口失败或者超时时,会调用对应的接口的容错逻辑,fallback指定的类必须实现@Feign标记的接口。

  • fallbacjFactory:工厂类,用于生成fallback类实例,通过这个属性可以实现每个接口通用的容错逻辑们介绍重复的代码。

  • path:定义当前FeignClient的统一前缀。

Feign开启GZIP压缩

Spring Cloud Feign支持对请求和响应进行GZIP压缩,以提高通信效率。推荐:250期面试题汇总

在yml文件需要如下的配置

 

需要注意的是,在采用了压缩之后,需要使用二进制的方式进行数据传递,所有返回值都需要使用 ResponseEntity<byte[]> 接收.

Feign Client开启日志

需要在注解类添加配置的类:

注解类的代码如下:

Feign的超时设置

Feign的调用分两层,即Ribbon层的调用和Hystrix的调用,高版本的Hystrix默认是关闭的。

如果出现上述的错误,那么就需要添加如下的配置

如果开启了Hystrix,Hystrix的超时报错信息如下:

此时可以添加如下配置:

Feign的Post和Get的多参数传递

在SpringMVC中可以使用Post或者Get轻易的请求到对应的接口并且将参数绑定到POJO,但是Feign并没有全部实现SpringMVC的功能,如果使用GET请求到接口,就无法将参数绑定到POJO,但是可以使用以下的几种方式实现相应的功能。推荐:250期面试题汇总

  • 将POJO内的字段作为一个个的字段写在接口上

  • 将参数编成一个map

  • POJO使用@RequestBody修饰,但是这个违反Restful的原则

以下的代码将Feign的请求拦截下来,将参数进行处理之后统一的编成map

除了上面的方法之外还可以使用venus-cloud-feign这个依赖,该依赖实现了GET请求的参数Map包装,无需再去自己写。依赖如下:

github的地址如下:

https://github.com/SpringCloud/venus-cloud-feign.git

作者:chendom

juejin.cn/post/6844903837543694349

从事IT行业多年,用Java,前端,知Python,有多年的开发经验。如果你正在入门学习Java可以申请加入我的Java学习交流QQ裙:639714511。文件我上传了我做Java这几年整理的一些学习手册,面试题,开发工具,PDF文档书籍教程,需要的话你们都可以自行来获取下载。

群链接:点击链接加入群聊【Java技术讨论群-9群】:

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值