Feign基本使用
目录
- Feign基本使用
- 一、Feign代替RestTemplate
- 二、自定义配置
- 三、Feign使用优化
- 1. 底层优化
- 2. 日志优化
- 四、最佳实践
- 方式一:继承
- 方式二:抽取
一、Feign代替RestTemplate
步骤:
-
引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
-
启动类上添加注解@EnableFeignClients
-
编写Feign客户端
@FeignClient("userService") public interface UserApi { @GetMapping("/user/{id}") User findById(@PathVariable Long id); }
-
使用
这是RestTemplate的代码
@Service public class OrderService { @Autowired private OrderMapper orderMapper; @Autowired RestTemplate restTemplate; public Order queryOrderById(Long orderId) { // 1.查询订单 Order order = orderMapper.findById(orderId); // 2.调用REST接口查询数据 User user = restTemplate.getForObject("http://userService/user/" + order.getUserId(), User.class); // 3.封装数据 order.setUser(user); // 4.返回 return order; } }
这是Feign的代码:
@Service public class OrderService { @Autowired private OrderMapper orderMapper; @Autowired UserApi userApi; public Order queryOrderById(Long orderId) { // 1.查询订单 Order order = orderMapper.findById(orderId); // 2.调用REST接口查询数据 User user = userApi.findById(order.getUserId()); // 3.封装数据 order.setUser(user); // 4.返回 return order; } }
代码可读性更高了,并且自带负载均衡。
二、自定义配置
feign可以自定义配置一些东西:
springboot中配置一般都是两种方式,代码或者application.yml
-
代码
@Bean public Logger.Level feignLogLevel() { return Logger.Level.FULL; }
若是全局生效,需要在启动类的注解中加上该配置类:
@EnableFeignClients(defaultConfiguration = CustomConfiguration.class)
若是局部,只需要在对应的客户端中声明:
@FeignClient(value = "userService", configuration = CustomConfiguration.class)
-
application.yml
配置文件同样也可以配置全局或者局部
全局:
feign: client: config: default: # 这个就是区分全局或者局部的 若是default则是全局 logger-level: full
局部:
feign: client: config: userService: # 这个就是区分全局或者局部的 若是default则是全局 logger-level: full
三、Feign使用优化
1. 底层优化
Feign底层实现默认是URLConnection,不支持连接池,效率低。
我们可以选择Apache HttpClient或是OKHttp(俩都支持连接池)来优化Feign的性能。
以HttpClient为例:
-
引入依赖
<dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency>
-
配置连接池
feign: httpclient: enabled: true # 开启feign对httpclient的支持 max-connections: 200 # 最大连接数 max-connections-per-route: 50 # 每个路径最大连接数
2. 日志优化
简单说就是使用NONE级别或是BASIC级别,级别高了消耗性能。
四、最佳实践
方式一:继承
给消费者的FeignClient和提供者的Controller定义一个统一的父接口作为标准。
缺点:紧耦合
方式二:抽取
就是搞一个公共的模块,把多个微服务都需要的接口写在里面,需要使用时引入即可。
缺点就是会引入很多不用的东西。
实现:
-
创建新的公共模块,导入feign的依赖,创建普通maven项目即可,不然打包时有坑。
-
将order-service中的Feign客户端、实体类、Feign的配置等移入该公共模块
-
在order-service中引入该公共模块
如:
<dependency> <groupId>com.example</groupId> <artifactId>feign-api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
-
指定客户端
两种方式
-
扫描包,全部导入
@EnableFeignClients(basePackages = "com.example.feignapi.apis")
该包下的所有feign客户端都会被扫描
-
指定客户端导入
@EnableFeignClients(clients = {UserAPI.class})
指定客户端,可以是一个数组
建议使用第二种。
-
-
测试