Dubbo
官网地址:Apache Dubbo
Dubbo 是一款易用、高性能的 WEB 和 RPC 框架,同时为构建企业级微服务提供服务发现、流量治理、可观测、认证鉴权等能力、工具与最佳实践
作用
1.远程方法调用
2.容错和负载均衡
3.提供服务的自动注册与发现
为什么需要?
早期将所有功能打包部署在一个单机服务器上,调用接口较方便,不涉及到任何分布式场景;
随着业务的快速发展,子系统越来越多时,系统变得复杂,业务代码耦合在一起;
急需业务单独部署。
核心功能
地址发现:具备高性能、支持大规模集群、服务级元数据配置等优势,默认提供 Nacos、Zookeeper、Consul 等多种注册中心适配
负载均衡:默认提供加权随机、加权轮询、最少活跃请求数优先、最短响应时间优先、一致性哈希和自适应负载等策略
流量路由:通过一系列流量规则控制服务调用的流量分布与行为
链路追踪:通过适配 OpenTelemetry 提供了对 Tracing 全链路追踪支持
可观测:通过 Prometheus 等上报 QPS、RT、请求次数、成功率、异常次数等多维度的可观测指标帮助了解服务运行状态
组件
Provider:服务提供者
Consumer:服务消费者
Registry:注册中心
Monitor:服务监控中心
调用流程
1.服务提供者启动服务,将服务注册进注册中心
发送请求:
2.服务消费者定时拉取服务提供者列表
3.生成动态代理对象调用远程接口
4.获取服务提供者列表,通过负载均衡算法,选择要调用的服务提供者,选择协议
5.通过协议将数据进行封装成request请求,通过网络通信将请求发送出去
响应请求
6.服务提供者接收请求后进行反序列化,根据指定协议将请求解析出来
7.通过动态代理对象,调用服务提供者的对应接口
Dubbo 与 Spring Cloud
差异
1.SpringCloud定位是微服务架构下的一站式解决方案;Dubbo主要是服务的调用与治理
2.SpringCloud依托于Spring生态体系更加完善;Dubbo一开始主要是RPC远程调用,生态相对匮乏
3.SpringCloud是采用Http协议做远程调用,接口一般是Rest风格;Dubbo是采用Dubbo协议,接口一般是Java的Service接口,格式固定,采用NIO方式,性能较好
4.组件差异比较多
远程调用差异
SpringCloud使用的远程调用方式为Feign,基于Http协议,所有接口采用Rest风格;因此接口规范更统一,而且只要符合规范,实现接口的微服务可以采用任意语言或技术开发。但受限于http协议本身的特点,请求和响应格式臃肿,其通信效率相对会差一些。
Dubbo框架默认采用Dubbo自定义通信协议,与Http协议一样底层都是TCP通信。但是Dubbo协议自定义了Java数据序列化和反序列化方式、数据传输格式,因此Dubbo在数据传输性能上会比Http协议要好一些。
调用方式
Rest风格
REST是一种架构风格,指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful;
Rest的风格可以完全通过HTTP协议实现,使用 HTTP 协议处理数据通信。REST架构对资源的操作包括获取、创建、修改和删除资源的操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法。
RPC
远程过程调用协议。客户端在不知道调用细节的情况下,调用远程计算机上的某个对象。就像调用本地应用程序中的对象一样。
1.多数RPC框架选择TCP作为传输协议,性能比较好
2.请求方需要告知需要调用的函数的名称、参数、等信息
3.客户端和服务端交互时将参数或结果转化为字节流在网络中传输,那么数据转化为字节流的或者将字节流转换成能读取的固定格式时就需要进行序列化和反序列化
因为有序列化和反序列化的需求,因此对数据传输格式有严格要求,不如Http灵活