第二天 e:
Feign性能优化:
Feign底层的客户端实现:
1.URLConnection:默认实现,不支持连接池。
2.Apache HttpClient:支持连接池。
3.OKHttp:支持连接池。
因此优化Feign的功能有:
1.使用连接池代替URLConnection。
2.日志级别,最好为basic或none。
在Feign中添加HttpClient的支持:
1.引入依赖。
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
配置连接池:
feign:
client:
config:
default:
loggingLevel: BASIC
httpclient:
enabled: true #开启feign对HttpClient的支持
max-connections: 200 #最大连接数
max-connections-per-route: 50 #每个路径的最大连接数
URLConnection是比较原始的一种http请求,当遇到复杂的请求就不是很适合,但HttpClient它是一个比较完善的HTTP协议工具包。
Feign的最佳实践:
方法一:继承与契约。
给消费者的FeignClient和提供者的controller定义统一的父接口作为标准。
1.先创建一个接口,作为父类:
public interface UserAPI{
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
2.创建一个给消费者端的FeignClient,这里它可以直接调用UserAPI中的方法:
@FeignClient("value ="userService")
public interface UserClient extends UserAPI{}
3.最后一步在提供者端定义统一的接口,引用:
@RestController
public class UserController implements UserAPI{
public User findById(@PathVariable("id") Long id){
//...实现代码
}
}
这种方法的特点就是:
1.服务紧耦合。
2.父接口参数列表的映射不会继承。
2.方法二:(抽取)将FeignClient抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放在这个模块中,提供给消费者使用。
这里的UserClient的直接放入feign-api, 这样的话直接在feign-api中直接调用。
抽取FeignClient:
实现最佳实践方式二的步骤如下:
1.首先创建一个module,命名为feign-api,然后引入feign的start依赖。
2.将order-service中编写的UserClient、User、DefaultFeignConfiguration都复制到feign-api项目中
3.在order-service中引入feign-api(即一开始创建的那个module)的依赖。
4.修改order-service中的所有与上述三个相关有关的import部分,改成feign-api中的包。
5.重启测试。
在这个过程中可能会遇到一个问题,就是定义的FeignClient不在SpringBootApplication的扫描包(这里的包指的是:package 每段代码最上面的部分)中时,这些FeignClient将无法使用。当然有两种方法解决:
方法一:指定FeignClient所在包。
@EnableFeignClients(basePackage ="....")//....为引入的地址
方法二:指定FeignClient字节码。
@EnableFeignClients(clients = {UserClient.class})
这里可以多加几个字节码。