Dubbo

功能特性

  • 面向接口代理的高性能RPC调用,屏蔽远程调用使用细节。
  • 智能负载均衡。
  • 服务自动注册与发现。
  • 高度可扩展的能力。
  • 运行期流量调度,配置不同的路由规则,实现灰度发布。
  • 可视化的服务治理与运维。

服务注册与发现

img

  • 初始化
    • start:容器启动
    • register:服务提供者将自己提供的服务注册到注册中心。
    • subscribe:服务消费者订阅注册中心所需要的服务。
  • 运行
    • notify:注册中心将服务提供者状态的变更提供给服务消费者。
    • invoke:服务消费者同步调用服务提供者提供的服务(多个服务提供者可调用,根据负载均衡算法随机调用)。
    • count:调用信息发送到监控中心,监控中心监控服务的运行状态。

支持的协议

  • dubbo(推荐),rmi,hessian,http,webservice,thrift,memcached,redis,rest。
  • 服务消费者数量大于服务提供者
    • 服务消费者数量大于服务提供者,压满网卡。
  • 传入传出参数数据包较小(小于100K)
    • 网络将成为瓶颈,传输大包影响TPS。
  • 异步单一长连接
    • 单一连接:保证单一消费者不会压垮提供者。
    • 长连接:减少握手验证。
    • 异步IO,复用线程池:较少CPU消耗,防止C10K问题。
  • 约束
    • 参数及返回值需要实现Serializable接口。
    • 服务器端和客户端的对象按照最大匹配原则匹配。
  • 序列化
    • Hessian二进制序列化

框架设计

名称 说明
服务接口层 与业务逻辑相关
配置层 对外配置接口
服务代理层 服务接口代理
服务注册层 封装服务地址的注册与发现
集群层 封装提供者的路由及负载均衡,桥接注册中心
监控层 RPC调用次数和调用事件监控
远程调用层 封装RPC调用
信息交换层 封装请求响应模式,同步转异步
网络传输层 抽象mina和netty为同一接口
序列化 可服用的工具
  • 通信框架:NIO netty(默认)
  • 序列化框架:hessian(默认)

负载均衡

  • Random:随机,按权重设置随机概率。
  • RoundRobin:轮询,按照公约后的权重设置轮询比率。
  • LeastActive:最少活跃调用数挑选最快的服务器,相同活跃数的随机。
  • ConsistentHash:一致性Hash,相同的请求发送到同一台服务器上。

核心配置

配置 用途 说明
service 服务配置 暴露服务,定义服务的元信息
reference 引用配置 创建远程服务代理(check检查服务是否可用,不可用时抛出异常)
protocol 协议配置 配置提供服务的协议信息
application 应用配置 配置当前应用的信息
module 模块配置 配置当前模块的信息(可选)
registry 注册中心配置 配置注册中心相关的信息
monitor 监控中心配置 配置监控中心相关的信息(可选)
provider 提供方配置 当 ProtocolConfig 和 ServiceConfig 某属性没有配置时,采用此缺省值,可选
consumer 消费方配置 当 ReferenceConfig 某属性没有配置时,采用此缺省值,可选
method 方法配置 用于 ServiceConfig 和 ReferenceConfig 指定方法级的配置信息
argument 参数配置 指定方法参数配置
  • provider上配置consumer端的属性
    • timeout:方法调用超时
    • retries:方法重试次数
    • loadbalance:负载均衡算法,默认随机
    • actives:最大并发调用限制

集群容错机制

容错方案 说明
failover 失败自动切换,重试其他服务器(默认)
failfast 快速失败,调用服务失败立即报错
failsave 安全失败,出现异常忽略(记录日志)
failback 失败自动回复,记录失败请求,定时重发
forking 并行调用多个服务器,只要一个成功就返回
broadcast 广播逐个调用所有提供者,任意一个报错则报错

安全机制

  • Token机制防止用户绕过注册中心直连。
  • 黑白名单控制服务允许的调用方。

服务暴露

  • 配置

  • ServiceBean实现了InitializingBean,ApplicationListener等接口。

    • 覆写其中的afterPropertiesSet,配置各项属性信息。
  • 暴露服务

  • 通过protocol.export(invoker)方法把服务暴露出去(会根据当前的协议做相应的暴露操作),最后将Url和对应的执行器存起来,存放在注册表中,以供消费者调用。

    • invoker:屏蔽调用细节,统一暴露一个可执行体。
  • 本地暴露:内部调用时消费同一个JVM,避免网络通信。

  • 注册服务

    • 注册服务到注册中心。
    • 订阅注册中心的服务。
    • 生成一个新的Exporter实例,将上面的Exporter进行引入,然后返回。

超时时间设置

  • 服务提供者超时时间尽量多配置。
  • 服务消费者超时时间优先级高于服务提供者。

高可用

  • 监控中心宕机,不影响使用丢失部分采样数据。
  • 数据库宕机,通过缓存提供服务列表查询,但不能提供注册服务。
  • 注册中心对等集群,任意一台宕机可自动切换。
  • 注册中心全部宕机,服务提供者和服务消费者通过本地缓存通讯。
  • 服务提供者无状态,任意一台宕机,不影响使用。
  • 服务提供者全部宕机,服务消费者应用无法使用,无限次重连等待服务提供者恢复。

SPI

  • 服务发现机制。
  • 将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。
  • 运行时,动态为接口替换实现类。
posted @ 2020-09-05 21:47  樱空废宅  阅读(100)  评论(0)    收藏  举报