# RPC 协议远程调用的几种实现
# Dubbo 简介
Dubbo 是阿里巴巴公司开源的一个高性能、轻量级的 Java RPC 框架。
致力于高性能透明化的透明化的 RPC 原创服务调用方案,以及 SOA 服务治理方案。
- 面向接口的远程方法调用(RPC):像调用本地方法一样调用远程服务,对开发者透明,降低了分布式服务调用的复杂度。
- 智能容错和负载均衡:提供了多种容错策略(如失败自动切换、失败安全等)和内置的负载均衡算法(如随机、轮询、最少活跃调用数等),保证了服务的高可用性。
- 服务自动注册与发现:服务提供者向注册中心注册自己的服务,消费者从注册中心发现服务地址列表,并能感知服务的上下线,实现软负载。
- 高度可扩展性:几乎所有组件(如协议、序列化、传输、注册中心等)都是可插拔的,允许用户根据自身需求进行定制和扩展。
- 运行期流量调度:可以在后台进行路由规则、配置规则的调整,实现灰度发布、权重路由等精细化的流量控制。
- 可视化服务治理:提供丰富的服务治理功能,如服务查询、服务测试、服务 Mock、依赖分析、健康度检查等,通常通过 Dubbo Admin 控制台进行操作。
Dubbo 的架构主要包含以下几个角色:
- Provider:服务提供者。发布服务到注册中心。
- Consumer:服务消费者。从注册中心订阅服务,并调用提供者。
- Registry:注册中心。负责服务的注册与发现。
- Monitor:监控中心。统计服务的调用次数和调用时间等监控信息。
- Container:服务运行容器。负责启动、加载、运行服务提供者。
调用流程:
- 启动阶段:服务容器启动、加载并运行 Provider。Provider 在启动时,会向 Registry 注册自己提供的服务。
- 订阅阶段:Consumer 在启动时,向 Registry 订阅自己所需要服务的地址列表。Registry 会将提供者地址列表返回给 Consumer,同时 Consumer 会与 Registry 建立动态监听,以便感知服务变化。
- 调用阶段:
- Consumer 根据负载均衡算法,从本地缓存的服务地址列表中,选择一个 Provider 进行调用。
- 调用时,Consumer 的接口代理会将调用信息(接口名、方法名、参数等)进行序列化,通过网络传输给 Provider。
- Provider 收到请求后,反序列化数据,通过反射调用本地实现,并将结果返回给 Consumer。
- 监控:Consumer 和 Provider 在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到 Monitor。