SpringCloud06-Feign
简单的介绍了SpringCloud中的Feign。
http客户端Feign
restTemplate方式调用存在的问题
String url = "http://userservice/user/" + order.getUserId(); |
存在以下的问题:
- 代码可读性差,编程体验不统一
- 参数复杂URL难以维护
Feign的使用方法
- 引入依赖
<!--feign客户端依赖--> |
- 在order-service的启动类添加注解开启Feign的功能
|
- 编写Feign客户端
|
主要是基于SpringMVC的注解来声明远程调用的信息,比如:
- 服务名称:userservice
- 请求方式:GET
- 请求路径:/user/{id}
- 请求参数:Long id
- 返回值类型:User
自定义Feign的参数配置
类型 | 作用 | 说明 |
---|---|---|
feign.Logger.Level | 修改日志级别 | 包含四种不同的级别:NONE、BASIC、HEADERS、FULL |
feign.codec.Decoder | 响应结果的解析器 | http远程调用的结果做解析,例如解析json字符串为java对象 |
feign.codec.Encoder | 请求参数编码 | 将请求参数编码,便于通过http请求发送 |
feign.Contract | 支持的注解格式 | 默认是SpringMVC的注解 |
feign.Retryer | 失败重试机制 | 请求失败的重试机制,默认是没有,不过会使用Ribbon的重试 |
一般我们需要配置的就是日志级别,有两种配置方法
方式一:配置文件方式
全局生效
feign: |
局部生效
feign: |
方式二:java代码方式
需要先声明一个Bean
public class FeignclientConfiguration { |
- 如果是全局配置,则把它放到@EnableFeignclients这个注解中
- 如果是局部配置,则把它放到@Feignclient这个注解中
总结
Feign的日志配置:
- 方式一是配置文件,feign.client.config.xxx.loggerLevel
- 如果xxx是default则代表全局
- 如果xxx是服务名称,例如userservice则代表某服务
- 方式二是java代码配置Logger.Level这个Bean
- 如果在@EnableFeignClients注解声明则代表全局
- 如果在@FeignClient注解中声明则代表某服务
Feign的性能优化
Feign底层的客户端实现:
- URLConnection::默认实现,不支持连接池
- Apache HttpClient:支持连接池
- OKHttp:支持连接池
因此优化Feign的性能主要包括:
- 使用连接池代替默认的URLConnection
- 日志级别,最好用basic或none
Feign的性能优化-连接池配置
- 引入依赖
<!--引入HttpClient依赖--> |
- 配置连接池
feign: |
实践分析
- 方式一(继承):给消费者的Feignclient和提供者的controller定义统一的父接口作为标准。
- 方式二(抽取):将FeignClient抽取为独立模块,并且把接口有关的PO]O、默认的Feign配置都放到这个模块中,提供给所有消费者使用
当定义的FeignClient不在SpringBootApplication的扫描包范围时,这些FeignClient无法使用。有两种方式解决:
- 方式一:指定FeignClient所在包
- 方式二:指定FeignClient字节码
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 玖!
评论