1.配置优先级

  • 优先级
  • 方法级
  • 接口级
  • 全局配置
  • 消费方
  • 提供方
  • 建议:在Provider端尽量多配置Consumer端属性

2.常用配置项

优化

  • 集群容错
  • 定义
  • 当有多个服务提供方时,将多个服务提供方组织成一个集群,并伪装成一个提供方。dubbo会根据Router(路由)和LoadBalance(负载均衡)策略选择一个服务调用,如果调用失败,则会重选
  • 模式
  • Failover Cluster(失败自动切换,默认值):失败自动切换到其它服务器。用于读操作。retries设置重试次数
  • Failfast Cluster(快速失败):只发起一次调用,失败立即报错。用于写操作
  • Failsafe Cluster(失败安全):出现异常时,直接忽略。常用于写入计日志等操作
  • Failback Cluster(失败自动恢复):后台记录失败请求,定时重发。用于消息通知操作
  • Forking Cluster(并行调用):只要一个成功即返回。用于实时性要求较高的读操作源。forks设置最大并行数
  • Broadcast Cluster(广播调用):逐个调用,任意一台报错则报错。用于通知所有提供者更新缓存或日志
  • 负载均衡
  • 定义
  • 网络请求到达负载均衡服务器,由负载均衡服务器通过一定的调度算法将流量分发到不同的应用服务器上面,同时负载均衡服务器也会对应用服务器做周期性的健康检查,当发现故障节点时便动态的将节点从应用服务器集群中剔除,以此来保证应用的高可用。
  • 策略
  • Random LoadBalance(随机,默认值):按权重设置随机概率
  • RoundRobin LoadBalance(轮询):按权重设置轮询比率
  • LeastActive LoadBalance(最少活跃数):慢的提供者收到更少请求,相同活跃数的随机
  • ConsistentHash LoadBalance:一致性Hash,相同参数的请求发到同一提供者,缺省对第一个参数Hash
  • 线程模型
  • 定义
  • consumer向provider发送RPC请求时,有IO操作或者复杂逻辑的请求派发到线程池,使用新线程执行IO操作,没有的请求直接在本线程执行。需要通过不同的派发策略和不同的线程池配置的组合来应对不同的场景
  • Dispatcher(派发策略)
  • all 所有消息都派发到线程池
  • direct 所有消息在IO线程上执行
  • message 请求响应消息派发到线程池
  • execution 请求消息派发到线程池,不含响应
  • connection 将连接断开事件放入IO线程队列,有序逐个执行
  • ThreadPool(线程池)
  • fixed(固定大小,默认值):启动时建立线程,不关闭
  • cached(缓存线程池):空闲一分钟自动删除,需要时重建
  • limited(可伸缩):线程数随任务数增长,但只增长不收缩
  • eager(优先创建Worker):
  • corePoolSize<任务数<于maximumPoolSize,优先创建Worker处理任务
  • 任务数>于maximumPoolSize,任务放入阻塞队列,阻塞队列满了抛出RejectedExecutionException
  • 延迟暴露:服务需要预热时间,等待相关资源就位等,可以使用delay进行延迟暴露
  • 并发控制:
  • 设置指定服务的最大执行并发数(executes)
  • 设置指定服务每个客户端调用的最大执行并发数(actives)
  • 连接控制:
  • 设置服务器端接受的最大连接数(accepts)
  • 设置客户端服务使用的最大连接数(connections)
  • 延迟连接:当有调用发起时,再创建长连接,用于减少长连接数
  • 粘滞连接:让客户端总是向同一提供者发起调用,会自动开启延迟连接,用于有状态服务

部署

  • 启动时检查(consumer):默认在启动时会检查依赖的服务是否可用,不可用时会抛出异常
dubbo.reference.xxxService.check=false:强制改变指定方法check值
dubbo.reference.check=false:全局强制改变check值
dubbo.consumer.check=false:设置check的默认值
dubbo.registry.check=false:订阅失败,允许启动,会定时重试
  • 直连provider(consumer):consumer忽略注册中心的提供者列表,点对点直连provider
XxxService=dubbo://localhost:20890:配置XxxService直连provider
  • 只订阅:应用程序,只订阅服务,而不注册正在开发的服务,通过直连测试正在开发的服务
  • 只注册:服务提供者方只注册服务到另一注册中心,而不从另一注册中心订阅服务
  • 静态服务:人工管理服务提供者的上线和下线,需将注册中心标识为非动态管理模式
  • 多协议:Dubbo允许配置多协议,在不同服务上支持不同协议或者同一服务上同时支持多种协议
  • 多注册中心:
  • 同一服务可向多注册中心同时注册
  • 不同服务分别注册到不同的注册中心
  • 同时引用注册在不同注册中心上的同名服务
  • 优雅停机:通过JDK的ShutdownHook优雅停机
  • 回声测试:
  • 回声测试用于检测服务是否可用,可用于监控
  • 所有服务都实现了EchoService接口,将任意服务引用强制转型为EchoService,就可以调用服务

区分服务

  • 服务分组:当一个接口有多种实现时,可以用group区分
  • 多版本:通过版本号区分服务,版本号不同的服务相互间不引用
  • 分组聚合:
  • 服务接口的多种实现,用group区分,现在消费方需从每种group中调用一次返回结果,合并结果返回

数据处理

  • 参数验证:用户只需标识标准的验证annotation,并通过声明filter来实现验证
  • 结果缓存:用于加速热门数据的访问速度,Dubbo提供声明式缓存,以减少用户加缓存的工作量
  • lru基于最近最少使用原则删除多余缓存,保持最热的数据被缓存
  • threadlocal当前线程缓存
  • 可以桥接各种缓存实现
  • 泛化引用(consumer):泛化接口调用方式主要用于客户端没有API接口及模型类的情况,参数及返回值用Map表示
  • 泛化实现(provider):泛接口实现方式主要用于服务器端没有API接口及模型类的情况,参数及返回值用Map表示
  • 隐式参数:
  • 通过 RpcContext上的setAttachment和getAttachment在服务消费方和提供方之间进行参数的隐式传递
  • 上下文信息
  • 上下文中存放的是当前调用过程中所需的环境信息。所有配置信息都将转换为URL的参数
  • RpcContext是一个ThreadLocal的临时状态记录器,记录了RPC调用的上下文信息
  • 异步调用:
  • 基于NIO的非阻塞实现并行调用
  • 本地调用:
  • 本地调用使用了injvm协议,它只在JVM内直接关联,但执行Dubbo的Filter链
  • 每个服务默认都会在本地暴露。在引用服务的时候,优先引用本地服务
  • 参数回调:在配置文件中声明callback,Dubbo将基于长连接生成反向代理,可以从服务器端调用客户端逻辑
  • 事件通知:在调用之前、调用之后、出现异常时,会触发 oninvoke、onreturn、onthrow事件
  • 本地存根:
  • 作用:提供方有时想在客户端也执行部分逻辑,比如提前验证参数,调用失败后伪造容错数据
  • 实现:在API中带上Stub,客户端生成Proxy,dubbo会把Proxy通过构造函数传给Stub
  • 本地伪装:
  • 作用:用于服务降级,当服务提供方全部挂掉后,客户端不抛出异常,通过Mock数据返回授权失败
  • 用法
  • return:返回一个字符串表示的对象
  • empty: 空,基本类型的默认值,或者集合类的空值
  • null: null
  • true: true
  • false: false
  • JSON格式: JSON对象
  • throw:返回一个Exception对象
  • force(2.6.6以上版本): 强制使用Mock,不会走远程调用
  • fail(2.6.6以上版本,同默认设置): 当远程调用发生错误时才使用Mock
  • 令牌验证:在注册中心控制权限,以决定是否下发令牌给消费者

动态修改配置(运行过程中通过注册中心动态修改配置)

  • 路由规则:
  • 作用:路由规则决定调用的目标服务器(可通过zookeeper设置)
  • 分类:
  • 条件路由规则:基于条件表达式的路由规则,如:host = 10.20.153.10 => host = 10.20.153.11
  • 脚本路由规则:脚本路由规则支持JDK脚本引擎的所有脚本,缺省为javascript
  • 标签路由规则:根据请求携带的tag选择调用对应tag的服务提供者
  • 配置规则:
  • 作用:动态配置覆盖规则(可通过zookeeper设置)
  • 服务降级:临时屏蔽指定的服务,定义返回策略(可通过zookeeper设置)

其它

  • 日志适配:适配log4j、slf4j、jcl、jdk日志框架,可配置配置日志输出策略
  • 访问日志:开启访问日志,记录每一次请求信息
  • 服务容器:后台服务不需Web容器的功能,使用springboot非web程序
  • ReferenceConfig缓存:ReferenceConfig实例很重,封装了与注册中心的连接以及与提供者的连接,需要缓存
  • 线程自动dump:通过Jstack自动导出线程堆栈,方便排查问题
  • Kryo和FST序列化:性能优于hessian和dubbo序列化
  • 分布式事务:基于 JTA/XA 规范实现(未实现)
  • 主机绑定
  • Netty4