1、前言
SpringCloud 是现在比较流行的微服务架构,随着微服务的流行,更多企业也从传统的架构向微服务架构转型。转型的过程中,为了兼容之前的服务架构,部分企业选择了双注册中心(指Dubbo和Cloud)。所以开发者在改造的时候,非常掣肘,只能在原来的基础上做一些调整。最后代码看起来有点似驴非马的感觉,当然这是对于一个有代码洁癖的人的感觉,哈哈哈。。。功能当然是完全OK的。
2、SpringCloud初体验
用过SpringCloud的朋友们都知道,Cloud通过FeignClient对外提供服务。该项目也是一个独立的SpringBoot项目,可以通过页面直接访问控制层。
通过FeignClient和Controller层的对比,你会发现两边的代码相似度特别高。如图:
我们会发现:Controller其实是对Feign客户端的接口实现。
3、SpringCloud的优雅实现过程
问题:①Controller直接去实现Feign客户端,Controller的方法你能不能映射到对用的url?如图:
②如果可以,这个是FeignClient注解的功能还是接口本身的功能?
Controller直接实现FeignClient,这个SpringCloud官方已经给出了文档,如图:
通过启动日志,我们能看到url是可以映射的,而且访问正常,如图:
要验证是不是FeignClient是否提供的功能,只需要把@FeignClient注解注释掉,你会发现,everything is OK。所以控制能使用接口的映射是接口特有的功能。
下来我们来看看,为什么控制层可以拿到接口的注解。
我们都知道springboot不是新的框架,只是对springmvc框架做了整合。获取映射的url,我们需要追踪RequestMappingHandlerMapping这个类。通过源码追踪,如图:
通过源码我们可以看到:当前类的注解拿不到时,会获取被实现接口的注解,如果还拿不到在获取父类的注解。
到这里我们就知道映射的内幕了。这样以来,我们就可以直接实现FeignClient的接口,省去重复的代码。这样我们的代码就会变得很优雅。
4、总结
优化的实现方式虽然简化代码,但是增加了FeignClient的和Controller的是耦合性,很多人不建议如此操作。至于现实中如何优雅的操作,就仁者见仁,智者见智了。