1. Service和Config层
为API接口层,是为了让Dubbo使用方方便地发布服务和引用服务;对于服务提供方来说需要实现服务接口,然后使用ServiceConfig API来发布该服务,对于服务消费者来说,使用ReferenceConfig对服务接口进行代理。
其他各层均为SPI(Service provider Interface服务提供者接口)层,SPI意味着下面各层都是组件化的,是可以被替换的,这也是Dubbo设计比较好的一点。Dubbo意味着下面各层都是组件化的,是可以被替换的,这也算Dubbo设计比较好的一点。Dubbo增强了JDK提供的标准SPI功能,增加了对拓展点IOC和AOP的支持,一个拓展点可以使用setter方法注入其他拓展点,并且不会一次性实例化拓展点所有实现类,避免了实现类初始化耗时。
2. Proxy代理层
该层主要是对服务消费端使用的接口进行代理,把本地调用透明的转换为远程调用;另外对服务提供者的服务实现类进行代理,把服务实现类转换为Wrapper类,这是为了减少反射调用,后面会具体详解。Proxy层SPI拓展接口为ProxyFactory,Dubbo提供的实现类主要有JavassistProxyFactory和JdkProxyFactory,用户可以实现ProxyFactory SPI接口,自定义代理服务层的实现。
3. Registry服务注册中心层
服务提供者启动时把服务注册到服务注册中心,消费者启动时会去从服务注册中心获取提供者的地址列表,Registry层主要功能是封装服务地址的注册与发现逻辑,Registry对应的扩展实现为ZookeeperRegistry、RedisRegistry、MuticastRegistry、DubboRegistry等。扩展接口RegistryFactory对应的扩展接口实现为DubboRegistryFactory、RedisRegisterFactory、ZookeeperRegistryFactory。另外该层扩展接口Directory实现类有RegsitryDiretory、StaticDirectory用来透明的把Invoker列表转换为一个Invoker。
4. Cluster路由层
封装多个服务提供者的路由规则,负载均衡、集群容错的实现,并桥接注册中心;扩展接口Cluster对应的实现类有FailoverCluster(失败重试),FailbackCluster(失败自动恢复),FailFastCluster(快速失败)。FailsafeCluster(失败安全)、ForkingCluster(并行调用),负载均衡扩展接口LoadBalance对应的实现类为RandomLoadBalance(随机)、RoundRobinLoadBanlance(轮询)、LeastActiveLoadBalance(最小活跃数)、ConsistentHashLoadBalance(一致性Hash)等。
5. Monitor 监控层
用来统计RPC调用次数和调用耗时时间,扩展接口为MonitorFactory,对应的实现类为DubboMinitorFactory,用户可以自定义扩展接口来实现监控统计策略。
6. Protocol 远程调用层
封装RPC调用逻辑,扩展接口为Protocol,对应的实现有RegistryProtocol、DubboProtocol、InjvmProtocol等。
7. Exchange信息交换层
封装请求响应模式,同步转异步、扩展接口为Exchanger,对应的扩展实现有HeaderExchanger等。
8. Transport网络传输层
Mina和Netty抽象为统一接口,扩展接口为Channel,对应的实现有NettyChannel(默认)、MinaChannel等。扩展接口Transport对应的实现类有GrizzlyTransporter、MinaTransporter、NettyTransproter(默认实现);扩展接口Codec2对应的实现类有DubboCodec、ThriftCodec等。
9. Serialize 数据序列化层
提供一些可复用的工具,扩展接口为Serialization、对应的扩展实现有DubboSerialization、FastJsonSerialization、Hessian2Serialization、JavaSerialization等,扩展接口ThreadPool对应的扩展实现有FixedThreadPool、CachedThreadPool、LimitedThreadPool等。
约定:
在扩展类的 jar 包内 ,放置扩展点配置文件 META-INF/dubbo/接口全限定名
,内容为:配置名=扩展实现类全限定名
,多个实现类用换行符分隔。
示例:
以扩展 Dubbo 的协议为例,在协议的实现 jar 包内放置文本文件:META-INF/dubbo/org.apache.dubbo.rpc.Protocol
,内容为:
xxx=com.alibaba.xxx.XxxProtocol
实现类内容 :
package com.alibaba.xxx;
import org.apache.dubbo.rpc.Protocol;
public class XxxProtocol implements Protocol {
// ...
}
配置模块中的配置
Dubbo 配置模块中,扩展点均有对应配置属性或标签,通过配置指定使用哪个扩展实现。比如:
<dubbo:protocol name="xxx" />
评论前必须登录!
注册