和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的做出响应
