Dubbo

目录

官网文档

工作原理

工作流程

注册中心挂了可以继续通信吗?

通信协议

序列化协议

Hession数据结构

为什么 PB 的效率是最高的?

负载均衡

集群容错

动态代理

SPI


官网文档

dubbo源码官方解读

工作原理

第一层:service 层,接口层,给服务提供者和消费者来实现的
第二层:config 层,配置层,主要是对 dubbo 进行各种配置的
第三层:proxy层,服务代理层,无论是consumer还是provider,dubbo都会给你生成代理,代理之间进行网络通信
第四层:registry 层,服务注册层,负责服务的注册与发现
第五层:cluster 层,集群层,封装多个服务提供者的路由以及负载均衡,将多个实例组合成一个服务
第六层:monitor 层,监控层,对rpc接口的调用次数和调用时间进行监控
第七层:protocal 层,远程调用层,封装rpc调用
第八层:exchange 层,信息交换层,封装请求响应模式,同步转异步
第九层:transport 层,网络传输层,抽象mina和netty为统一接口
第十层:serialize 层,数据序列化层

工作流程

第一步:provider 向注册中心去注册
第二步:consumer 从注册中心订阅服务,注册中心会通知 consumer 注册好的服务
第三步:consumer 调用 provider
第四步:consumer 和 provider 都异步通知监控中心化层


服务提供者
    服务注册
服务消费者
    订阅服务
注册中心
    通知服务消费者服务注册好了

服务消费者
    动态代理对象
    集群
    负载均衡
    协议(选择一种协议组织请求)
    信息交换(请求封装为Request)
    网络传输(netty)
    序列化
服务提供者
    反序列化
    网络传输(netty)
    信息交换(解析Request)
    协议(选择一种协议解析请求)
    动态代理对象
    

底层网络通信机制原理

服务提供者
    Selector
    SocketChannel

服务消费者
    Selector
    SocketChannel

NIO

注册中心挂了可以继续通信吗?

可以,因为刚开始初始化的时候,消费者会将提供者的地址等信息拉取到本地缓存,所以注册中心挂了可以继续通信。

通信协议

dubbo 协议
    单一长连接,进行的是 NIO 异步通信,基于 hessian 作为序列化协议。使用的场景是:传输数据量小(每次请求在 100kb 以内),但是并发量很高。

rmi 协议
    走 Java 二进制序列化,多个短连接,适合消费者和提供者数量差不多的情况,适用于文件的传输,一般较少用。

hessian 协议
    走 hessian 序列化协议,多个短连接,适用于提供者数量比消费者数量还多的情况,适用于文件的传输,一般较少用。

http 协议
    走 json 序列化

webservice
    走 SOAP 文本序列化

序列化协议

hession(默认)
Java二进制序列化
json
SOAP 

Hession数据结构

Hessian 的对象序列化机制有 8 种原始类型:
        原始二进制数据
        boolean
        64-bit date(64 位毫秒值的日期)
        64-bit double
        32-bit int
        64-bit long
        null
        UTF-8 编码的 string

另外还包括 3 种递归类型:
        list for lists and arrays
        map for maps and dictionaries
        object for objects

还有一种特殊的类型:
        ref:用来表示对共享对象的引用

为什么 PB 的效率是最高的?

可能有一些同学比较习惯于 JSON or XML 数据存储格式,对于 Protocol Buffer 还比较陌生。Protocol Buffer 其实是 Google 出品的一种轻量并且高效的结构化数据存储格式,性能比 JSON、XML 要高很多。

其实 PB 之所以性能如此好,主要得益于两个:第一,它使用 proto 编译器,自动进行序列化和反序列化,速度非常快,应该比 XML 和 JSON 快上了 20~100 倍;第二,它的数据压缩效果好,就是说它序列化后的数据量体积小。因为体积小,传输起来带宽和速度上会有优化。

负载均衡

随机(默认,可以加权重)
轮询
最少活跃
hash

集群容错

failover    失败切换
failfast    快速失败
failsafe    失败忽略
failback    失败重发
forking        并行

动态代理

默认使用 javassist 动态字节码生成,创建代理类。但是可以通过 spi 扩展机制配置自己的动态代理策略。

SPI

service provider interface
根据指定的配置或者是默认的配置,去找到对应的实现类加载进来
插件扩展
例如:
        Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
        Protocol 接口,在系统运行的时候,,dubbo 会判断一下应该选用这个 Protocol 接口的哪个实现类来实例化对象来使用。
        它会去找一个你配置的 Protocol,将你配置的 Protocol 实现类,加载到 jvm 中来,然后实例化对象,就用你的那个 Protocol 实现类就可以了。
        如何自己扩展dubbo中的组件:
        自己写个工程,要是那种可以打成 jar 包的,里面的 src/main/resources 目录下,搞一个 META-INF/services,里面放个文件叫:com.alibaba.dubbo.rpc.Protocol,文件里搞一个my=com.bingo.MyProtocol。自己把 jar 弄到 nexus 私服里去。
        然后自己搞一个 dubbo provider 工程,在这个工程里面依赖你自己搞的那个 jar,然后在 spring 配置文件里给个配置:
        <dubbo:protocol name=”my” port=”20000” />
        provider 启动的时候,就会加载到我们 jar 包里的my=com.bingo.MyProtocol 这行配置里,接着会根据你的配置使用你定义好的 MyProtocol 了,这个就是简单说明一下,你通过上述方式,可以替换掉大量的 dubbo 内部的组件,就是扔个你自己的 jar 包,然后配置一下即可。

可扩展性

面向接口编程

灵活可配置的接口实现机制


    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值