dubbo详解

dubbo是什么

dubbo是一个高性能轻量级开源的RPC框架。主要功能分为三点:

  1. 提供面向接口的远程方法调用
  2. 负载均衡和智能容错
  3. 以及服务的自动注册和发现

什么是RPC及其原理

  • RPC(Remote Procedure Call):部署在不同的机器的服务需要进行方法调用,通过RPC具体的实现则可以完成远程过程的调用,而不需要具体了解协议
  • 原理:在客户端的底层和服务端的底层分别进行封装,客户端调用客户端的封装模块,找到服务端的地址,并进行协议的封装,调用服务端封装模块,服务端封装模块调用本地服务,并进行返回,客户端封装模块进行封装返回给客户端

dubbo相对于http请求的好处

  1. 负载均衡,可以将统一服务部署不同机器
  2. 服务注册和发现,能够高效地找到需要的服务地址
  3. 服务降级的功能,能够对服务进行容错
  4. 可以监控服务的调用状态,根据统计情况,对服务进行治理

分布式

  • 分布式:将应用根据不同功能拆分成不同服务
  • 分布式好处:1.团队开发效率更高,每个小团队负责一个服务;2.服务切分后,更好扩展和维护及复用;3.分布式部署后能够更好地治理和分配资源;4.降低组件的复杂度,提高运行效率,增加可靠性和容错性;
  • 分布式缺点:1.学习成本增加;2.服务间调用的网络传输损耗;3.数据传输的安全性问题;4.故障排除定位困难;

dubbo各节点及作用

  • Container:运行服务的容器;
    1. 负责启动加载提供者
  • Registry:注册中心;
    1. 接受注册和订阅;
    2. 当服务有变更时,基于长连接将变更数据推送给消费者;
  • Provider:服务提供者;
    1. 向服务注册中心注册服务,暴露自己的服务;
    2. 内存中累计调用次数和调用时间,定时每分钟将统计数据发送给监控中心;
  • Consumer:服务消费者;
    1. 向服务注册中心订阅服务,并将服务的地址注册表缓存本地;
    2. 服务调用时,根据本地缓存注册表进行服务调用;
    3. 服务调用时,会根据负载均衡策略选择服务调用;
    4. 服务调用时,有容错机制的保障;
    5. 内存中累计调用次数和调用时间,定时每分钟将统计数据发送给监控中心;
  • Monitor:
    1. 统计服务调用的调用次数和调用时长;

在这里插入图片描述

dubbo发布和消费的过程

  • dubbo发布:
    1. 根据发布的接口(服务配置)通过ProxyFactory类的getInvoker生成一个AbstractProxyInvoker实例
    2. 通过Invoker转换到Exporter,将服务根据特定的协议对外开放
      在这里插入图片描述
  • dubbo订阅:
    1. 根据订阅的接口(引用配置),根据特定的协议生成相应的Invoker
    2. 通过ProxyFactory将Invoker生成代理的引用
    3. 根据代理对象进行方法的调用
      在这里插入图片描述

Dubbo暴露服务和引用服务的实现源码分析

dubbo容错

  • 原理:在调用过程中根据配置选择对应的容错对象,进行调用
  • 容错模式:
    • 重试(Failover Cluster):根据配置次数进行重试,默认2次;用于读操作或者幂等写操作;
    • 快速失败(Failfast Cluster):失败立即报错;用于非幂等写操作;
    • 失败安全(Failsafe Cluster):异常直接忽略;如写审计日志;
    • 失败自动恢复(Failback Cluster):后台记录失败请求,后期进行重试;用于通知操作;
    • 并行(Forking Cluster):并发调用多个服务,一个成功及返回;用于具有对实时性读有要求的场景,但浪费资源;
    • 广播(Broadcast Cluster):逐个调用所有服务,一台报错则全部报错;用于通知所有提供者更新本地缓存或日志等信息;
  • 实现:
    • 提供方:
    <dubbo:service cluster="failsafe" />
- 消费方:
    <dubbo:reference cluster="failsafe" />

Dubbo剖析-集群容错

dubbo负载均衡策略

  • 随机(Random LoadBalance):基于权重随机选择调用(默认)
  • 权重轮询(RoundRobin LoadBalance):基于权重轮流调用
  • 最少活跃数(LeastActive LoadBalance):活跃数指服务提供者调用前后的调用时长,也就是根据服务提供者的性能进行调用
  • 一致性hash(ConsistentHash LoadBalance):对请求参数求hash值,根据hash值调用到相应的服务提供者,好处是同类请求能够在一个服务节点响应
  • 实现:
    • 服务端服务级别
    <dubbo:service interface="..." loadbalance="roundrobin" />
- 客户端服务级别
    <dubbo:reference interface="..." loadbalance="roundrobin" />
- 服务端方法级别
    <dubbo:service interface="..."> <dubbo:method name="..." loadbalance="roundrobin"/> </dubbo:service>
- 客户端方法级别
    <dubbo:reference interface="..."> <dubbo:method name="..." loadbalance="roundrobin"/> </dubbo:reference>

dubbo常用协议

  • Dubbo:Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。
  • RMI:RMI 协议采用 JDK 标准的 java.rmi.* 实现,采用阻塞式短连接和 JDK 标准序列化方式。
  • Hessian:Hessian 协议用于集成 Hessian 的服务,Hessian 底层采用 HTTP 通讯,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现。
  • HTTP:采用 Spring 的 Http Invoker 实现。
  • Webservice:基于 CXF 的 frontend-simple 和 transports-http 实现。

dubbo与spring cloud区别

  1. spring cloud集成的组件更多,本身含有注册中心,而dubbo的注册中心是zookeeper
  2. 服务和注册中心间的连接协议不同,spring cloud是http,而dubbo的协议更加多样,基于长连接的方式交互,通过netty(Netty架构原理,不怕你看不懂!)的nio方式使调用性能更优
  3. spring cloud通过心跳通知服务的消费者,而zookeeper通过长连接通知服务的变更
  4. dubbo是RPC,依赖关系更大,需要接口相同,而spring cloud是REST方式,更为轻量化,但是容易导致接口定义和文档不一致,但可通过swagger解决

spring cloud

参考

Dubbo和Spring Cloud微服务架构比较
dubbo.md
Dubbo面试题汇总

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值