基于Java的高性能RPC框架,定义 服务接口及出入参类型 供远程调用。客户端需拥有与服务端相同的接口。
三大特点:
- 高效的接口远程调用
- 容错 与 负载均衡
- 服务的自动注册和发现
为什么用Dubbo?
调用远程服务方便, 支持服务自动注册与发现、服务治理方便、有助于分布式系统服务的管理。 支持多种负载均衡和容错, Netty 长连接和异步线程高效,高并发下性能好。
- 优点:高并发下性能好、通信效率高性能好(单一长连接和NIO异步通讯,高效的序列化协议和通信框架)、支持负载均衡、服务调用、服务发现、服务治理
- 缺点:复杂的配置和部署流程,定制性较高、难度和成本高。
- Dubbo:更适合于需要高性能、大规模集群以及多语言支持的场景。
- Spring Cloud:适合于需要快速开发、一站式解决方案以及跨平台能力的场景。更适用于小规模微服务集群。
- RPC:二进制、TCP/HTTP、性能高、耦合度高、适用内部服务。RPC核心:通讯,序列化
- REST:JSON、HTTP、 性能一般、低耦合、外部服务
一、调用流程
- 启动:启动服务提供方应用,将提供的服务初始化到 容器中
- 注册:提供方在应用启动后将服务注册到 注册中心,采用Zookeeper或Nacos作为注册中心
- 订阅:消费方在应用启动后 会向注册中心订阅服务,同时获取注册中心已存在的服务列表并缓存到本地
- 通知:注册中心会通过异步通知的方式,实时将提供方的最新状态推送至消费方
- 调用:消费方可以根据本地服务列表 直接进行服务调用
- 监控统计:消费方和服务方会将服务调用状态、次数等内容推送至监控端
二、使用
1、api模块:接口定义,定义服务接口及出入参类型,需打包发布到远程仓库,给服务端和消费端 共同依赖。
(定义接口、xxRequest、xxResponse)
2、服务端:服务提供方,实现接口具体业务
服务配置:appCtx-dubbo.xml
<dubbo:registry address="zookeeper://127.0.0.1:2191" />
<dubbo:service interface="com.google.demo.api.DemoQueryService" ref="demoQueryService" />
配置注册中心地址 和 暴露服务
服务内容分别是:api模块接口的全类名,服务端实现类的服务名
3、消费端:服务调用方,根据需要 远程调用服务接口
调用配置:appCtx-dubbo.xml
<dubbo:reference id="demoQueryService" interface="com.google.demo.api.DemoQueryService" />
两个内容分别是:服务端实现类的服务名,api模块接口的全类名
配置内容 正好和服务端是反的,
还可以配置 连接参数、超时时间、重试次数
也可以通过注解方式配置:
(1)配置类加@EnableDubbo注解(指定包扫描路径)
(2)消费者加@DubboReference注解引用服务(指定超时时间)
三、注册中心
支持多种注册中心,默认Zookeeper,还支持Redis、Nacos
提供者 的注册与发现,消费者 动态的发现和访问提供者;
提供者 注册服务;消费者 订阅服务;返回服务列表给消费者
四、负载均衡
如何从 多个服务提供者中选择一个进行调用,分摊负载
Dubbo内置的多种负载均衡策略(轮询、随机、最少活跃调用数、一致性哈希)
五、集群容错
当提供者发生故障时,从备选节点 选一个可以的节点 让消费者访问;
提供了多种容错策略:快速失败、失败切换、失败重试等。
- Failover:调用失败,自动切换下一个 直到成功
- Failfast:快速失败,立即抛出异常
- Failsafe:记录异常但不抛出
- Failback:后台异步重试
- Forking:并发调用多个,有一个成功就返回
六、熔断、降级
在服务调用失败率达到一定阈值时,自动触发熔断机制,阻止后续的请求继续访问该服务,从而避免雪崩效应的发生。当熔断器打开后,服务调用会被快速失败,不再尝试访问远程服务器。经过一段时间后,熔断器会进入半开状态,允许部分请求尝试调用服务。如果调用成功,熔断器会关闭,恢复到正常状态;如果调用失败,熔断器会继续保持打开状态。
熔断是降级的一种触发条件,而降级是熔断后的一种应对策略。
- 熔断:是通过circuit breaker模式来实现的,(达到最大失败次数,暂停对该服务的调用,防止服务雪崩)。
- 降级:是通过Mock来实现,(关闭非核心功能让核心功能正常、返回空结果或默认返回)。
七、Netty通信框架
Dubbo的底层通信是建立在Netty通信框架下,实现了从网络层到协议层的完整封装,通过高效的
I/O操作(NIO)提升通信效率。
使用 心跳机制、序列化和反序列化、长连接池 等机制来提高网络通信的效率和安全性。
心跳机制:
- “
相互”定时发送心跳包 来检测 客户端与服务端 之间长连接的存活状态。 - 如果心跳包多次未得到响应,连接不可用,进而触发
重连逻辑或断开连接。 - 客户端 连不到服务端 会重连;服务端 连不上客户端 会断开连接。(超时时间:默认 3*心跳间隔)
Netty中的IdleStateHandler用于检测连接的空闲状态(读空闲、写空闲、读写空闲); 当连接的空闲时间超过设定的阈值时,IdleStateHandler会触发一个超时事件。
- heartbeat:心跳间隔,默认为60秒。
- heartbeatTimeout:心跳超时时间,默认为heartbeat*3。
Dubbo支持哪些通信协议?
Dubbo协议(默认,基于TCP的二进制协议)、RMI协议、Hessian协议、HTTP协议和 WebService协议等
八、其他RPC框架
-
gRPC:
- 开发背景:由Google开发,是一个高性能、开源的RPC框架。
- 技术特点:基于HTTP/2协议,并使用Protocol Buffers(ProtoBuf)作为序列化协议。支持多种编程语言,如C++、Java、Python、Go、Ruby、C#、Node.js等。提供强大的IDL(接口定义语言)和自动代码生成工具。
- 应用场景:适用于大规模分布式系统,要求高性能和跨语言支持的场景。
-
Apache Thrift:
- 开发背景:由Apache开发,是一个跨语言的RPC框架。
- 技术特点:支持多种传输协议和序列化协议,如TBinaryProtocol、TCompactProtocol等。支持多语言,包括C++、Java、Python、Go、Ruby、C#、Node.js等。使用IDL进行接口定义,提供代码生成工具,支持异步和同步的通信方式。
- 应用场景:适用于异构系统中不同语言之间的远程调用。
-
Spring Cloud:
- 开发背景:Spring Cloud是一套构建分布式系统的开源框架,它整合了多种RPC框架。
- 技术特点:提供了多个模块,包括服务发现与注册、负载均衡、断路器、智能路由等功能。基于HTTP或RPC实现了服务间的通信和调用。
- 应用场景:Spring Cloud整合的RPC框架如RestTemplate、Feign、Ribbon等,使得开发者可以方便地构建分布式系统。
-
gRPC-Web:
- 开发背景:gRPC的Web版本,使得gRPC服务可以通过浏览器进行访问。
- 技术特点:基于HTTP/1.1,使用ProtoBuf作为序列化协议,并支持多种编程语言的客户端。
- 应用场景:适用于需要通过浏览器访问RPC服务的场景。
-
Apache Axis2:
- 开发背景:Apache Axis2是一款基于Web服务标准的RPC框架。
- 技术特点:支持SOAP协议,通过WSDL描述服务接口,支持多种编程语言,如Java、C++、Python等。提供了高度可扩展的架构、安全性和可靠性,并支持发布和发现服务。
- 应用场景:适用于需要基于SOAP协议进行通信的分布式系统。
-
RMI(Java远程方法调用):
- 开发背景:Java自带的远程方法调用工具。
- 技术特点:使用Java的序列化机制进行对象的序列化和反序列化,传输协议是Java自定义的协议。
- 应用场景:适用于Java语言环境下的远程方法调用。
九、与Spring Cloud区别对比:
| SpringCloud | Dubbo | |
| 注册中心 | Eureka、Nacos、Zookeeper | Zookeeper、Nacos |
| 服务调用 | RESTFul API基于http协议 | RPC基于Dubbo自定义协议 |
| 熔断器 | Hystrix | 不完善 |
| 配置中心 | Config | 无 |
| 网关 | Zuul | 无 |
| 优势 | 整合了众多组件、集成方便、开发成本低 | 大并发、通信性能好(单一长连接和NIO异步通讯,高效的序列化协议和通信框架)、负载均衡、服务调用、服务发现、服务治理 |
| 劣势 | 高并发场景下,通信效率可能较低 | 配置复杂、定制性较高、难度和成本高 |
Dubbo:更适合于需要高性能、大规模集群以及多语言支持的场景。
Spring Cloud:适合于需要快速开发、一站式解决方案以及跨平台能力的场景。更适用于小规模微服务集群。
