服务通信和服务治理知识总结
在未引入微服务架构前,服务通信比较简单,使用 RestTemplate
工具和 WebClient
工具可以很简单地发起请求调用。尝试微服务化之后,也就是将服务治理的概念整合到项目后,又加入了 Nacos
组件,同时也依次引入了服务注册和服务发现的机制,此时的服务通信就需要解决由服务名称到 HTTP
请求地址的问题,还需要解决在多个实例中如何选出具体请求实例的问题,并且引入了负载均衡器的内容。
此时,服务通信已经由简简单单的 RestTemplate
工具直接发起请求,变成了图 7-10 中的流程。

完整流程总结如下。
-
服务注册,这是最基础的操作,调用端和被调用端都需要进行服务注册。
-
服务发现,获取可用的实例清单并存储在
serviceInfoMap
变量中。 -
读取
serviceInfoMap
变量中的可用实例列表,并根据负载均衡策略选择具体的调用实例。 -
根据选中的调用实例信息拼接
HTTP
地址并向某一个具体的实例发起HTTP
请求。
在项目启动时已经完成了各个服务实例的注册过程,Nacos Server
中已经有了这些服务实例的信息。不止服务注册,由于自动配置机制的存在,Nacos Service Discovery
类型的 Bean
、RestTemplate
类型的 Bean
、BlockingLoadBalancerClient
类型的 Bean
等都已经构造完成。RestTemplate
类型的 Bean
中也被加入了拦截器,一切准备就绪,就等着开始工作了。
在实际处理服务通信时,依然由 RestTemplate
工具处理,只是它被加入了拦截器,所以最终执行任务的 execute()
方法是 BlockingLoadBalancerClient
类中的。在 execute()
方法中完成了从 Nacos Server
获取服务实例信息(并开启更新线程)、通过负载均衡算法获取一个具体的可用实例、Request
对象的包装、实际发送 HTTP
请求并处理响应的过程。
这就是服务治理和服务通信结合后的完整流程。即使整合的是其他与微服务相关的技术栈和中间件,流程也是类似的。比如,不使用 Alibaba
套件,或者服务中心不使用 Nacos
中间件,或者负载均衡器不使用 Spring Cloud LoadBalancer
。虽然在具体的代码实现上有些区别,但是底层原理和流程依然如此。
第 5~7 章中的内容是微服务架构中最基础、最核心的知识,包括服务注册、服务发现、服务中心、负载均衡,微服务的基础要素都囊括在内。掌握之后会对微服务架构具有更深刻的理解,对掌握微服务架构也有更好的帮助。
为什么说这些知识是最基础、最核心的知识?
因为这些知识是微服务架构的地基,只有地基建好了、打牢固了,才能继续往上建造一幢完美的大厦,而且上述的这些知识是微服务架构中根本少不了的。一个微服务架构的项目中没有分布式事务的处理方案,而选择较轻量级的事务处理方式,是完全可以的。一个微服务架构的项目中不使用链路追踪,也不是什么太大的问题,但是一个微服务架构的项目中没有服务治理,或者服务通信模块不完善,那是不行的。至于后面章节中要整合的 OpenFeign
组件、Spring Cloud Gateway
网关组件、Seata
分布式事务组件、Spring Cloud Sleuth
组件等都是一些锦上添花的技术或组件,可以有针对性地解决架构中的痛点(如 Seata
、Spring Cloud Sleuth
),提升开发人员的编码效率(如 OpenFeign
)。但是真地刨根问底起来,其底层原理依然绕不开第 5~7 章中的内容。由于图片大小限制,在这些章节的图解实例中,都只画了两个服务。在真实的项目开发中,会有更多的服务和实例,也会使用封装度更高一些的框架。但是,核心知识一定要掌握,只有这样才能更好地理解大型项目。强烈建议读者认真地、重点地看一下这几个章节中的内容。