Feign
Feign解决什么:
- Feign旨在使编写JAVA HTTP客户端变得更加容易,Feign简化了RestTemplate代码,实现了Ribbon负载均衡,使代码变得更加简洁,也少了客户端调用的代码,使用Feign实现负载均衡是首选方案,只需要你创建一个接口,然后在上面添加注解即可。
- Feign是声明式服务谓用组件,其核心就是:像调用本地方法一样调用远程方法,无感知远程HTTP请求。
ribbon和Feign的选择:
- Feign代码可读性,可维护性比Ribbon+RestTemplate好。可以统一编码风格
- Feign的性能虽然不那么优秀,但是项目瓶颈一般不在HTTP客户端,而在自身业务处理上
- 如果Feign无法实现的时候,用RestTemplate,灵活性上后者更高
使用:引入依赖spring-cloud-starter-feign,启动类添加@EnableFeignClients注解开启Feign的功能,定义一个feign接口,通过@FeignClient(“服务名”),来指定调用哪个服务,在Controller层,调用接口暴露服务
自定义Feign配置类:
- 接口上的@FeignClient注解中,配置configuration属性为配置类
- 定义配置类,创建一个Logger的bean,自定义日志级别
源码实现:
- 首先通过@EnableFeignClients注解开启FeignClient,根据Feign的规则实现接口,并加@FeignClient注解
- 扫描所有@FeignClient注解的类,并将这些信息注入到ioc容器中
- 当接口的方法被调用,通过jdk的代理,来生成具体的RequesTemplate
- RequesTemplate再生成Request然后交给HttpClient
- 再将其封装到LoadBalanceClient类,这个类结合类Ribbon做到了负载均衡。
在Feign中使用降级和熔断:
降级:在接口中指定fallbackFactory值为降级服务类,在api层建立一个降级服务,用@Component注解,并实现FallbackFactory接口,定义泛型为feign调用的接口。
熔断:启动类加@EnableCircuitBreaker开启熔断,在方法上加@HystrixCommand注解,配置circuiBreaker属性,开启熔断器,并设置请求阈值,错误占比,休眠时间等,配置fallback指定熔断方法
Feign的性能优化:
gzip压缩:
gzip是一种数据格式,采用deflate算法压缩数据,gzip压缩纯文本文件时,大约可以减少70%以上文件大小。
作用:网络数据经过压缩后实际降低了网络传输的字节数,可以加快网页加载速度,节省流量,改善用户体验。此外gzip与搜索引擎的抓取工具有更好的关系,列入google可以通过直接抓取gzip文件来比普通手工抓取更快的检索网页
开启配置在代码consumer中
HTT协议关于压缩传输的规定:
- 客户端向服务器请求中带有:Accept-Encoding:gzip,deflate字段,向服务器表示春户端支持的压缩格式(gzip或者deflate),如果不发送该消息头,服务端默认是不会压缩的。
- 服务端在收到请求之后,如果发现请求头中含有Accept-Encoding字段,并且支持该类型压缩,就会对响应报文压缩之后返回给客户端,并且携带Content-Encoding:gzip消息头,表示响应报文是根据该格式进行压缩的
- 客户端接收到请求之后,先判断是否有Content-Encoding消息头,如果有,按该榨式解压报文,否则按正常报文处理
HTTP连接池:采用连接池可以节约大量3次握手和4次挥手,大大提升吞吐量
- feign的http客户端支持3种框架HttpURLConnection(默认)、HttpClient、okHttp
- 传统的HttpuRL.Connection是JDK自带的,并不支持连接池,如果要实现连接池的机制,还需要自己来管理连接对象。对于网络请求这种底层相对复杂的操作,如果有可用的其他方案,没有必要自己去管理连接对象。
- Httpclient相比传统JDK自带的HttpURLConnection,它封装了访问HTTP的请求头,参数,内容体,响应等等;它不仅使客户端发送HTTP请求变得容易,而且也方便了开发人员测试接口(基于HTTP协议的) ,既提高了开发的效率,又提高了代码的健壮性;另外高井发大星的诗求网络的时候,也是用"连接池"提升吞吐量。HttpClient开启配置代码在consumer中
请求超时:
feign负载均衡底层是ribbon,所以请求超时配置就是配置ribbon,默认超时时间1s。请求超时配置在consumer中
在Feign中使用降级和熔断:
降级:在接口中指定fallbackFactory值为降级服务类,在api层建立一个降级服务,用@Component注解,并实现FallbackFactory接口,定义泛型为feign调用的接口。
熔断:启动类加@EnableCircuitBreaker开启熔断,在方法上加@HystrixCommand注解,配置circuiBreaker属性,开启熔断器,并设置请求阈值,错误占比,休眠时间等,配置fallback指定熔断方法
本文来自博客园,作者:难得,转载请注明原文链接:https://www.cnblogs.com/zhangbLearn/p/18829368

浙公网安备 33010602011771号