Dubbo简介
首先,我们学习一项新技术,脑海里面第一反应,这个东西是什么,有何特性,能干什么?
百度百科给出的回答:
1.Dubbo是什么?
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用,以及SOA服务治理方案。
2.Dubbo有何特性?
Dubbo快速入门
Dubbo开源代码提供演示demo,我们这里就以它为例子,实现快速入门。
项目结构如图所示:
Dubbo快速入门(第一步)
定义服务接口:该接口需单独打包,在服务提供方和消费方共享
Dubbo快速入门(第二步)
在服务提供方提供接口的实现:DemoServiceImpl,接口中的方法的具体实现在此类中提供具体的逻辑处理。
服务提供者配置信息
dubbo.application.name=dubbo-demo-annotation-provider
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
Dubbo快速入门(第三步)
配置服务消费者
消费者配置信息:
dubbo.application.name=dubbo-demo-annotation-consumer
dubbo.registry.address=zookeeper://127.0.0.1:2181
好了上面就是dubbo简单的入门工作。
Dubbo架构设计浅析
节点说明
调用关系说明
服务容器负责启动,加载,运行服务提供者
服务提供者启动时,向注册中心注册自己提供的服务。
服务消费者在启动时,想注册中心订阅自己所需的服务
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将长连接推送变更数据给消费者
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用
服务消费者和提供者,在内存中累计调用次数和调用时间,宋史每分钟发送一次数据到监控中心
Dubbo源码解读
dubbo服务整体调用图
各层说明
config 配置层:对外配置接口,以 ServiceConfig, ReferenceConfig 为中心,可以直接初始化配置类,也可以通过 spring 解析配置生成配置类
proxy 服务代理层:服务接口透明代理,生成服务的客户端 Stub 和服务器端 Skeleton, 以 ServiceProxy 为中心,扩展接口为 ProxyFactory
registry 注册中心层:封装服务地址的注册与发现,以服务 URL 为中心,扩展接口为 RegistryFactory, Registry, RegistryService
cluster 路由层:封装多个提供者的路由及负载均衡,并桥接注册中心,以 Invoker 为中心,扩展接口为 Cluster, Directory, Router, LoadBalance
monitor 监控层:RPC 调用次数和调用时间监控,以 Statistics 为中心,扩展接口为 MonitorFactory, Monitor, MonitorService
protocol 远程调用层:封装 RPC 调用,以 Invocation, Result 为中心,扩展接口为 Protocol, Invoker, Exporter
exchange 信息交换层:封装请求响应模式,同步转异步,以 Request, Response 为中心,扩展接口为 Exchanger, ExchangeChannel, ExchangeClient, ExchangeServer
transport 网络传输层:抽象 mina 和 netty 为统一接口,以 Message 为中心,扩展接口为 Channel, Transporter, Client, Server, Codec
serialize 数据序列化层:可复用的一些工具,扩展接口为 Serialization, ObjectInput, ObjectOutput, ThreadPool
服务提供者启动过程
spring 初始化bean上下文周期
sping bean初始化,再最后refresh操作的,会有一个ApplicationEvent事件发出,dubbo DubboLifecycleComponentApplicationListener监听spring 事件,初始化dubbo组件bean的生命周期,如:
服务暴露过程:
正真的初始化在dubbo初始化完成之后,ApplicationEventMulticaster用来通知所有的观察者对象,这里是DubboBootstrapApplicationListener,这里监听到事件,会实现服务提供者相关操作。具体实现暴露服务功能在DubboBootstrap类中的start()方法中。
初始化操作
dobbo初始化的过程,如:
服务暴露过程,如:
ServiceConfig
将服务注册到注册中心去
注册过程
1.将服务注册到注册表
2.通知订阅者注册表变动
服务暴露
消费者启动过程
AbstractAnnotationBeanPostProcessor
消费者注入bean过程
ReferenceAnnotationBeanPostProcessor
注册服务进注册表
Dubbo SPI 机制扩展注册中心
SPI(Service Provider Interface),是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。
整体机制图如下:
Dubbo 的扩展点加载从 JDK 标准的 SPI (Service Provider Interface) 扩展点发现机制加强而来。
Dubbo改进了JDK标准的SPI的所面临的一些问题;
1.JDK 标准的 SPI 会一次性实例化扩展点所有实现,如果有扩展实现初始化很耗时,但如果没用上也加载,会很浪费资源。
2.增加了对扩展点 IoC 和 AOP 的支持,一个扩展点可以直接 setter 注入其它扩展点。
3.如果扩展点加载失败,连扩展点的名称都拿不到了。比如:JDK 标准的 ScriptEngine,通过 getName() 获取脚本类型的名称,但如果 RubyScriptEngine 因为所依赖的 jruby.jar 不存在,导致 RubyScriptEngine 类加载失败,这个失败原因被吃掉了,和 ruby 对应不起来,当用户执行 ruby 脚本时,会报不支持 ruby,而不是真正失败的原因。
基于hazelcast实现的注册中心