一、Feign(http客户端,替代RestTemplate)
1.1 简介
之前不同的服务之间进行远程调用使用的是RestTemplate。

存在下面的问题:
(1)代码可读性差,编程体验不统一;
(2)参数复杂,URL难以维护。
Feign(发音“奋”)是一个声明式的http客户端,作用是帮助我们便捷地实现http请求的发送。
1.2 使用步骤


上图中写了一个接口UserClient,该接口中包含所有对user-service服务的远程调用,@FeignClient指明服务名,基于SpringMVC的注解(包括@GetMapping,@PathVariable等)声明远程调用的信息。

说明:
@FeignClient注解说明远程调用地服务名称。
例如:
(1)在order-service项目中添加feign客户端依赖并开启自动装配功能

<!--feign客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

(2)在order-service中新建接口声明

import cn.itcast.order.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
(3)在order-service中使用声明的接口发起远程调用

@Autowired
private UserClient userClient;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
User user = userClient.findById(order.getUserId());
order.setUser(user);
return order;
}


1.3 自定义配置

说明:
(1)日志级别
NONE-没有日志
BASIC-记录请求的开始和结束时间及耗时多久
HEADERS-记录请求的开始和结束时及耗时多久、请求头和响应头
FULL-记录请求的开始和结束时、请求头和响应头、请求体和响应体
1.3.1 修改日志文件的级别

例如:
在order-serivce配置,

feign:
client:
config:
default:
loggerLevel: Full


日志查看:



注意:全局配置的注解写在Application类(例如order-service的OrderApplication类)上,局部配置的注解写在Feign的配置类上(例如order-service的UserClient类)。
例如,在order-service中进行配置,
声明一个Bean:

public class DefaultFeignConfiguration {
@Bean
public Logger.Level logLevel(){
return Logger.Level.BASIC;
}
}
加全局有效注解:

@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)
1.4 性能优化
Feign底层的客户端实现(三种模式):

URLConnection性能不太好,也不支持连接池。建立连接池以后可以减少连接创建和销毁的性能损耗(连接创建时要三次握手,断开时要四次挥手)。
对Feign性能的优化,主要是对底层客户端的改变。
另外,Feign的日志级别也会影响性能,最佳是设置为basic或none。

1.4.1 连接池配置

在orderservice服务中加依赖:

<!-- 引入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 # 单个路径的最大连接数
1.5 最佳实践(企业级实践经验)
观察可以看出,order-service发请求的配置与user-service接收的配置一致。
order-service的配置如下:

user-service的配置如下:




2706

被折叠的 条评论
为什么被折叠?



