Feign替代RestTemplate
使用RestTemplate的方式:
RestTemplate是SpringWeb提供的Http客户端,但是使用RestTemplate代码可读性差,且参数复杂 url 难维护。
// String url = "http://localhost:8081/user/" + order.getUserId();
// 将IP地址和端口号改为服务名称
String url = "http://userService/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);
使用Feign:
1.添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.在orderService的启动类上添加注解开启Feign功能
@EnableFeignClients
3.编写Feign客户端
@FeignClient("userService") // 指定调用的服务名称
public interface userClient {
@GetMapping("/user/{id}") // 请求方式 + 路径
User findById(@PathVariable Long id); // 返回值类型 + 请求参数
}
4.使用
@Autowired
private userClient userClient;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.用 Feign远程调用
User user = userClient.findById(order.getUserId());
// 3.填充
order.setUser(user);
// 4.返回
return order;
}
如果启动的时候有报错:No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalancer?
SpringCloud Feign在Hoxton.M2 RELEASED版本之后不再使用Ribbon而是使用spring-cloud-loadbalancer,
所以不引入spring-cloud-loadbalancer会报错
考虑:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<!-- 去除nacos-discovery中的子依赖ribbon -->
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 使用spring-cloud-loadbalancer -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
自定义Feign的配置
配置Feign日志
第一种方式:
feign:
client:
config:
default: # 这里 default 就是全局配置, 如果是服务名称,则是针对某个服务的配置
loggerLevel: NONE/BASIC/HEADERS/FULL # 日志级别(默认是NONE)
性能优化
Feign底层的客户端实现:
HttpURLConnection:默认,不支持连接池,是JDK自带的
Apache HttpClient:支持连接池
okhttp:支持连接池
日志级别最好使用BASIC或者NONE
使用okhttp
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
根据spring-cloud-openfeign-core
包下的FeignAutoConfiguration
类进行配置
# feign配置
feign:
client:
config:
default:
loggerLevel: NONE
httpclient:
enabled: false
max-connections: 200 # 最大连接数
max-connections-per-route: 30 # 每个请求的最大连接数
okhttp:
enabled: true