Dubbox最全详解(万字图文)

Dubbox最全详解(万字图文)-mikechen

DubboX简介

DubboX,也称为Dubbo eXtended,是Apache Dubbo的一种扩展版本。

前身是阿里巴巴的开源项目Dubbo,后来阿里不再维护此框架,进而当当网进行了进一步维护,为了和Dubbo区分就取名为Dubbox。

 

DubboX功能

DubboX提供了多注册中心、多协议支持、多协议序列化支持、负载均衡策略、集群容错等功能。

 

DubboX注册中心

DubboX 允许同时使用多个注册中心,比如: ZooKeeper、Redis、Multicast、直连等。

如下图所示:

Dubbox最全详解(万字图文)-mikechen

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架构图,如下所示:

Dubbox最全详解(万字图文)-mikechen

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面试题总结

评论交流
    说说你的看法