Dubbo简介
Dubbo是一款高性能、轻量级的Java RPC框架,提供三大核心功能:面向接口的远程方法调用、智能容错和负载均衡、以及服务自动注册和发现。简单来说,Dubbo是一个分布式服务框架,致力于提高性能和透明化的PRC远程服务调用方案,以及SOA服务治理方案。
Dubbo实际上是RPC框架,那么什么是RPC?
RPC(Remote Procedure Call)--远程过程调用。一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。比如有A、B两个服务部署在不同的服务器上,如果A想要调用服务B中的某个方法该怎么办,使用HTTP可以,但是比较慢,优化的不是很好,RPC就是解决这个问题。
- 服务方调用本地调用方式调用服务
- client stub接收到调用后,负责将方法、参数等组装成能够进行网络通信的消息体
- client stub找到服务地址,并将消息发送到服务端
- server stub收到消息后进行解码
- server stub根据解码结果,调用本地服务
- 本地服务执行并将结果返回给server stub
- server stub将结果打包成消息发送给client端
- client stub收到消息后进行解码
- 服务消费方得到最终结果
SOA分布式架构, SOA面向服务的架构,也就是把工程按照业务逻辑拆分成服务层,表现层两个工程.服务层中包含业务逻辑,只需要对外提供服务即可.表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现,SOA架构中有两个主要角色: 服务提供者(Provider), 服务使用者(Consumer)
Dubbo架构图
- Provider: 暴露服务的服务提供方
- Consumer: 服务消费方
- Registry: 服务注册和发现中心
- Monitor: 统计服务的调用次数和调用时间的监控中心
- Container: 服务运行容器
4个特点:
- 连通性: provider, consumer, register三者直接都是长连接, 前两者向后者注册和订阅时, 需要向monitor汇报
- 健壮性: 注册中心宕掉, 提供者和消费者仍可以通过缓存进行通信
- 伸缩性: 可以通过增加机器部署实例进行添加新的注册中心和服务提供者
- 升级性: 未来可升级
调用关系说明:
- 服务容器负责启动, 加载, 运行服务提供者
- 服务提供者在启动时, 向注册中心注册自己提供的服务
- 服务消费者在启动时, 向注册中心订阅自己所需的服务
- 注册中心返回服务提供者地址列表给消费者, 如果有变更, 注册中心将基于长连接推送变更数据给消费者
- 服务消费者, 从提供者地址列表中, 基于软负载均衡算法, 选一台提供者进行调用, 如果调用失败, 再选另一台调用
- 服务消费者和服务提供者, 在内存中累计调用次数和调用时间, 定时每分钟发送一次统计数据到监控中心
重点知识总结:
- 注册中心负责服务地址的注册与查找, 相当于目录服务, 服务提供者和消费者只在启动时与注册中心交互, 注册中心不转发请求, 压力较小
- 注册中心, 服务提供者, 服务消费者三者之间均为长连接, 监控中心除外
- 注册中心通过长连接感知服务提供者的存在, 服务提供者宕机, 注册中心将立即推送事件告知服务消费者
- 注册中心和监控中心全部宕机, 不影响已运行的提供者和消费者, 消费者在本地缓存了提供者列表
- 注册中心和监控中心都是可选的, 服务消费者可以直接连服务提供者
- 服务提供者宕掉一台不影响使用, 全部宕掉服务消费者将无法使用, 并无限次重连等待服务提供者恢复
Dubbo负载均衡策略:
负载均衡: 当某个服务的访问请求量特别大, 我们将这个服务部署在多态服务器上, 当客户端发起请求时候, 多态服务器都可以处理这个请求.
分布式: 把整个系统拆分成不同服务, 然后部署在不同的服务器上, 减轻单体服务的压力提高并发量和性能. 比如电商系统可以拆分成订单系统, 商品系统, 登录系统.
- Random LoadBalance(默认, 基于权重的随机负载均衡机制) 随机, 按权重设置随机值
- RoundRobin LoadBalance (基于权重的轮询负载均衡机制) 按公约的权重设置轮询比率
- ConsistentHash LoadBalance (一致性hash) 一致性hash, 相同参数的请求总是发到同一提供者
Zookeeper宕机与Dubbo直连的情况:
在实际生产中, 假如zookeeper注册中心宕掉, 一段时间内服务消费方还是能够调用调用提供方提供的服务, 实际上使用的是本地缓存进行通讯, 只是Dubbo健壮性的一种体现
Dubbo的健壮性表现:
- 监控中心宕掉不影响使用, 只是丢失部分采样数据
- 数据库宕掉后, 注册中心仍能通过缓存提供服务地址查询, 但不能注册新服务
- 注册中心对等集群, 任意一台宕掉后, 将自动切换到另一台
- 注册中心全部宕掉后, 服务提供者和服务消费者仍能通过本地缓存通讯
- 服务提供者无状态, 任意 一台宕掉后, 不影响使用
详情可参考:https://github.com/Snailclimb/JavaGuide/blob/master/docs/system-design/data-communication/dubbo.md
https://dubbo.gitbooks.io/dubbo-user-book/preface/architecture.html