什么是Dubbo
Dubbo是 阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。目前 Dubbo 已经成为 Spring Cloud Alibaba 中的官方组件。
RPC原理
- 服务消费方(client)调用以本地调用方式调用服务;
- client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;
- client stub找到服务地址,并将消息发送到服务端;
- server stub收到消息后进行解码;
- server stub根据解码结果调用本地的服务;
- 本地服务执行并将结果返回给server stub;
- server stub将返回结果打包成消息并发送至消费方;
- client stub接收到消息,并进行解码;
- 服务消费方得到最终结果。
简化流程
- provider向注册中心去注册
- consumer从注册中心订阅服务,注册中心会通知consumer注册好的服务
- consumer调用provider
- consumer和provider都异步通知监控中心
Dubbo分层结构
- 第一层:service层,接口层,给服务提供者和消费者来实现的
- 第二层:config层,配置层,主要是对dubbo进行各种配置的
- 第三层:proxy层,服务接口透明代理,生成服务的客户端 Stub 和服务器端 Skeleton
- 第四层:registry层,服务注册层,负责服务的注册与发现
- 第五层:cluster层,集群层,封装多个服务提供者的路由以及负载均衡,将多个实例组合成一个服务
- 第六层:monitor层,监控层,对rpc接口的调用次数和调用时间进行监控
- 第七层:protocol层,远程调用层,封装rpc调用
- 第八层:exchange层,信息交换层,封装请求响应模式,同步转异步
- 第九层:transport层,网络传输层,抽象mina和netty为统一接口
- 第十层:serialize层,数据序列化层,网络传输需要
集群容错
- Failover :失败自动切换,自动重试其他服务器
- Failfast :快速失败,立即报错,只发起一次调用
- Failsafe :失败安全。出现异常时,直接忽略
- Failback :失败自动恢复,记录失败请求,定时重发
- Forking : 并行调用多个服务器,只要一个成功即返回
- Broadcast : 广播逐个调用所有提供者,任意一个报错则报错
负载均衡
- Random LoadBalance
- RoundRobin LoadBalance
- LeastActive LoadBalance : 最少活跃调用数
- ConsistentHash LoadBalance : 相同参数的请求总是发到同一提供者
SPI
SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。
服务发布
服务的发布总共做了以下几件事,这个也可以从日志log上看出来:
- 暴露本地服务
- 暴露远程服务
- 启动netty
- 连接zookeeper
- 到zookeeper注册
- 监听zookeeper