dubbo各层的原理

Dubbo框架按照功能和职责划分,主要包含以下几个分层:

1.服务接口层(Service Interface Layer):

  • 位于最上层,定义了服务提供者和服务消费者之间的接口。这一层是业务逻辑的抽象,服务提供者实现这些接口,而服务消费者通过调用这些接口实现对服务的调用。
  • 服务提供者负责实现服务接口定义。这是业务逻辑的具体实现,服务提供者将实现类注册到Dubbo框架中,以便服务消费者能够发现和调用。

  • 服务消费者通过Dubbo框架引用远程服务接口,这涉及到服务代理的生成。Dubbo会生成一个代理对象,代理对象实现了服务接口,并通过网络调用实际的服务提供者。

2.配置层(Config Layer):

  • 用于对Dubbo框架的各项配置进行管理。包括服务提供者的配置、服务消费者的配置、注册中心的配置等。配置层的设计允许通过XML、注解或API等方式进行配置。
  • Dubbo的XML配置是通过解析XML文件来配置各种服务提供者、服务消费者、注册中心、协议等的属性。用户可以通过在<dubbo:service><dubbo:reference>等标签中设置属性值来配置Dubbo的各项功能。

    <!-- 服务提供者配置 -->
    <dubbo:service interface="com.example.HelloService" ref="helloService" />
    
    <!-- 服务消费者配置 -->
    <dubbo:reference interface="com.example.HelloService" id="helloService" />
    
  • Dubbo还支持使用注解进行配置,通过在服务提供者和服务消费者的类上添加相应的注解来配置。这种方式提供了一种更加简洁的配置方式,适用于基于注解的项目。

    // 服务提供者配置
    @Service(interfaceClass = HelloService.class)
    public class HelloServiceImpl implements HelloService {
        // ...
    }
    
    // 服务消费者配置
    @Reference(interfaceClass = HelloService.class)
    private HelloService helloService;
    
  • Dubbo还提供了通过API进行配置的方式,即通过Java代码来配置Dubbo的各项功能。这种方式可以在运行时动态配置Dubbo的参数,更加灵活。

    // 服务提供者配置
    ServiceConfig<HelloService> serviceConfig = new ServiceConfig<>();
    serviceConfig.setInterface(HelloService.class);
    serviceConfig.setRef(new HelloServiceImpl());
    serviceConfig.export();
    
    // 服务消费者配置
    ReferenceConfig<HelloService> referenceConfig = new ReferenceConfig<>();
    referenceConfig.setInterface(HelloService.class);
    HelloService helloService = referenceConfig.get();
    

3.服务代理层(Proxy Layer):

  1. 服务导出(Export):

    • 当服务提供者启动时,Dubbo框架会扫描服务提供者实现类,解析服务接口和实现类的关系。然后,Dubbo会将服务接口和实现类的关系以及相关的配置信息注册到框架中。

    • Dubbo使用Java的反射机制获取服务提供者的方法信息,并生成一个Invoker对象,该对象封装了方法的调用逻辑。

    • 最后,Dubbo会将Invoker对象封装成Exporter对象,Exporter对象表示服务的导出,包含了服务的地址、协议、Invoker等信息。

  2. 服务引用(Refer):

    • 当服务消费者引用远程服务时,Dubbo框架会生成一个服务代理对象。该代理对象实现了服务接口,并通过远程调用实际的服务提供者。

    • Dubbo使用Java的动态代理机制创建服务代理对象。对于服务接口,Dubbo会生成一个代理类,该代理类实现了服务接口,并在方法调用时通过Invoker对象进行远程调用。

    • 服务代理对象对于服务消费者来说,就像是本地的服务一样,可以直接调用服务接口中的方法,而Dubbo框架负责将调用转发到远程服务提供者。

  3. 动态代理的实现:

    • Dubbo使用Java的java.lang.reflect.Proxy类来实现动态代理。通过调用Proxy.newProxyInstance方法,Dubbo生成一个代理类的实例。

    • 生成的代理类实现了服务接口,其中的方法调用会被转发到InvocationHandler的实现类。在Dubbo中,DubboInvoker实现了InvocationHandler接口。

    • DubboInvoker中的invoke方法负责处理远程调用逻辑。它通过Invoker对象将调用信息进行封装,然后通过网络传输到远程服务提供者。

    • 远程服务提供者接收到调用信息后,执行相应的方法,并将结果返回给服务消费者。

4.注册中心层(Registry Layer):

  1. 服务注册:

    • 当服务提供者启动时,Dubbo框架会将服务提供者的信息注册到注册中心。这包括服务接口、实现类、服务地址、协议、权重等信息。

    • 注册中心负责维护这些信息,使得服务消费者能够通过注册中心查询到可用的服务提供者。

  2. 服务发现:

    • 当服务消费者启动时,Dubbo框架会从注册中心获取服务提供者的信息。服务消费者通过注册中心查询到所有可用的服务提供者列表。

    • 注册中心会实时监控服务提供者的变化,当有新的服务提供者上线或下线时,注册中心会主动通知到所有的服务消费者。

  3. 负载均衡:

    • 注册中心层还涉及到负载均衡的问题。Dubbo框架支持多种负载均衡策略,例如随机负载均衡、轮询负载均衡、最小活跃数负载均衡等。

    • 在服务消费者发起调用时,注册中心会根据负载均衡策略选择一个合适的服务提供者进行调用。这样可以有效分担服务提供者的压力,提高系统的可用性和性能。

  4. 实现方式:

    • Dubbo支持多种注册中心实现,包括Zookeeper、Redis、Multicast等。每种注册中心都有对应的实现类,Dubbo通过SPI(Service Provider Interface)机制来加载注册中心的实现。

    • 注册中心的实现负责与具体的注册中心通信,包括服务的注册、发现、心跳检测等。不同的注册中心可能有不同的通信协议和数据存储方式。

  5. 集群管理:

    • Dubbo的注册中心层还支持集群管理,即在注册中心之间进行相互备份,以提高系统的可靠性。Dubbo支持多种集群模式,包括Failover、Failback等。

    • 集群管理的目标是保证注册中心的高可用性,使得即使部分注册中心失效,整个系统仍能正常运行。

5.集群层(Cluster Layer):

  1. 负载均衡:

    • Dubbo的集群层支持多种负载均衡策略,包括随机负载均衡、轮询负载均衡、最小活跃数负载均衡等。

    • 负载均衡的目标是将服务调用均匀地分配到多个服务提供者上,以充分利用资源,提高系统的性能。

  2. 容错处理:

    • Dubbo的集群层支持多种容错处理策略,用于处理服务提供者的调用失败。

    • 常见的容错处理策略包括:

      • Failover(失败自动切换): 当调用失败时,自动切换到下一个可用的服务提供者。
      • Failfast(快速失败): 快速返回失败响应,适用于对调用响应时间要求较高的场景。
      • Failsafe(安全失败): 记录失败的调用,但不抛出异常,适用于容忍部分失败的场景。
      • Failback(失败自动恢复): 定时重发调用,适用于对数据一致性要求较高的场景。
    • 这些容错处理策略可以根据实际需求进行配置,使得Dubbo在面对不同的故障场景时能够有针对性地进行处理。

  3. 集群容错:

    • Dubbo的集群层还支持集群容错,即在多个服务提供者之间进行容错处理。

    • 集群容错的目标是提高整个系统的可用性,使得即使部分服务提供者出现故障,整个系统仍能正常运行。

  4. 集群路由:

    • Dubbo的集群层支持集群路由,可以根据一些条件来动态路由服务调用。

    • 集群路由可以用于实现灰度发布、AB测试等功能,根据实际场景选择不同的服务提供者集群。

6.监控层(Monitor Layer):

  1. 据收集:

    • Dubbo的监控层通过拦截服务的调用,收集关于调用次数、响应时间、失败次数等方面的数据。这些数据会被汇总到监控中心进行统计。

    • Dubbo通过Filter机制,可以在服务提供者和服务消费者的调用链上添加监控相关的逻辑,从而实现对调用数据的收集。

  2. 数据传输:

    • Dubbo监控层使用了统一的数据传输协议,将收集到的监控数据传输到监控中心。常见的数据传输方式包括HTTP、RMI、MQ等。

    • 监控中心可以是Dubbo官方提供的Dubbo Admin、其他第三方监控中心,或者用户自己实现的监控中心。

  3. 数据展示:

    • 监控中心负责展示监控数据,提供图形化的界面和报表,帮助用户直观地了解系统的运行状况。

    • Dubbo Admin是Dubbo官方提供的监控中心,它通过Web界面展示了服务的调用次数、响应时间、失败次数等关键性能指标。

  4. 可扩展性:

    • Dubbo的监控层具有较好的可扩展性,用户可以根据自己的需求实现自定义的监控中心,或者选择使用其他第三方的监控中心。

    • Dubbo框架提供了SPI(Service Provider Interface)机制,用户可以通过实现相应的接口,将自定义的监控中心集成到Dubbo中。

7.远程调用层(Protocol Layer):

Dubbo的远程调用层负责实现服务提供者和服务消费者之间的远程通信。它包括协议层、传输层和编解码层,确保服务的调用在分布式环境下能够顺利进行。以下是Dubbo远程调用层的基本原理:

  1. 协议层:

    • Dubbo支持多种协议,例如Dubbo协议、HTTP协议等。协议层定义了服务提供者和服务消费者之间的通信规则和消息格式。

    • Dubbo协议是Dubbo框架默认的协议,它是一种基于Netty的二进制协议。Dubbo协议定义了服务注册、服务发现、服务调用等各个阶段的消息格式和交互规则。

    • 使用不同的协议可以适应不同的场景,例如HTTP协议可与非Java语言的服务进行通信。

  2. 传输层:

    • 传输层负责实际的数据传输和网络通信。Dubbo框架使用Netty作为默认的传输层实现,Netty是一种高性能的网络通信框架。

    • Netty提供了异步、事件驱动的网络通信模型,使得Dubbo在高并发、大流量的场景下能够更高效地进行远程调用。

  3. 编解码层:

    • 编解码层负责将Java对象转换为二进制数据进行网络传输,并在接收端将二进制数据还原为Java对象。这个过程称为序列化和反序列化。

    • Dubbo默认使用Hessian2作为序列化协议,Hessian2是一种高效的二进制序列化协议,适合Java对象的序列化。

    • 编解码层的选择影响了Dubbo的性能和跨语言通信能力,因此在特定场景下,用户可以根据需求选择其他序列化协议,例如JSON、Protobuf等。

  4. 远程调用流程:

    • 当服务消费者发起调用时,Dubbo框架会将调用信息封装成一个请求消息,通过传输层发送给服务提供者。

    • 服务提供者接收到请求消息后,通过解码层将二进制数据还原为调用信息。然后,服务提供者根据调用信息执行相应的服务逻辑,将结果封装成响应消息。

    • 响应消息通过传输层发送给服务消费者,服务消费者通过解码层将响应消息还原为结果对象,完成整个远程调用过程。

8.消息派发层(Dispatcher Layer):

Dubbo消息派发层主要负责将消息分发给具体的服务实现,并处理服务的调用过程。消息派发层涵盖了服务端的过滤器链、调用链和代理对象等关键概念。以下是Dubbo消息派发层的基本原理:

  1. 过滤器链:

    • 在Dubbo的消息派发过程中,过滤器链是一个关键的概念。服务提供者和服务消费者都可以配置一系列的过滤器,用于在消息派发的不同阶段进行处理。

    • 过滤器链分为两种类型:服务提供者过滤器链服务消费者过滤器链。服务提供者过滤器链用于处理服务提供者端的请求,而服务消费者过滤器链用于处理服务消费者端的响应。

    • 过滤器可以实现一些通用的逻辑,如性能监控、日志记录、安全验证等。Dubbo框架内部提供了多个内置的过滤器,同时用户也可以自定义过滤器来满足特定需求。

  2. 调用链:

    • Dubbo的调用链(Invocation Chain)是在消息派发过程中形成的一系列调用节点。每个节点对应服务提供者或服务消费者的一个环节。

    • 调用链包括了多个拦截器(Invoker)以及最终的服务实现。在消息派发的过程中,调用链会按照预定的顺序依次执行。

    • 拦截器负责处理具体的逻辑,例如参数校验、事务管理、性能监控等。通过调用链的机制,Dubbo实现了服务提供者和服务消费者的解耦,能够在调用过程中方便地插入和扩展逻辑。

  3. 代理对象:

    • 在服务提供者端,Dubbo通过代理对象将服务实现类进行封装。这个代理对象是调用链的入口,负责协调整个调用链的执行。

    • 代理对象可以包含多个拦截器,每个拦截器对应调用链中的一个环节。当服务被调用时,代理对象会按照事先配置好的拦截器链条执行各个拦截器的逻辑。

    • 在服务提供者端,代理对象的职责还包括将最终的调用结果返回给服务消费者。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值