Dubbo

需求

20203814111

架构

20203814260

节点 角色说明
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-provider
dubbo.scan.base-packages=wang.ismy.dubbo
dubbo.protocol.name=dubbo
dubbo.protocol.port=666
dubbo.protocol.host=192.168.1.109
dubbo.registry.address=zookeeper://local:2181
@DubboService(version = "1.0.0",timeout = 10000,interfaceClass = HelloService.class)
@Service
public class HelloServiceImpl implements HelloService{...}

依赖配置同上

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

dubbo-admin

可视化管理服务