Feign
http客户端Feign+
RestTemplate方法调用存在的问题:
- 代码可读性查
- 参数、url难以维护(易报错)
Feign: 使得我们使用http更加优雅
1. Feign-自定义配置
使用步骤如下:
- 引用依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 创建文件
-
编写
@FeignClient("userservice") public interface UserClient { @GetMapping("/user/{id}") User findById(@PathVariable("id") Long id); }
-
在service里注册
@Autowired private UserClient userClient; public Order queryOrderById(Long orderId) { // 1.查询订单 Order order = orderMapper.findById(orderId); String url ="http://userservice/user/"+order.getUserId(); System.out.println("url:"+url); // User user=restTemplate.getForObject(url,User.class); // order.setUser(user); // 4.返回 User byId = userClient.findById(order.getUserId()); order.setUser(byId); return order; }
报错no Autowired
在启动类种添加:
@EnableFeignClients(basePackages = { "cn.itcast.order.client"} )
2. Feign-自定义配置
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日志的两种方式
方式一:配置文件方式
-
全局生效
application.yml
feign:
client:
config:
default:
loggerLevel: FULL
-
局部生效
feign: client: config: userservice: loggerLevel: FULL
方法二: java代码方式
package cn.itcast.order.config;
import feign.Logger;
import org.springframework.context.annotation.Bean;
public class FeignClientConfiguration {
@Bean
public Logger.Level feignLogLevel(){
return Logger.Level.FULL;
}
}
全局:
启动类上加上
@EnableFeignClients(basePackages = {defaultConfiguration = FeignClientConfiguration.class)
局部:
在Userclint上加上
@FeignClient(value=“userservice",defaultConfiguration = FeignClientConfiguration.class)
3. Feign的性能优化
Feign底层的客户端实现:
- URLconnection: 默认实现,不支持连接池
- Apache HttpClient : 支持连接池
- OKHttp: 支持连接池
因此优化Feign的性能主要包括:
- 使用连接池代替默认的URLConnection
- 日志级别,最好用basic或none
Feign添加HttpClient的支持:
引入依赖:
feign添加HttpClient的支持:
引入依赖:
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
配置连接池
feign:
httpclient:
enabled: true #支持httpClient的开关
max-connections: 200 #最大连接数
max-connections-per-route: 50 #单个连接路径的最大连接数