dubbo详解
文章目录
dubbo是什么
dubbo是一个高性能轻量级开源的RPC框架。主要功能分为三点:
- 提供面向接口的远程方法调用
- 负载均衡和智能容错
- 以及服务的自动注册和发现
什么是RPC及其原理
- RPC(Remote Procedure Call):部署在不同的机器的服务需要进行方法调用,通过RPC具体的实现则可以完成远程过程的调用,而不需要具体了解协议
- 原理:在客户端的底层和服务端的底层分别进行封装,客户端调用客户端的封装模块,找到服务端的地址,并进行协议的封装,调用服务端封装模块,服务端封装模块调用本地服务,并进行返回,客户端封装模块进行封装返回给客户端
dubbo相对于http请求的好处
- 负载均衡,可以将统一服务部署不同机器
- 服务注册和发现,能够高效地找到需要的服务地址
- 服务降级的功能,能够对服务进行容错
- 可以监控服务的调用状态,根据统计情况,对服务进行治理
分布式
- 分布式:将应用根据不同功能拆分成不同服务
- 分布式好处:1.团队开发效率更高,每个小团队负责一个服务;2.服务切分后,更好扩展和维护及复用;3.分布式部署后能够更好地治理和分配资源;4.降低组件的复杂度,提高运行效率,增加可靠性和容错性;
- 分布式缺点:1.学习成本增加;2.服务间调用的网络传输损耗;3.数据传输的安全性问题;4.故障排除定位困难;
dubbo各节点及作用
- Container:运行服务的容器;
- 负责启动加载提供者
- Registry:注册中心;
- 接受注册和订阅;
- 当服务有变更时,基于长连接将变更数据推送给消费者;
- Provider:服务提供者;
- 向服务注册中心注册服务,暴露自己的服务;
- 内存中累计调用次数和调用时间,定时每分钟将统计数据发送给监控中心;
- Consumer:服务消费者;
- 向服务注册中心订阅服务,并将服务的地址注册表缓存本地;
- 服务调用时,根据本地缓存注册表进行服务调用;
- 服务调用时,会根据负载均衡策略选择服务调用;
- 服务调用时,有容错机制的保障;
- 内存中累计调用次数和调用时间,定时每分钟将统计数据发送给监控中心;
- Monitor:
- 统计服务调用的调用次数和调用时长;
dubbo发布和消费的过程
- dubbo发布:
- 根据发布的接口(服务配置)通过ProxyFactory类的getInvoker生成一个AbstractProxyInvoker实例
- 通过Invoker转换到Exporter,将服务根据特定的协议对外开放
- dubbo订阅:
- 根据订阅的接口(引用配置),根据特定的协议生成相应的Invoker
- 通过ProxyFactory将Invoker生成代理的引用
- 根据代理对象进行方法的调用
dubbo容错
- 原理:在调用过程中根据配置选择对应的容错对象,进行调用
- 容错模式:
- 重试(Failover Cluster):根据配置次数进行重试,默认2次;用于读操作或者幂等写操作;
- 快速失败(Failfast Cluster):失败立即报错;用于非幂等写操作;
- 失败安全(Failsafe Cluster):异常直接忽略;如写审计日志;
- 失败自动恢复(Failback Cluster):后台记录失败请求,后期进行重试;用于通知操作;
- 并行(Forking Cluster):并发调用多个服务,一个成功及返回;用于具有对实时性读有要求的场景,但浪费资源;
- 广播(Broadcast Cluster):逐个调用所有服务,一台报错则全部报错;用于通知所有提供者更新本地缓存或日志等信息;
- 实现:
- 提供方:
<dubbo:service cluster="failsafe" />
- 消费方:
<dubbo:reference cluster="failsafe" />
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区别
- spring cloud集成的组件更多,本身含有注册中心,而dubbo的注册中心是zookeeper
- 服务和注册中心间的连接协议不同,spring cloud是http,而dubbo的协议更加多样,基于长连接的方式交互,通过netty(Netty架构原理,不怕你看不懂!)的nio方式使调用性能更优
- spring cloud通过心跳通知服务的消费者,而zookeeper通过长连接通知服务的变更
- dubbo是RPC,依赖关系更大,需要接口相同,而spring cloud是REST方式,更为轻量化,但是容易导致接口定义和文档不一致,但可通过swagger解决
参考
作者:杭州剃须刀
来源链接:https://blog.csdn.net/SeanTandol/article/details/88577468