Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign
作用就是帮助我们优雅的实现http请求的发送,替代RestTemplate远程调用的方式。
一、定义和使用 Feign 客户端
1.引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
2.在启动类中添加注解 @EnableFeignClients
@SpringBootApplication
@EnableFeignClients
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class,args);
}
}
3.编写Feign客户端,接口方法需要和服务提供者保持一致
@FeignClient("provider")
public interface ProviderFeign {
@RequestMapping("user/{id}")
String user(@PathVariable("id") Integer id);
}
服务提供者方的Controller:
@RestController
public class ProviderController {
@Autowired
private ProviderService providerService;
@RequestMapping("user/{id}")
public String user(@PathVariable("id") Integer id){
return providerService.user(id);
}
}
4.在服务消费者通过Feign远程调用服务提供者
@Service
public class ConsumerService {
@Autowired
private ProviderFeign providerFeign;
public String findUserById(Integer id) {
return providerFeign.user(id);
}
}
二、自定义Feign配置
配置Feign日志,日志包含四种不同的级别:NONE、BASIC、HEADERS、FULL
推荐使用NONE、BASIC,可以优化Feign的性能。
1.配置文件形式,在application.yml中修改
全局生效
feign:
client:
config:
default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
loggerLevel: FULL # 日志级别
局部生效
feign:
client:
config:
provider: # 这里用provider是服务名称,是针对某个微服务的配置
loggerLevel: FULL # 日志级别
2.Java代码配置方式
@Configuration
public class FeignClientConfiguration {
@Bean
public Logger.Level feignLogLevel(){
return Logger.Level.BASIC;
}
}
然后在启动类的 @EnableFeignClients 中指定配置类
全局配置
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
局部配置
@FeignClient(value = "provider", configuration = FeignClientConfiguration.class)
// provider为服务名称
三、Feign性能优化:
Feign底层的客户端实现:
URLConnection:默认实现,不支持连接池
Apache HttpClient :支持连接池
OKHttp:支持连接池
因此优化Feign的性能主要包括: 使用连接池代替默认的URLConnection 日志级别,最好用basic或none
步骤:
1.导入依赖
<!--httpClient的依赖 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
<version>9.5.0</version>
</dependency>
2.配置连接池
feign:
client:
config:
default: # default全局的配置
loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
httpclient:
enabled: true # 开启feign对HttpClient的支持
max-connections: 200 # 最大的连接数
max-connections-per-route: 50 # 每个路径的最大连接数
四、Feign的最佳实践
方式一(继承):给消费者的FeignClient和提供者的controller定义统一的父接口作为标准。
方式二:将FeignClient、POJO、Feign的默认配置都定义到一个项目中,供所有消费者使用。
Idea中可以将FeignClient、POJO、Feign的默认配置,定义在同一个module中,在需要注入的微服务中引入module的依赖。
当FeignClient定义在启动类之外的包中时,需要指定FeignClient所在包
方式一:
@EnableFeignClients(basePackages = "org.example.clients")
方式二:
@EnableFeignClients(clients = {ProviderFeign.class})