一、SpringCloud整合Feign
1.添加依赖:
2.启动类上添加注解:
二、Feign的使用
1.首先新建一个接口,添加上@FeignClient注解,name为服务提供者的微服务名称,接着在接口中加上需要调用的接口地址和参数即可:
2.使用时将上图接口注入,直接调用需要使用的接口即可:
因为Feign是基于Ribbon上开发的,所以Feign调用微服务时也默认使用了基于随机算法的负载均衡;
三、Feign的组成
feign.Client.Default底层使用urlConnection请求,因为urlConnection没有连接池和资源管理,所以性能不是特别好,LoadBalancerFeignClient可以使用连接池,所以性能相对较好,如何使用在下面的Feign性能优化中会讲解到;
四、细粒度配置自定义-01-Java代码方式-指定日志级别
1.Feign日志级别:
生成环境中优先使用BASIC级别;
开发环境中优先使用FULL级别;
2.开始配置
首先自定义一个Feign配置类,里面返回需要打印的日志级别,该类不能加@configuration注解,否则就要放到@componentScan能扫描到的包以外,也就是启动类的所在的包以外,不然会有父子上下文问题,严重可能影响项目的启动;下图为Feign配置类:
然后在FeignClient接口中新增configuration参数,值为上面自定义的配置类:
最后在配置文件中新增该接口的日志级别,一定要是debug,因为Feign日志是建立在debug级别上的,如果使用info,将无法打印日志;下图为配置文件:
到这里Feign使用JAVA代码方式开启日志打印就结束了
五、细粒度配置自定义-02-配置属性方式-指定日志级别
只需要如下图配置即可,比代码方式更加的方面简洁:
六、全局配置-01-Java代码方式-指定日志级别
有两种方式配置:
方式一:让父子上下文ComponentScan重叠(强烈不建议,原因可查看上文四.2)
方式二:@EnableFeignClients(defaultConfiguration = xxx.class)(唯一正确的途径)
七、全局配置-02-配置属性方式-指定日志级别
只需要将微服务名称改为default即可,非常方便:
八、Feign支持的配置项
1.使用代码方式支持的配置项:
2.使用属性的方式支持的配置项:
以上两种配置方法都和上文讲解的四、五、六、七方式一致,这些配置项不用特意去记,只要使用的时候知道去哪里寻找即可;
九、配置最佳实践总结
1.Ribbon配置 VS Feign配置:
2.Feign代码方式 VS 属性方式:
优先级比较:全局代码<全局属性<细粒度代码<细粒度属性
建议:
尽量使用属性配置,属性方式实现不了的情况下才考虑使用代码方式;
在同一个微服务内尽量保持单一,比如统一使用属性配置,不要两种方式混用,增加定位代码的复杂性;
十、Feign的继承
我们可以发现MemberFeignClient接口的内容在member微服务中的MemberController肯定是一样的,那么如果将所有的接口都先写在一个共同接口中(下文称CommonInterface),让MemberFeignClient继承
CommonInterface接口,MemberController实现CommonInterface接口,那么如果接口信息有变化只需要修改CommonInterface接口即可,这样一来就可极大减少工作量,也避免了更新不及时的问题,不过这样也同样造成了微服务之间的紧耦合,这就和微服务的初衷背道而驰了,以下是各方观点:
官方观点:不建议使用(因为会造成微服务间的紧耦合)
业界观点:很多公司使用(因为非常方便,降低工作量)
个人观点:权衡利弊
十一、多参数请求构造
请直接参考该篇手记:
http://www.imooc.com/article/289000
十二、Feign脱离Ribbon使用
一般情况下Feign都是用于调用在Nacos上注册的微服务接口,除此之外,Feign还有另外一种用法,就是直接访问某个链接;
首先创建一个接口,@FeignClient中url为即将要访问的链接地址:
之后在项目中直接调用baidu方法即可,结果就是直接访问到百度首页;下图为调用方式:
十三、RestTemplate vs Feign
总结:尽量使用Feign,杜绝RestTemplate,因为一个项目不允许出现两种请求方式,统一编码风格,共存带来的只有风格的不统一,但是事无绝对,权衡利弊;
十四、Feign性能优化
1.为Feign添加连接池,可以选择使用httpclient或者是okclient;
首先加依赖:
接着添加属性配置:
添加了连接池后,Feign的性能大概能提升15%左右,httpclient和okclient不能两个都使用,只能选择一个使用;
2.日志级别
Feign默认是不显示日志的,这样性能当然最快,但是在生产环境中我们不可能不打印日志,所以建议使用BASIC级别,具体可查看师四——七小节;
十五、常见问题总结
参考该手记:http://www.imooc.com/article/289005
PS:本博客所有手记均转载自慕课网大目老师;