Dubbo
Dubbo 与 RPC 的关系
Dubbo 是一种开源的分布式服务框架,由阿里巴巴公司开发。它为应用程序提供高性能的 RPC(远程过程调用)通信和服务治理能力,让应用程序能够在分布式环境中快速构建高可靠性和可扩展性的服务。Dubbo 核心功能包括服务注册与发现、负载均衡、服务调用和容错能力等,适用于多种语言和多种异构环境的通信。Dubbo 采用阻塞 I/O 和线程池的方式来实现高并发,同时还支持多种协议和序列化格式的扩展。其生态系统日趋完善,用户社区活跃,被广泛应用于 Web 应用,企业级中间件,大数据等领域。
Dubbo 的核心
Dubbo 的核心包括了:
- 远程通讯:Dubbo 提供了多种远程通讯协议,如 Dubbo 协议、Http 协议、RMI 协议等。其中,Dubbo 协议是 Dubbo 自带的一种二进制、高性能的 RPC 通讯协议,具有较低的序列化和反序列化开销,适合高并发、大数据量的服务通讯。
- 集群容错:当 Dubbo 消费者发起服务调用时,Dubbo 提供了多种集群容错策略,如 Failover、Failfast、Failsafe、Failback 等。Failover 是 Dubbo 的默认集群容错策略,其会在服务提供者出错或超时时自动切换到其他可用节点进行调用,保证调用的可靠性。
- 自动发现:为了便于管理众多的服务提供者,Dubbo 提供了注册中心作为服务注册与发现的中心化管理工具。Dubbo 支持多种注册中心,如 ZooKeeper、Redis、Consul、Etcd 等。通过注册中心,服务消费者可以自动发现可用的服务提供者,而无需手动配置服务提供者地址,大大降低了服务调用的复杂度。
Dubbo 和 Spring Cloud区别
Dubbo 是一个高性能的 RPC 框架,主要用于构建微服务架构下的服务治理和服务通信。它可以非常方便地扩展服务,提高系统的性能和可扩展性。
Spring Cloud 是一个完整的微服务框架,它提供了一整套微服务框架的解决方案,包括服务注册与发现、配置中心、负载均衡、断路器、路由等等,比 Dubbo 更为全面。
深入了解:微服务框架对比:Spring Cloud vs Dubbo
Dubbo 的节点
- Provider:发布服务,并将服务注册到注册中心,等待消费者调用。
- Consumer:从注册中心订阅服务,和服务提供者进行通信,消费服务。
- Registry:记录服务提供者的信息,以及服务提供者和服务消费者之间的关系,帮助消费者发现可用的服务实例。
- Monitor:收集 Dubbo 节点的性能指标、服务调用统计信息等,以便运维人员进行监控和管理。
- Container:服务的运行容器
Dubbo 的框架
Dubbo 的框架 包括了:
- 单一应用框架:适用于流量较小的时候
- 垂直应用框架:适用与流量较大的时候
- 分布式服务架构:适用于垂直应用架构较多的时候
- 流动计算架构:当流量超级大的时候,需要一个调度中心
Dubbo 服务
Dubbo 接口定义
我们可以写一个 sayHello 的方法。
/** * xml方式服务提供者接口 */ public interface ProviderService { String SayHello(String word); }
接着,定义它的实现类。
/** * xml方式服务提供者实现类 */ public class ProviderServiceImpl implements ProviderService{ public String SayHello(String word) { return word; } }
然后,导入 maven 依赖。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.ouyangsihai</groupId> <artifactId>dubbo-provider</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- https: //mvnrepository.com/artifact/com.alibaba/dubbo --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.6</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.10</version> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.5</version> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.32.Final</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.8.0</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>2.8.0</version> </dependency> </dependencies> </project>
发布 Dubbo 接口
接口写完之后,需要进行接口的发布,这样才能访问到此接口。
package com.sihai.dubbo.provider; import com.alibaba.dubbo.config.ApplicationConfig; import com.alibaba.dubbo.config.ProtocolConfig; import com.alibaba.dubbo.config.RegistryConfig; import com.alibaba.dubbo.config.ServiceConfig; import com.alibaba.dubbo.container.Main; import com.sihai.dubbo.provider.service.ProviderService; import com.sihai.dubbo.provider.service.ProviderServiceImpl; import org.springframework.context.support.ClassPathXmlApplicationContext; import java.io.IOException; /** * xml方式启动 * */ public class App { public static void main( String[] args ) throws IOException { //加载xml配置文件启动 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("META-INF/spring/provider.xml"); context.start(); System.in.read(); // 按任意键退出 } }
启动 Dubbo 服务
最后就是启动 Dubbo 服务,看到以下 log,说明启动成功。
知识扩展:
- 分布式 RPC 框架比较:dubbo、dubbox、motan、thrift、grpc
- 深入理解 Dubbo:原理和机制详解