vlambda博客
学习文章列表

和Spring Cloud微服务熟悉的过程(5)

  • 基于Feign的服务调用

之前我们提到了诸如RestTemplate之类的服务调用组件,那么为什么还要再提一个新的服务调用组件呢?

回到之前咱们说过的RestTemplate,如果用它的话,我们调用服务的代码大致是这样的:

@RequestMapping(value = "/buy/{id}", method = RequestMethod.GET)public Product buyById(@PathVariable Long id) { return restTemplate.getForObject("http://localhost:9003/product/"+id, Product.class);}

或者是这样的:

@RequestMapping(value = "/buy-eureka-ribbon/{id}", method = RequestMethod.GET)public Product buyByIdWithEurekaRibbon(@PathVariable 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服务接口 */@FeignClient(name = "service-product", fallback = ProductFeignClientCallback.class)public interface ProductFeignClient { @RequestMapping(value = "/product/{id}", method = RequestMethod.GET) public Product buyByIdWithFeign(@PathVariable("id") Long id);}

上方的注解中的name参数相当于直接从ribbon获取了域名和端口,下方再填充好url,指定好http方法即可。

最后,我们将刚才创建的Feign接口自动注入到Controller中,并完成服务的调用:

@RequestMapping(value = "/buy-eureka-ribbon-feign/{id}", method = RequestMethod.GET)public Product buyByIdWithEurekaRibbonFeign(@PathVariable 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的做出响应