Dubbo

需求

20203814111

架构

sequenceDiagram  Consumer -->> Registry: subscribe  Registry -->> Consumer: notify  Provider(Container) -->> Provider(Container): init  Provider(Container) -->> Registry: register  Consumer ->> Provider(Container): invoke  Consumer -->> Monitor: report  Provider(Container) -->> Monitor: report
节点角色说明
Provider暴露服务的服务提供方
Consumer调用远程服务的服务消费方
Registry服务注册与发现的注册中心
Monitor统计服务的调用次数和调用时间的监控中心
Container容器. Dubbo技术的服务端(Provider), 在启动执行的时候, 必须依赖容器才能正常启动.

工作流程

批注 2020-03-21 142738

注册中心

Dubbo支持Multicast,Zookeeper,Redis,Simple注册中心

ZooKeeper

协议

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

反之,Dubbo 默认协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低

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

Protocol Buffer

Protocol Buffer 其实是 Google 出品的一种轻量并且高效的结构化数据存储格式,性能比 JSON、XML 要高很多

负载均衡策略

随机调用实现负载均衡,可以对 provider 不同实例设置不同的权重,会按照权重来负载均衡

默认就是均匀地将流量打到各个机器上去,但是如果各个机器的性能不一样,容易导致性能差的机器负载过高。所以此时需要调整权重

给不活跃的性能差的机器更少的请求

相同参数的请求一定分发到一个 provider 上去,provider 挂掉的时候,会基于虚拟节点均匀分配剩余的流量

建议在 Provider 端配置的 Consumer 端属性

  1. `timeout`:方法调用的超时时间

  2. `retries`:失败重试次数,缺省是 2

  3. `loadbalance`:负载均衡算法,缺省是随机 `random` + 权重。还可以配置轮询 `roundrobin`、最不活跃优先 `leastactive` 和一致性哈希 `consistenthash` 等

  4. `actives`:消费者端的最大并发调用限制,即当 Consumer 对一个服务的并发调用到上限后,新调用会阻塞直到超时,在方法上配置 `dubbo:method` 则针对该方法进行并发限制,在接口上配置 `dubbo:service`,则针对该服务进行并发限制

  5. `executes`服务提供方可以使用的最大线程数

在 Provider 端配置合理的 Provider 端属性

建议在 Provider 端配置的 Provider 端属性有:

  1. `threads`:服务线程池大小
  2. `executes`:一个服务提供者并行执行请求上限,即当 Provider 对一个服务的并发调用达到上限后,新调用会阻塞,此时 Consumer 可能会超时。在方法上配置 `dubbo:method` 则针对该方法进行并发限制,在接口上配置 `dubbo:service`,则针对该服务进行并发限制

集群容错策略

失败自动切换,自动重试其他机器,默认就是这个

一次调用失败就立即失败

出现异常时忽略掉

失败了后台自动记录请求,然后定时重发

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

逐个调用所有的 provider。任何一个 provider 出错则报错

spi

service provider interface

当某个接口有多个实现,需要根据指定的配置或者是默认的配置,选择相对应的实现

服务治理

调用链路自动生成

对各个服务之间的调用自动记录下来,然后自动将各个服务之间的依赖关系和调用链路生成出来,做成一张图

批注 2020-03-21 145015

服务访问压力以及时长统计

设计一个rpc框架

SpringCloud与Dubbo

SpringCloud 和Dubbo都可以实现RPC远程调用和服务治理

SpringCloud是一套目前比较完善的微服务框架,整合了分布式常用解决方案遇到了问题,Dubbo只是实现服务治理

整合spring boot

compile group: 'org.apache.dubbo', name: 'dubbo-spring-boot-starter', version: '2.7.7'compile group: 'org.apache.curator', name: 'curator-recipes', version: '4.2.0'
spring.application.name=dubbo-providerdubbo.scan.base-packages=wang.ismy.dubbodubbo.protocol.name=dubbodubbo.protocol.port=666dubbo.protocol.host=192.168.1.109dubbo.registry.address=zookeeper://local:2181
@DubboService(version = "1.0.0",timeout = 10000,interfaceClass = HelloService.class)@Servicepublic class HelloServiceImpl implements HelloService{...}

依赖配置同上

@DubboReference(version = "1.0.0")HelloService helloService;

dubbo-admin

可视化管理服务