Feign简介
导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
开启Feign功能
@SpringCloudApplication
@EnableFeignClients
public class TestApplication{
public static void main(String[]args){
SpringApplication.run(TestApplication.class,args);
}
}
feign自动集成了Ribbon负载均衡的RestTemplate,所以不需要在进行注册RestTemplate。
@FeignClient(value="service-provider")
public interface TestClient{
@GetMapping("user/{id}")
String queryById(@PathVariable("id")Long id);
}
//于Ribbon写法做对比
@Autowired
RestTemplate rTemplate;
@GetMapping("{id}")
public String queryById(@PathVariable("id") Long id){
String test= this.restTemplate.getForObject("http://service-provider/user/" + id, String.class);
return test;
}
- Feign会通过动态代理生成实现类。
- @FeignClient 声明是一个客户端。同事通过value制定服务名称
- Feign会根据注解生成URL,并访问获取结果。
代码展示
@RestController("consumer/user")
public class TestController{
@Autowired
private TestClient testClient;
@RestController()
public User queryById(@RequestParam("id") Long id){
User user = this.userClient.queryById(id);
return user;
}
}
Hystrix熔断
Feign已经对Hystrix进行了集成,默认为关闭状态。开启Hystrix代码:
feign:
hystrix:
enabled:true #开启熔断
代码
@Controller
public class TestController implement TestClient{
@Override
public String queryById(Long id){
return "服务器繁忙
}
}
@FeignClient(value="service-provider",fallback="TestController .class")
public interface TestClient{
@GetMapping("user/{id}")
String queryById(@PathVariable("id")Long id);
}
请求压缩
Feign支持对请求响应进行GZIP压缩,以减少通信过程中的性能损耗。
feign:
compression:
request:
enabled:true #开启请求压缩
mime-types: text/html,application/xml,application/json # 设置压缩的数据类型
min-request-size: 2048 # 设置触发压缩的大小下限
respones:
enabled:true # 开启响应压缩
日志级别
通过logging.level.xx=debug来设置日志级别。然而这个对Feign客户端来说是不会产生效果的。因为,@FeignClient注解修改的客户端在被代理时,都创建了新的Feign.Logger实例。我们需要额外指定这个日志的级别才可以。
logging:
level:
cn.test:debug
@Configuration
public class FeignLogConfiguration{
@Bean
Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;
}
}
Logger.Level有4中级别:
- NONE:不记录任何日志;默认值
- BASIC:仅记录请求的方法,URL以及响应状态码和执行时间。
- HEADERS:在BASIC的基础上,额外记录了请求和响应头的信息。
- FULL:记录所有请求和响应的明细,包括头信息,请求体,元数据。
@FeignClient(value="service-provider",fallback="TestController .class",configuration=FeignLogConfiguration.class)
public interface TestClient{
@GetMapping("user/{id}")
String queryById(@PathVariable("id")Long id);
}