RestTemplate 方式调用存在的问题:
java
String url = "http://userservice/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);
这是通过URL地址来访问的。但是:
- 代码可读性差,编程体验不统一
- 参数复杂的URL很难维护
Feign是一个声明式的http客户端,其作用就是帮助我们优雅的实现http请求的发送。
目录
定义和使用Feign客户端
引入依赖
XML
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在order-service的启动类添加注解开启Feign功能
接下来,我们新建一个接口,用这些参数来替代掉之前RestTemplate的参数。
可以看到,用Feign调用非常简单,Feign客户端是通过注解的方式来完成的,所以不管多复杂的URL都可以完成操作。
自定义Feign的配置
方式一:配置文件
这样日志级别就设置成了FULL。
方式二:Java代码方式,需要先声明一个Bean:
如果是全局配置,则把它放到 @EnableFeignClients 这个注解中:
java
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
如果是局部配置,则把它放到 @FeignClient 这个注解中:
java
@FeignClient(value = "userservice", configuration = FeignClientConfiguration.class)
在一般情况下,一般用BASIC或者NONE,在找bug或者调试的时候才会用FULL。
Feign性能优化
Feign底层的客户端实现:
- URLConnection: 默认实现,不支持连接池
- Apache HttpClient: 支持连接池
- OKHttp: 支持连接池
因此优化Feign的性能主要包括:
- 使用连接池代替默认的URLConnection
- 志级别,最好用 basic 或 none
连接池配置:
引入依赖:
配置连接池:
总结一下Feign的优化:
日志尽量使用basic,并且使用HttpClient 或 OKHttp代替URLConnection。
Feigh最佳实践
方式一:继承。给消费者的FeignClient和提供者的Controller定义统一的父接口作为标准。
这种做法不推荐。两种服务会变成高度耦合,已经调用了同一个API接口,到时候接口需要改变,这两个服务都需要改。
方式二:抽取。将FeignClient抽取为独立模块,并且把接口有关的POJO,默认的Feign配置都放到这个模块中,提供给所有消费者使用。
封装的时候,把所有的接口都封装进来了,可能会导致没有必要的资源浪费。