dubbo协议

本文详细介绍了Dubbo协议的各个方面,包括负载均衡策略、协议(如dubbo、rmi、hessian)、集群容错策略和服务治理。讨论了dubbo协议的特性,如长连接、NIO异步传输和Hessian序列化。此外,还涵盖了服务启动依赖检查、服务降级策略、路由规则、同步/异步调用以及Dubbo的Spi机制和源码解读。通过对ExtensionLoader和AdaptiveExtensionLoader的解析,揭示了Dubbo如何实现扩展点的自动装配和自适应机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Dubbo

默认使用dubbo协议,hessian序列化框架,zookepper注册中心,使用Neety通信,随机负载均衡,失败自动切换,自动重试其它服务器,默认同步阻塞

dubbo运行架构图

Consumer:服务消费者,即服务调用方;

Provider:服务提供者,即被调用方;

Registry:注册中心,服务注册与服务发现,dubbo支持4种注册中心(multicast zookeeper redis simple),dubbo推荐使用zookeeper注册中心;

Monitor:服务监控中心,提供服务调用次数和调用时间统计;

Container:服务运行容器;

分为十层

代理层的动态代理使用的是javaSsesit

负载均衡策略

  1. random loadBalance

    默认情况下,使用随机调用来实现负载均衡,可以对不同provider。也可以使用不同权重,来进行负载均衡

  2. randomRobin loadBalance

    轮询来分发流量,每台机器的次数严格一样。也可以调整权重

  3. leastactive loadBalance

    自动感知,如果某个机器性能越差,分发的请求就越少

  4. 一致性hash

    如果需要一类请求都到一个节点,就可以使用,配合缓存很好用

协议

dubbo

默认的协议是dubbo,适用于小数据量大并发,单一长连接,NIO异步传输(TCP传输),Hessian 二进制序列化

Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。

反之,Dubbo 缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。
在这里插入图片描述

特性
缺省协议,使用基于 mina 1.1.7 和 hessian 3.2.1 的 tbremoting 交互。

连接个数:单连接
连接方式:长连接
传输协议:TCP
传输方式:NIO 异步传输
序列化:Hessian 二进制序列化
适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用 dubbo 协议传输大文件或超大字符串。
适用场景:常规远程服务方法调用

全量配置

<dubbo:protocol name=“dubbo” port=“9090” server=“netty” client=“netty” codec=“dubbo” serialization=“hessian2” charset=“UTF-8” threadpool=“fixed” threads=“100” queues=“0” iothreads=“9” buffer=“8192” accepts=“1000” payload=“8388608” />

//简单配置,使用dubbo协议,端口20868,线程数200
<dubbo:protocol name="dubbo" port="20868" threadpool="cached" threads="200"/>
rmi

阻塞式短连接,同步TCP传输,Java 标准二进制序列化

hessian

多个短连接,HTTP同步传输,Hessian二进制序列化

集群容错策略

在服务提供方或服务消费方中,均可设置

<dubbo:reference id="demoService" interface="org.apache.dubbo.demo.DemoService" cluster="failover" retries="1"/>
<dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService" cluster="failover" retries="2" />
  1. failOver cluster模式

    失败自动切换,自动重试。

  2. fialFast cluster模式

    一次调用失败就立即失败,不在重试,适用于写操作

  3. failSafe cluster模式

    出现异常忽略掉,常用语记录日志

  4. failBack

    失败了后台自动记录请求,然后定时重发,比较适合于写消息队列

  5. forking

    并行的调用多个provider,只要一个成功就立即返回

  6. broadcast

    依次调用所有的provider

服务启动依赖检查

<dubbo:consumer check="false" />

duboo在启动时候会进行所有消费者的服务检查,如果服务都不可用,会抛错,默认为true,通过false进行关闭

服务治理

服务降级

mock只在出现非业务异常(比如超时,网络异常等)时执行,可配置bool值,或null

失败直接返回固定结果
<dubbo:reference id="xxxService" interface="com.x..service.xxxxService" check="false" mock="return null" />
失败时执行二级方案

现在消费的标签中,写mock=true

<dubbo:reference id="xxxService" interface="com.x..service.xxxxService" check="false" mock="true" />

然后服务提供方在目录下创建mock的处理类,dubbo在调用失败的时候会自动的访问mockxxxxService来进行执行

class xxxxServiceMock implements xxxxService{
   
 //注意类名必须是接口名+Mock
  fun1;
  
  fun2;
  
}

循环依赖问题

可以通过启动时的健康检查来暴露(依赖的双方启动时候必有先后)

  1. 划分功能
  2. 使用MQ进行解偶

失败重试和超时重试

在 Provider 上可以配置的 Consumer 端的属性有:

  1. timeout
  2. retries
  3. loadbalance

路由

  1. 脚本路由

  2. 条件路由,需要在管理控制台中输入路由规则

# DemoService的sayHello方法只能消费所有端口为20880的服务实例
# DemoService的sayHi方法只能消费所有端口为20881的服务实例
scope: service 
force: true
runtime: true
enabled: true
key: org.apache.dubbo.samples.governance.api.DemoService
conditions:
  - method=sayHello => address=*:20880
  - method=sayHi => address=*:20881
...
    
    
# app1的消费者只能消费所有端口为20880的服务实例
# app2的消费者只能消费所有端口为20881的服务实例
---
scope: application
force: true
runtime: true
enabled: true
key: governance-conditionrouter-consumer
conditions:
  - application=app1 => address=*:20880
  - application=app2 => address=*:20881
...
  • scope

    表示路由规则的作用粒度,scope的取值会决定key的取值。必填

    • service 务粒度
    • application 应用粒度
  • Key

    明确规则体作用在哪个服务或应用。必填

    • scope=service时,key取值为[{group}:]{service}[:{version}]的组合
    • scope=application时,key取值为application名称
  • enabled=true 当前路由规则是否生效,可不填,缺省生效。

  • force=false 当路由结果为空时,是否强制执行,如果不强制执行,路由结果为空的路由规则将自动失效,可不填,缺省为 false

  • runtime=false 是否在每次调用时执行路由规则,否则只在提供者地址列表变更时预先执行并缓存结果,调用时直接从缓存中获取路由结果。如果用了参数路由,必须设为 true,需要注意设置会影响调用的性能,可不填,缺省为 false

  • priority=1 路由规则的优先级,用于排序,优先级越大越靠前执行,可不填,缺省为 0

  • conditions 定义具体的路由规则内容。必填

同步/异步调用

同步/阻塞

同步调用是一种阻塞式的调用方式,即 Consumer 端代码一直阻塞等待,直到 Provider 端返回为止;

通常,一个典型的同步调用过程如下:

  1. Consumer 业务线程调用远程接口,向 Provider 发送请求,同时当前线程处于阻塞状态;
  2. Provider 接到 Consumer 的请求后,开始处理请求,将结果返回给 Consumer;
  3. Consumer 收到结果后,当前线程继续往后执行。

Dubbo底层Consumer发起调用后返回一个Future对象,Future通过.get(Timeout)来进行阻塞,并在超时时间以后,业务线程将会异常返回; 在超时时间前返回,会唤醒阻塞的业务线程

异步

consumer端对应的服务设置 async=“true”。

使用案例,Dubbo的异步调用

AsyncService service = ..
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值