和Spring Cloud微服务熟悉的过程(5)
基于Feign的服务调用
之前我们提到了诸如RestTemplate之类的服务调用组件,那么为什么还要再提一个新的服务调用组件呢?
回到之前咱们说过的RestTemplate,如果用它的话,我们调用服务的代码大致是这样的:
public Product buyById( Long id) {
return restTemplate.getForObject("http://localhost:9003/product/"+id, Product.class);
}
或者是这样的:
public Product buyByIdWithEurekaRibbon( Long id) {
return restTemplate.getForObject("http://service-product/product/"+id, Product.class);
}
前者我们是直接将目标服务提供者的IP和端口硬编码写进去,后者是从Ribbon获取目标服务提供者的IP和端口。我们拿着IP和端口,再手动拼接上所需要的参数,拿着拼接好的URL去发起请求,一旦含有多个参数的时候,这个拼接的过程将会非常痛苦。所以我们有了另一个更优雅的服务调用工具Feign。Feign是Netflix开发的声明式,模板化的HTTP客户端,可帮助我们更加便捷,优雅的调用HTTP API。SpringCloud对Feign进行了增强,使Feign支持了SpringMVC注解,并整合了Ribbon和Eureka, 从而让Feign的使用更加方便。
首先添加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
然后在启动类上开启Feign:
@EnableFeignClients
创建一个Feign接口,此接口是Feign中调用微服务的核心:
/**
* 使用Feign来调用http服务接口
*/
public interface ProductFeignClient {
public Product buyByIdWithFeign( Long id);
}
上方的注解中的name参数相当于直接从ribbon获取了域名和端口,下方再填充好url,指定好http方法即可。
最后,我们将刚才创建的Feign接口自动注入到Controller中,并完成服务的调用:
public Product buyByIdWithEurekaRibbonFeign( Long id) {
return productFeignClient.buyByIdWithFeign(id);
}
除了上面所述的Feign的基础用法以外,Feign还支持其他的高级功能,例如请求压缩和请求日志记录。
Spring Cloud Feign 支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。通过下面的参数设定即可开启请求与响应的压缩功能:
feign:
compression:
request:
enabled: true # 开启请求压缩
mime-types: text/html,application/xml,application/json # 设置压缩的数据类型
min-request-size: 2048 # 设置触发压缩的大小下限
response:
enabled: true # 开启响应压缩
默认情况下Feign的日志是没有开启的,可以通过下面的参数开启Feign的日志记录功能:
feign:
client:
config:
shop-service-product:
loggerLevel: FULL #日志级别,FULL为最完整记录响应的header、body等数据
logging:
level:
com.chita.order.feign.ProductFeignClient: debug #Feign日志只会对日志级别为debug的做出响应