DubboX简介
DubboX,也称为Dubbo eXtended,是Apache Dubbo的一种扩展版本。
前身是阿里巴巴的开源项目Dubbo,后来阿里不再维护此框架,进而当当网进行了进一步维护,为了和Dubbo区分就取名为Dubbox。
DubboX功能
DubboX提供了多注册中心、多协议支持、多协议序列化支持、负载均衡策略、集群容错等功能。
DubboX注册中心
DubboX 允许同时使用多个注册中心,比如: ZooKeeper、Redis、Multicast、直连等。
如下图所示:
1.Zookeeper
Zookeeper是Dubbo最常用的注册中心之一,它提供了高可用性和分布式协调服务,能够有效地管理服务的注册和发现。
Dubbo通过Zookeeper注册中心可以实现服务的自动发现和动态路由。
2.Redis
Redis也可以作为Dubbo的注册中心使用。它通常用于较小规模的应用,提供了轻量级的服务注册和发现功能。
3.Multicast
Multicast注册中心使用多播协议来进行服务的广播和发现,不需要独立的注册中心服务器,它适用于小型网络或开发和测试环境。
4.Simple
Simple注册中心是Dubbo内置的一种轻量级注册中心,通常用于本地开发和测试,它不需要独立的注册中心服务器,仅用于单机调试。
DubboX多协议支持
DubboX支持多种通信协议,比如:Dubbo协议、RMI、Hessian、HTTP、WebService等。
1.Dubbo协议
这是Dubbo的默认协议,它基于Netty传输,采用二进制编码。
Dubbo协议提供了高性能的远程调用,适用于Java应用程序之间的通信。
2.RMI(Remote Method Invocation)协议
Dubbo还支持Java标准的RMI协议,RMI协议用于在Java应用程序之间进行远程调用,它提供了Java对象的远程调用能力。
3.Hessian协议
Hessian是一种基于HTTP的协议,用于跨语言的远程调用。
Dubbo支持Hessian协议,使Dubbo服务可以与不同语言的应用程序进行通信。
4.HTTP协议
Dubbo还支持HTTP协议,这使得Dubbo服务可以通过HTTP进行远程调用,HTTP协议通常用于跨平台和跨语言的通信。
5.WebService协议
Dubbo支持基于SOAP的WebService协议,允许Dubbo服务提供和调用Web服务,这对于与传统的Web服务集成非常有用。
多协议支持有助于实现与多种应用程序和系统的集成,无论它们使用哪种通信协议。
DubboX架构
Dubbo架构图,如下所示:
Dubbo整个架构包含:接口层、配置层、代理层、注册层、集群层、监控层、调用层、交换层、传输层、序列化层等10大层设计。
1. 服务接口层
服务接口层:根据服务提供方和服务消费方的业务设计对应的接口和实现。
2. 配置层
配置层:主要就是对外配置接口,可以通过Spring解析配置生成配置类。
3.服务代理层
服务代理层:主要就是生成服务的客户端代理。
4.服务注册层
服务注册层:主要就是封装服务地址的注册与发现。
5.集群层
集群层:就是Dubbo集群相关的封装,比如:多个提供者的路由、及服务负载均衡等。
6.监控层
监控层:主要就是RPC调用次数和调用时间监控。
7.远程调用层
远程调用层:主要就是封将RPC调用,比如:完成网络A服务器到B服务器的整个远程通信调用。
8. 信息交换层
信息交换层:主要就是封装请求响应模式,比如:同步转异步等。
9.网络传输层
网络传输层:主要就是解决网络传输的各种通信问题。
10.数据序列化层
数据序列化层:我们都知道数据在网络传输,不可能是对象进行传输,都是需要序列化后才能在网络两端传输,这就是会涉及到序列化。
DubboX多语言支持
DubboX支持多种编程语言,包括Java、Python等,多语言支持有助于解决异构系统之间的互操作性问题,实现更广泛的集成。
这允许Dubbo服务成为跨语言的分布式服务,使得不同编程语言的应用程序能够调用Dubbo服务。
DubboX多协议序列化支持
DubboX提供了多种协议的序列化支持,比如:Dubbo序列化、Fastjson、Hessian2、Kryo等。
1.Dubbo序列化
这是Dubbo的默认序列化方式,它采用了高效的二进制序列化协议。
Dubbo序列化在性能上具有优势,适用于Java应用程序之间的通信。
2.Hessian2序列化
Hessian2是一种二进制序列化协议,用于跨语言的远程调用。
Dubbo支持Hessian2序列化,使Dubbo服务可以与不同语言的应用程序进行通信。
3.Fastjson序列化
Fastjson是一种高性能的JSON序列化库,Dubbo可以使用Fastjson作为序列化方式,以支持JSON格式的数据交换。
这对于与Web应用程序和RESTful服务进行通信非常有用。
4.Kryo序列化
Kryo是一种高性能的Java对象序列化库,Dubbo支持Kryo序列化,Kryo序列化通常用于Java应用程序之间的高性能通信。
多协议序列化支持有助于实现与不同类型的客户端的数据交换,提高了互操作性。
DubboX负载均衡策略
DubboX引入了多种负载均衡策略,如Round Robin、Least Active、Consistent Hash等。
这有助于更好地分配负载,确保各个服务提供商得到平等的机会来处理请求。
不同负载均衡策略适用于不同类型的负载情况,有助于提高系统的性能。
DubboX集群容错策略
DubboX提供多种集群容错策略,如Failover、Failfast、Failsafe等,这有助于确保在面对故障时,系统可以提供可靠的服务。
集群容错策略有助于提高系统的稳定性,确保即使在部分失败的情况下也能够保持服务的可用性。
dubbox使用示例
1. 创建Dubbo服务接口
首先,创建一个Dubbo服务接口,这是定义服务的契约,服务提供者和服务消费者都将依赖于这个接口。
public interface GreetingService { String sayHello(String name); }
2. 创建Dubbo服务提供者
接下来,创建一个Dubbo服务提供者,实现上述接口。
@Service public class GreetingServiceImpl implements GreetingService { @Override public String sayHello(String name) { return "Hello, " + name; } }
3. 配置Dubbo服务提供者
<dubbo:application name="example-provider"/> <dubbo:registry address="zookeeper://127.0.0.1:2181"/> <dubbo:protocol name="dubbo" port="20880"/> <dubbo:service interface="com.example.GreetingService" ref="greetingService"/> <bean id="greetingService" class="com.example.GreetingServiceImpl"/>
4. 创建Dubbo服务消费者
@Service public class ClientService { @Reference private GreetingService greetingService; public String invokeRemoteService(String name) { return greetingService.sayHello(name); } }
5. 配置Dubbo服务消费者
在服务消费者的Spring配置文件中,配置Dubbo服务引用。
<dubbo:application name="example-consumer"/> <dubbo:registry address="zookeeper://127.0.0.1:2181"/> <dubbo:reference interface="com.example.GreetingService" id="greetingService" check="false"/>
6. 调用Dubbo服务
最后,在服务消费者中调用Dubbo服务。
public class Main { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml"); ClientService clientService = context.getBean(ClientService.class); String result = clientService.invokeRemoteService("Alice"); System.out.println(result); } }
总的来说,DubboX的功能增强了Dubbo框架的灵活性、可扩展性和适应性,使其能够适应各种不同的应用场景和需求,从而更好地满足企业级应用的多样化需求。
mikechen
mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!

后台回复【架构】即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》