【Spring cloud 系列】:Spring Cloud Feign 服务间调用(04)
一、概述
上一章已经看到 Eureka client 是如何注册了 Eureka Server 中去的,在本文中将讲解 服务间如何进行调用,在上一章已经提到 microserver-user-api会对外提供服务进行服务间调用,在本章将用到 microserver-test 进行服务间调用, 再次声明:作者能力有限,表达能力不足,这里将不会讲述概念性的讲解,想了解概念的朋友可自行百度查阅或官网查阅自行理解,同时尽可能的照顾到新人朋友,教大家如何从官网中学习一门技术,如有错误的地方希望大家指出共同进步。
本文所有Demo都将上传至GitHub中方便各位朋友查看学习,如您对本人的编码风格或其他建议可以联系博主。
二、目录结构
三、如何使用 Spring Cloud OpenFeign
1)首先我们去官网介绍 Spring Cloud OpenFeign 中去了解下如何使用 OpenFeign,通过官网的介绍我们发现需要引入spring-cloud-starter-openfeign 包,并且看到在启动类中多了个 @EnableFeignClients 注解。 从该注解的名字中我们大概已经猜出此注解的大概用途,接下来我们将根据官网文档进行下一步延伸学习服务间是如何进行调用。
2)在下面这张图片中可以看到 这里在我们看到了熟悉的注解 @RequestMapping 和这个比较陌生的 @FeignClient,通过官网的介绍,我们大致了解到@FeignClient 的value值指的是任意的客户端的名称,还有url 用来指定一个主机地址,其他属性就不在做过多介绍了,有兴趣的朋友自行了解,官网给的这段介绍中有段非常重要的描述在下文红色区域进行描述,在这段描述中我们看到这样的一段描述,如果你使用的是 Eureka Client 呢么将自动从 Eureka Server 注册表中获取服务,呢么这段描述我们可以理解为 Feign 默认是集成了 Eureka ,接下来我们来看下 为什么FeignClient 可以使用 Spring MVC 中的注解 @RequestMapping
3)在官网文档中我们看到Feign 使用的一些默认配置,在下图中我们看到Contract 使用的契约为 SpringVmcContract 因此在Feign 可以使用Spring MVC 注解,当然既然提供了这些默认的配置,呢么也是允许我们进行修改的,在本文中将不做详细介绍,感兴趣的朋友可以自行研究 ^_^ 毕竟使用 Spring MVC 的还是比较多的,接下来我们来看下官网给出的Feign 的配置信息。
4)从下图中的代码我们可以看到Feign 是如何进行配置的例如超时时间等等的设置,这里将不对这写配置信息进行讲解,有兴趣的朋友可以自行了解下,我们只了解Feign yml大概有哪些配置信息,了解完这些信息我们就可以对之前的 microserver-user 服务进行改造
5)根据官网提供的文档描述接下来我们将改造 microserver-user 服务
a.首先在我们启动类增加 @EnableFeignClients 注解
b.接下来对我们的接口进行改造,在这里细心的朋友可能看到,我这里写的与官网有点不太一样,为什么这里写了value,我们去看下FeigClient 注解的源码就一切都明白了,
Service_APP_ID 则是我们注册到 Eureka Server 中的服务名,改造完这些我们就需要去yml 中对 Feign 进行某些配置信息
c. yml的配置,由于目前还为整合 hystrix 所以根据官网的描述,我们还是先将 hystrix 功能进行关闭
feign: hystrix: enabled: false
做完这些我们基本上就已经对 microserver-user 服务 服务改造完毕,接下来我们将编写 microserver-test 服务,进行服务间调用
四、使用 Spring Cloud OpenFeign 进行服务间调用
Spring Cloud OpenFeign 该如何使用在上文中已经讲解到,这里就不在描述,直接编写 microserver-test 服务尝试进行服务间调用,为了更好的演示,将编写一个 Controller 接口更直观的看结果。
1)首先在 test 项目中引入 microserver-user-api
<dependency> <groupId>com.carl.microserver.app</groupId> <artifactId>microserver-user-api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
2)编写Controller,我这里的 TestUserService 已经编写好的,所以。。。直接给上代码
@RestController @ResponseStatus(HttpStatus.OK) public class TestUserServerController { @Autowired private TestUserService testUserService; @RequestMapping(method = RequestMethod.GET,value = "/find") public List<String> findUser(){ return testUserService.findUser(); } }
3)编写 TestUserService ,大家可能有些疑惑为什么没有看到Feign 相关的东西,怎么又注入了个 UserService,接下来我们将讲解为什么要使用这种写法,ps:可能有更好的写法。如果您对本人编码上有疑问或建议的话希望可以指出,一切都为了共同进步。
@Service public class TestUserService { @Autowired private UserService userService; public List<String> findUser(){ return userService.findUser(); } }
4)编写 UserService 接口,这里我们又看到了熟悉的注解 FeignClient 同时也看到了上文 microserver-user 服务中提供的接口与 APP ID,服务名
@FeignClient(value = MicroServerUserConstants.SERVICE_APP_ID) public interface UserService extends UserRemontRestService { }
下图中我们可以看到 remote包下的UserService同时也看到了Hystrix 包,下一篇博文中将会讲到 Feign 如何使用 Hystrix 熔断器 不了解的朋友可以先行度娘下Hystrix的概念
5)演示,首先我们先将服务都注册到 Eureka Server 中,下图中我们看到 test 服务的端口号 8000,user 服务的端口号 8080,然后访问test 的find 接口看看效果。
五、Spring Cloud Feign 调用日志与压缩
1)Feign 的压缩默认为NONE,在实际应用中我们可能需要看到更详细的信息这时我们就需要对 Feign 进行配置,我们先看看官方文档是如何说明的
通过上图,我们可以看到官方给出的日志方案,接下来我们的项目需要进,根据下图效果我们可以看到了调用信息
2)Feign 对压缩的支持,根据官方文档了解到Feign对压缩的支持非常简单,只需要开启对应的配置就可以搞定,接下来根据官网的描述修改我们自己的yml 配置
在下图中可以看到按照官方文档的描述修改了配置文件,在下面的代码中朋友可能看到,开启对压缩的支持在项目启动时会抛出异常信息,不过在作者写这篇博客的时候
该问题已经得到答案,接下来看下项目中所抛出的异常信息
################################################# # # # 下面这段对Feign 压缩的配置 会抛出异常信息,目前没有找到解决方案 # 问题已提交至 GitHub 等待 Contributor 给出解决方案 ################################################# feign: hystrix: enabled: true # 开启 Feign 对 Hystrix 的支持 compression: request: enabled: true # 开启对 request 请求压缩 mime-types: - text/xml - application/xml - application/json # 指定压缩格式 min-request-size: 2048 # 压缩的最小阀值,默认 2048,超过2048 (字节) 进行压缩。 response: enabled: true # 开启对 response 的压缩
根据GitHub上的描述,在 1.4.4 版本以下使用的是 ApacheHttpClient 然而在 1.4.4 以上版本(含1.4.4)则改为 OkHttpClient,对此作者也对源码进行了验证在下图中也可以看到
既然找到问题所在,呢么就该处理掉这种问题,在查看我们的Maven包中发现,然而我们并没有引入 OkHttpClient 相关的jar包,接下来将 okhttp jar包引入到本地项目中,在看看效果
这时候我们可以去看看核心包里的的pom 信息里面找找看有没有 okhttp 的Maven地址,一般来说必须要有的。。。。
博主在这里需要对刚入门的朋友语重心长的说一句话了。。如果想学习一门技术的话最好先看一看官网信息,看看各版本都对那些地方做了修改或优化,不然在搭建的时候需要浪费很多时间去处理一些不必要的问题。。。博主有点懒不喜欢看这些东西,所以在尝鲜过程中遇到了一些坑。。
六、使用Ribbon负载均衡
1)由于Ribbon太过简单所以不开一篇新的博客,在本文中带过,先看看官网的描述,根据官网的描述Feign 默认是使用 Ribbon的,所以我们可以直接将对应的jar包引入
来实现负载均衡
2)如何修改 负载均衡策略,根据官网的描述我们可以使用下图红线中的方式进行修改负载均衡的策略,接下来我们来尝试下
3)修改本地策略,在这里就不给大家看测试效果了,有兴趣的朋友可以自行尝试
microserver-user:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
顺便看看 Ribbon Rule 有哪些规则,同样也是有兴趣的朋友可以具体去了解下这些规则 ^ ^ 博主表达能力有限,怕描述的不是很准确被打脸,