天天看点

Dubbo框架介绍及应用

作者:Undo

Dubbo简介

首先,我们学习一项新技术,脑海里面第一反应,这个东西是什么,有何特性,能干什么?

百度百科给出的回答:

Dubbo框架介绍及应用

1.Dubbo是什么?

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用,以及SOA服务治理方案。

2.Dubbo有何特性?

Dubbo框架介绍及应用

Dubbo快速入门

Dubbo开源代码提供演示demo,我们这里就以它为例子,实现快速入门。

项目结构如图所示:

Dubbo框架介绍及应用

Dubbo快速入门(第一步)

定义服务接口:该接口需单独打包,在服务提供方和消费方共享

Dubbo框架介绍及应用
Dubbo框架介绍及应用

Dubbo快速入门(第二步)

在服务提供方提供接口的实现:DemoServiceImpl,接口中的方法的具体实现在此类中提供具体的逻辑处理。

Dubbo框架介绍及应用
Dubbo框架介绍及应用

服务提供者配置信息

dubbo.application.name=dubbo-demo-annotation-provider
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880           
Dubbo框架介绍及应用

Dubbo快速入门(第三步)

配置服务消费者

消费者配置信息:

dubbo.application.name=dubbo-demo-annotation-consumer

dubbo.registry.address=zookeeper://127.0.0.1:2181

Dubbo框架介绍及应用

好了上面就是dubbo简单的入门工作。

Dubbo架构设计浅析

Dubbo框架介绍及应用

节点说明

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()方法中。

Dubbo框架介绍及应用

初始化操作

dobbo初始化的过程,如:

Dubbo框架介绍及应用

服务暴露过程,如:

Dubbo框架介绍及应用

ServiceConfig

Dubbo框架介绍及应用

将服务注册到注册中心去

Dubbo框架介绍及应用

注册过程

1.将服务注册到注册表

2.通知订阅者注册表变动

Dubbo框架介绍及应用

服务暴露

Dubbo框架介绍及应用

消费者启动过程

AbstractAnnotationBeanPostProcessor

Dubbo框架介绍及应用

消费者注入bean过程

ReferenceAnnotationBeanPostProcessor

Dubbo框架介绍及应用

注册服务进注册表

Dubbo框架介绍及应用

Dubbo SPI 机制扩展注册中心

Dubbo框架介绍及应用

SPI(Service Provider Interface),是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。

整体机制图如下:

Dubbo框架介绍及应用

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实现的注册中心

Dubbo框架介绍及应用
Dubbo框架介绍及应用

继续阅读