一、快速入门
1.引入Feign依赖
<!--feign客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.实现Feign接口
a.在applaciation类上添加@EnableFeignClients注解,@Import注解@EnableFeignClients告诉框架扫描所有使用注解@FeignClient定义的feign客户端。它又通过注解@Import导入了类FeignClientRegistrar( feign客户端注册器)
b.在orderservice定义Feign客户端接口,该接口指定的是userservice中的一个接口
@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
public User getUser(@PathVariable("id") Long id);
}
3.使用Feign接口
@Autowired
private UserClient userClient;
@GetMapping("/getUser")
public User getUser(Long id){
return userClient.getUser(id);
}
首先在OrderController中注入userClient,然后使用userClient直接调用其中定义的方法就行。
二、自定义Feign的配置
1.通过配置文件修改
feign:
client:
config:
default: #这里应该制定调用方的名称,default代表全部
loggerLevel: full # 日志级别
2.通过配置类修改
public class FeignClientConfiguration {
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
添加到@EnableFeignClient注解上或者添加在@FeignClient上
//全局
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
//局部,指定该client的远程调用其它接口的日志级别
@FeignClient(value = "userservice",configuration = FeignClientConfiguration.class)
图解:
三、Feign的性能调优
1.Feign的底层客户端实现
a.UrlConnection 默认使用,不支持连接池
b.Apache HttpClient 支持连接池
c.OkHttp 支持连接池
使用UrlConnection不断地开启关闭连接池会导致资源消耗过大,时间消耗过长,所以说我们采用支持连接池的方式。
<!--引入HttpClient依赖-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
feign:
# client:
# config:
# default: #这里应该制定调用方的名称,default代表全部
# loggerLevel: full # 日志级别
httpclient:
enabled: true
max-connections: 200 # 最大连接数
connection-timeout: 2000 # 连接超时时间
max-connections-per-route: 50 # 每个路由最大连接数
time-to-live: 900000 # 连接空闲时间
time-to-live-unit: MILLISECONDS # 时间单位
2.日志级别
尽量选择none、basic
四、Feign的最佳实践方案
1.controller和FeignClient实现统一接口
优点:我们不用重复代码,可以直接实现接口中的方法,是面向契约的编程思想。
缺点:代码是紧耦合的,并且对SpringMVC中的方法参数是继承不下来的,例如:@PathVariable
2.抽取的思想
优点:我们定义一个新的model,包含一个服务的所有接口的客户端调用,Pojo类,Feign的配置类等。
缺点:我们在导入依赖时,会造成冗余,有我们不需要的代码。
3.抽取的实践
a.新建model:feign-api
b.创建client包,创建暴露的接口对应的client。例如:UserClient
c.创建对应的pojo类
d.创建默认的配置文件,DefaultFeignClientConfiguration类
e.在使用feign-api的项目中引入feign-api的pom依赖。
f.最后需要再使用feign的客户端的@EnableFeignClient中加入clients注解,使UserClients可以被spring扫描到并且注册成bean。
【注】feign的扫包有两种方式:
总步骤图解: