Dubbo 是一个由阿里巴巴开发的开源分布式服务框架,用于解决微服务架构下的服务治理与通信问题,是具有高性能,可拓展,松耦合等特性的RPC框架。还提供了一套完整的服务治理解决方案,包括服务注册与发现、负载均衡、远程调用、容错机制等。
总之,Dubbo 不光可以帮助我们调用远程服务,还提供了一些其他开箱即用的功能比如智能负载均衡。
当服务越来越多之后,服务调用关系越来越复杂。当应用访问压力越来越大后,负载均衡以及服务监控的需求也迫在眉睫。以上需求,Dubbo就可以做到。
- 负载均衡:同一个服务部署在不同的机器时该调用哪一台机器上的服务。
- 服务调用链路生成:随着系统的发展,服务越来越多,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。Dubbo 可以为我们解决服务之间互相是如何调用的。
- 服务访问压力以及时长统计、资源调度和治理:基于访问压力实时管理集群容量,提高集群利用率。
Dubbo一般应用在分布式系统中,所谓分布式就是我们把整个系统拆分成不同的服务然后将这些服务放在不同的服务器上减轻单体服务的压力提高并发量和性能。
单体应用的代码都集中在一起,而分布式系统的代码根据业务被拆分。所以,每个团队可以负责一个服务的开发,这样提升了开发效率,更便于之后的维护和扩展,更能提高整个系统的性能。
在集群负载均衡时,Dubbo 提供了多种均衡策略,默认为 random 随机调用。还有最少活跃法和一致性hash法,具体见负载均衡相关知识。
常见错误:
- Dubbo 接口无论是入参、出参,以及参数中的包括的对象,都必须 implements Serializable
- Dubbo 接口实现需要使用
@org.apache.dubbo.config.annotation.Service不要用 Spring 的 Service
项目中采用的yml配置广播模式的 Dubbo,实际使用的过程中一般都是使用注册中心模式。注册中心模式常需要启动Zookeeper。还需要经过以下步骤:
- 定义服务接口:创建一个Java接口声明服务方法。
- 实现服务提供者:创建服务实现类,并使用Dubbo的注解或配置文件将其暴露为远程服务。
- 配置服务提供者:在Spring配置文件中配置Dubbo应用、注册中心、协议及服务提供者。
- 编写并启动服务提供者应用:创建启动类加载Spring配置文件,启动服务提供者。
- 实现服务消费者:创建服务消费者类,注入服务接口。
- 配置服务消费者: 在Spring配置文件中配置Dubbo应用、注册中心及服务引用。
- 编写并启动服务消费者应用:创建启动类加载Spring配置文件,启动服务消费者。
RPC(Remote Procedure Call) 即远程过程调用,其核心是希望远程调用可以像本地函数调用一样简单。
RPC与HTTP:
- 纯裸TCP可以收发数据,但它是一个无边界的数据流,上层需要定义消息格式来确定消息边界,因而产生了各种协议,如HTTP和各类RPC协议。
- RPC本质上是调用方式,不算协议,而具体实现如gRPC和Thrift才是协议,它们实现了RPC调用,旨在使程序员像调用本地方法一样调用远程服务方法。RPC有多种实现方式,不一定基于TCP协议。
- 历史上,HTTP主要用于B/S架构,RPC更多用于C/S架构,但B/S 和 C/S 在慢慢融合。很多软件同时支持多端,所以对外一般用 HTTP 协议,而内部集群的微服务之间则采用 RPC 协议通信。
- RPC 其实比 HTTP 出现的要早,且比目前主流的 HTTP1.1 性能要更好,所以大部分公司内部都还在使用 RPC。尽管HTTP2.0 在 HTTP1.1 的基础上做了优化,性能可能比很多 RPC 协议都要好。
ZooKeeper 是一个开源的分布式协调服务,为我们提供了高可用、高性能、稳定的分布式数据一致性解决方案,通常被用于实现数据发布/订阅、负载均衡、布式协调/通知、分布式锁等功能。这些功能的实现主要依赖于 ZooKeeper 提供的 数据存储+事件监听 功能。
ZooKeeper提供有序的临时顺序节点特性,通过创建临时顺序节点并监视前一个节点,可以实现分布式锁。
主要通过创建临时顺序节点,排序子节点,获取最小节点以获得锁,并设置监听删除前一个节点来协调锁的释放。步骤如下:
- 创建节点:
客户端尝试在特定路径下创建一个临时顺序节点。在Zookeeper中,临时节点会在客户端会话结束时自动删除。 - 获取子节点:
客户端获取该路径下的所有子节点列表,并排序。 - 检查节点位置:
客户端检查自己创建的节点是否是所有子节点中序号最小的。如果是,则获得锁。 - 监听前一个节点:
如果不是最小的节点,客户端需要在比自己小的前一个节点上设置监听器,以便在前一个节点被删除时收到通知。 - 重新尝试获取锁:
当收到前一个节点删除的通知后,重复步骤2和步骤3,检查是否可以获得锁。 - 释放锁:
客户端完成任务后,删除自己创建的节点,锁即被释放。