格物致知,格Feign。 参考下,了解一下Feign到底能干啥:Feign正确的使用方式
关注的重点仅仅是简化http调用代码的编写。 如果采用httpclient或者okhttp这样相对较重的框架,对初学者来说编码量与学习曲线都会是一个挑战,而使用spring中RestTemplate,又没有配置化的解决方案,由此想到是否可以脱离spring cloud,独立使用Feign
添加Feign依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
- 创建一个Feign接口,并添加@FeignClient注解。
在@FeignClient注解中的user-service/ycq是访问user-service这个微服务的客户端名称+上下文,因为后面省略掉了这一块儿,所以肯定要提前配置好。它用于创建Ribbon负载均衡器。这里的user-serive是Eureka Server服务注册表中的服务。如果不想用Eureka,还阔以使用url属性配置服务列表。如@FeignClient(name=’user-service’, url=’http://localhost:8000/“)
@FeignClient(name = "user-service/ycq")
public interface UserFeignClient {
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public User findById(@PathVariable("id") Long id);
}
- 修改Controller代码,让其调用Feign接口
@Autowired
private UserFeignClient userFeignClient;
@GetMapping("/user/{id}")
public User findById(@PathVariable Long id) {
// return this.restTemplate.getForObject("http://user-service/ycq/" + id, User.class);
return this.userFeignClient.findById(id);
}
- 修改启动类,添加@EnableFeignClients注解
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class MovieApp
{
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main( String[] args )
{
SpringApplication.run(MovieApp.class, args);
}
}
Feign对压缩的支持
一般微服务中如果传输数据大,在并发量比较大的情况下,带宽占用很严重。Feign支持的压缩可以配置最小阈值,指定超过多少大小的指定类型(请求头响应头mime-type=text/xml,application/xml,application/json)的数据进行压缩。Spring Cloud Camden SR4不生效的情况,可以参考。本人看的书的作者已经反映了问题: https://github.com/spring-cloud/spring-cloud-netflix/issues/1580
Feign的日志
可以为每个Feign客户端指定日志记录策略,每个Feign客户端都会创建一个logger。默认情况下,logger的名称时Feign接口的完整类名。
需要注意的是,Feign日志打印只会对DEBUGGER级别做出响应。
Feign对日志处理分四种策略:
- NONE
- BASIC 记录请求方法 + URL + 响应状态 + 执行时间
- HEADERS BASIC + header
- FULL HEADERS + body + 元数据
事上练
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
// 这是用来测试feign 和@FeignClient 注解的接口同时使用
public class MovieApp
@Configuration
public class FeignLogConfiguration {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
@FeignClient(name = "user-service/ycq", configuration = FeignLogConfiguration.class)
public interface UserFeignClient {
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public User findById(@PathVariable("id") Long id);
}
// Controller中
@Autowired // 使用@FeignClient 时使用
private UserFeignClient userFeignClient;
@GetMapping("/user/{id}")
public User findById(@PathVariable Long id) {
// return this.restTemplate.getForObject("http://user-service/ycq/" + id, User.class);
return this.userFeignClient.findById(id);
}
logging:
level:
com.ycq.Film.UserFeignClient: DEBUG
最终控制台输出结果:
2018-04-12 22:49:35.041 DEBUG 5452 — [r-service/ycq-1] com.ycq.Film.UserFeignClient : [UserFeignClient#findById]
<— HTTP/1.1 200 (868ms)
content-type: application/json;charset=UTF-8
date: Thu, 12 Apr 2018 14:49:35 GMT
transfer-encoding: chunked
x-application-context: user-service:8000
{“id”:1,”username”:”account1”,”name”:”张三”,”age”:20,”balance”:100.00}
<— END HTTP (72-byte body)