本章学习Feign,包括Feign的自定义配置,实现文件上传,进一步实现代码的重用,Feign性能优化,Feign与RestTemplate的对比与选择.
1 使用Feign实现远程HTTP调用
-
Feign是Netflix开源的声明式HTTP客户端

-
添加依赖


-
新建包及接口

-
服务实现类


2 Feign的组成

- 查找

- 默认的Feign : 使用的URLConnection性能差

- 和ribbon配合的 : 使用了代理模式,其实也就是feign-default的代理

- contract
由于feign默认的注解是非Spring MVC型的
- 通过该默认类实现了MVC注解

细粒度配置自定义
默认的Feign是不打印日志的
- 自定义Feign日志级别

下面将设置为FULL级别
Java代码方式 - 指定日志级别
- 接口类

- 日志配置类

- 配置文件

- 注意坑,如果在feign配置类加了该注解,就必须放在compscan包以外,以免复制上下文重复扫描问题

配置属性方式 - 指定日志级别
将之前的Java配置类的注解注释掉
- 配置文件

全局配置
Java代码方式 - 指定日志级别
◆ 方式一:让父子上下文ComponentScan重叠(强烈不建议使用)
◆ 方式二[唯一正确的途径] :@EnableFeignClients(defaultConfiguration=xxx.class)
- 先将之前的细粒度配置注释掉!

- 找到启动类的EFC注解并指定为配置类

配置属性方式 - 指定日志级别
- 恢复之前的配置文件信息并修改如下

支持的配置项
- 代码方式

- 属性方式

配置最佳实践总结
- Ribbon配置 VS Feigne配置

- Feign代码方式 VS 属性方式

最佳实践
- 尽量使用属性配置,属性方式实现不了的情况下再考虑用代码配置
- 在同一个微服务内尽量保持单一性,比如统一使用属性配置,不要两种方式混用,增加定位代码的复杂性
Feign的继承
- UserCenter中的

- ContentCenter中的,使其继承上面的代码

关于继承特性的争议
◆ 官方观点:不建议使用
这里继承会产生紧耦合
◆ 业界观点:很多公司使用
比如User服务修改了字段,而Content服务却不知道,没有修改,那么调用时就会报错
◆ 个人观点:权衡利弊
此处有争议,不赘述
多参数请求构造
比如在User服务中有这样一个请求

那么如何使用Feign去请求这样的API呢?
回到Content服务,写代码
- 写一测试类

- 在测试启动类添加该测试项目

- 启动报错,根据error提示,添加配置,之后正常启动!

因为现在有两个client都叫user-client(测试类也叫user-client), 重名了,所以Spring创建代理时会有问题,加上上述配置即可解决
-
但是此刻这样访问依旧报错405

-
Feign端服务代码, 还需要添加注解

Feign脱离Ribbon使用
在Content服务写代码
- 测试类添加测试项目

- 直接访问即可!
RestTemplate VS Feign

如何选择?
◆ 原则:尽量用Feign ,杜绝使用RestTemplate
◆ 事无绝对合理选择
Feign性能优化
连接池 [提升15%左右]
- 添加依赖

- 配置文件

使用okhttp同理配置如上两步骤
日志级别
因为默认不打印日志哦!建议设置为basic,不要为full哦
常见问题总结 - 推荐阅读
现有架构总结

参考
-
Open Feign官网
随时随地看视频