现在微服务的概念已经很普遍了,目前的微服务框架主要有Dubbo、DubboX和Spring Cloud,关于Spring Cloud可以参考我的另一篇文章 关于Spring Cloud 的记忆 。本篇文章主要以Dubbo为例展开说明,在进行Dubbo模块之前,我们来说一下为什么要对系统进行拆分,简单来说可以总结为一下几点
当拆分的服务规模比较小的时候,各个模块之前可以直接通过http协议来进行通讯,但是http接口通信维护起来的成本是非常高的,我们得需要考虑超时重试、负载均衡等等各种分布式中的问题,所以这个时候就可以引入dubbo了,我们可以像调用本地接口一样来调用远程接口,dubbo会代理这个调用请求,去跟远程机器进行网络通信,同时可以解决负载均衡、超时重试等一些常见的问题。
RPC全名是Remote Procedure Call,远程过程调用,是一种通过网络从远程计算机上请求服务而不需要了解底层网络技术的协议。比如A、B两个服务部署在不同的服务器上,如果服务A想要来调用服务B的话,可以直接通过http来请求,我们在上面也说了,http存在很多问题,所以RPC的出现就解决了这些问题。RPC框架的调用过程。
当然任何框架,官方的文档是最详细的,大家也可以去了解一下dubbo的官方文档 dubbo.apache.org/en-us/
节点 | 角色说明 |
---|---|
Provider | 服务提供者 |
Consumer | 服务消费者 |
Registry | 服务注册发现中心 |
Monitor | 监控中心 |
Container | 服务运行容器 |
调用关系说明:
0.服务容器负责启动,加载,运行服务提供者。
1.服务提供者在启动时,向注册中心注册自己提供的服务。 2.服务消费者在启动时,向注册中心订阅自己所需的服务。 3.注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4.服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5.服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心,并以报表的形式展开
图中从上到下分为十层,各层均为单向依赖,右边的黑色箭头代表各层之间的依赖关系,其中Service和Config层为API,其他各层均为SPI。
第一层:service层,接口层,给服务提供者和消费者来实现的
第二层:config层,配置层,主要是对dubbo进行各种配置的
第三层:proxy层,服务代理层,透明生成客户端的stub和服务端的skeleton
第四层:registry层,服务注册层,负责服务的注册与发现
第五层:cluster层,集群层,封装多个服务提供者的路由以及负载均衡,将多个实例组合成一个服务
第六层:monitor层,监控层,对rpc接口的调用次数和调用时间进行监控
第七层:protocol层,远程调用层,封装rpc调用
第八层:exchange层,信息交换层,封装请求响应模式,同步转异步
第九层:transport层,网络传输层,抽象mina和netty为统一接口
第十层:serialize层,数据序列化层
从上面的通信协议我们可以知道,基于不同的通信协议,dubbo支持hessian、java二进制序列化、json、SOAP文本序列化多种序列化协议。但是hessian是其默认的序列化协议。
dubbo框架为服务集群容错提供了一系列好的解决方案,在此称为dubbo服务集群容错模式。
SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。SPI 机制在第三方框架中也有所应用,比如 Dubbo 就是通过 SPI 机制加载所有的组件。不过,Dubbo 并未使用 Java 原生的 SPI 机制,而是对其进行了增强,使其能够更好的满足需求。
JDK 标准的 SPI 会一次性实例化扩展点所有实现,如果有扩展实现初始化很耗时,但如果没用上也加载,会很浪费资源。Dubbo 并未使用 Java SPI,而是重新实现了一套功能更强的 SPI 机制。Dubbo SPI 的相关逻辑被封装在了 ExtensionLoader 类中,通过 ExtensionLoader,我们可以加载指定的实现类。Dubbo SPI 所需的配置文件需放置在 META-INF/dubbo 路径下。
更多可以参考 理解Dubbo的SPI机制
注册中心有Multicast、Zookeeper、Nacos等,但是Dubbo官方推荐使用Zookeeper,所以在本文也使用Zookeeper,zk是Apacahe Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心。下篇文章会对Zookeeper做详细的介绍,大家可以持续关注
项目地址: