九、Dubbo原理

Dubbo目录



九、Dubbo原理

1、RPC原理

9-1

一次完整的RPC调用流程(同步调用,异步另说)如下:

  • 1)服务消费方(client)调用 以本地调用方式 调用服务;

  • 2)client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体(序列化);

  • 3)client stub找到服务地址,并将消息发送到服务端;

  • 4)server stub收到消息后进行解码(反序列化);

  • 5)server stub根据解码结果调用本地的服务;

  • 6)本地服务执行并将结果返回给server stub;

  • 7)server stub将返回结果打包成消息并发送至消费方(序列化);

  • 8)client stub接收到消息,并进行解码(反序列化);

  • 9)服务消费方得到最终结果。

RPC框架的目标就是要2~8这些步骤都封装起来,这些细节对用户来说是透明的,不可见的。

2、netty通信原理

Dubbo底层实现两台服务器的通讯,使用的是netty框架,netty是基于java的NIO实现的,

Netty是一个异步事件驱动的网络应用程序框架, 用于快速开发可维护的高性能协议服务器和客户端。它极大地简化并简化了TCP和UDP套接字服务器等网络编程。

2.1、BIO:(Blocking IO)

阻塞IO,一个一个处理,类似同步

9-2

2.2、NIO (Non-Blocking IO)

非阻塞IO

Selector 一般称 为选择器 ,也可以翻译为 **多路复用器,**它监听多个Channel(通道),当发现某个通道在某一步已准备就绪,就额外开辟一个线程来处理这个通道,不是一个线程把一个请求完全处理完毕才开始处理下一个请求。

完整的处理一个请求的步骤分为四个阶段:

  • Connect(连接就绪)
  • Accept(接受就绪)
  • Read(读就绪)
  • Write(写就绪)
9-3

2.3、Netty基本原理

netty基本原理,可参考https://www.sohu.com/a/272879207_463994

不熟悉的话,就需要去学习了!

9-4

3、dubbo原理

3.1、dubbo原理-框架设计

框架设计 | Apache Dubbo

下图展示的东西很多,注意理清关系。

9-5

各层说明:

  • Business 业务逻辑层,只包括Service层,提供了各个接口与实现类,(编程使用时只关注的层),该层的下面都是Dubbo的原理。

  • RPC层:远程过程调用

    • config 配置层:对外配置接口,以 ServiceConfig, ReferenceConfig 为中心,可以直接初始化配置类,也可以通过 spring 解析配置生成配置类。(标签配置)

    • proxy 服务代理层:服务接口透明代理,生成服务的客户端 Stub 和服务器端 Skeleton, 以 ServiceProxy 为中心,扩展接口为 ProxyFactory。(生成客户端、服务端的代理)

    • registry 注册中心层:封装服务地址的注册与发现,以服务 URL 为中心,扩展接口为 RegistryFactory, Registry, RegistryService。(服务的注册与发现)

    • cluster 路由层:封装多个提供者的路由及负载均衡,并桥接注册中心,以 Invoker 为中心,扩展接口为 Cluster, Directory, Router, LoadBalance。(负载均衡)

    • monitor 监控层:RPC 调用次数和调用时间监控,以 Statistics 为中心,扩展接口为 MonitorFactory, Monitor, MonitorService。(监控)

    • protocol 远程调用层:封装 RPC 调用,以 Invocation, Result 为中心,扩展接口为 Protocol, Invoker, Exporter。

  • Remoting层(解决远程通信):

    • exchange 信息交换层:封装请求响应模式,同步转异步,以 Request, Response 为中心,扩展接口为 Exchanger, ExchangeChannel, ExchangeClient, ExchangeServer。(架起通信管道)

    • transport 网络传输层:抽象 mina 和 netty 为统一接口,以 Message 为中心,扩展接口为 Channel, Transporter, Client, Server, Codec。(信息传输)

    • serialize 数据序列化层:可复用的一些工具,扩展接口为 Serialization, ObjectInput, ObjectOutput, ThreadPool。

3.2、dubbo原理-启动解析、加载配置文件信息

Springboot中有个 BeanDefinitionParser(Bean定义解析器)

  • DubboBeanDefinitionParser implements BeanDefinitionParser

    • DubboBeanDefinitionParser.parse() ,解析配置文件中定义的标签,一个标签对应一个beanClass
    • 标签就对应着配置文件中的一个个配置,
  • 给DubboBeanDefinitionParser构造器打断点,调试,发现在构造器执行的前一步,有一个DubboNamespaceHandler

    • DubboNamespaceHandler extends NamespaceHandlerSupport
    • DubboNamespaceHandler(Dubbo名称空间处理器)
    • 它注册了许多标签解析器:DubboBeanDefinitionParser(如下图)
    • 会发现,每一个标签都有对应的Config(是不是想起了)七、Dubbo配置 中与SpringBoot整合的第三种方式

9-11

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.alibaba.dubbo.config.spring.schema;

import com.alibaba.dubbo.common.Version;
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ConsumerConfig;
import com.alibaba.dubbo.config.ModuleConfig;
import com.alibaba.dubbo.config.MonitorConfig;
import com.alibaba.dubbo.config.ProtocolConfig;
import com.alibaba.dubbo.config.ProviderConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.spring.ReferenceBean;
import com.alibaba.dubbo.config.spring.ServiceBean;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;

/**
 * DubboNamespaceHandler
 *
 * @export
 */
public class DubboNamespaceHandler extends NamespaceHandlerSupport {

    static {
        Version.checkDuplicate(DubboNamespaceHandler.class);
    }

    @Override
    public void init() {
        registerBeanDefinitionParser("application", new DubboBeanDefinitionParser(ApplicationConfig.class, true));
        registerBeanDefinitionParser("module", new DubboBeanDefinitionParser(ModuleConfig.class, true));
        registerBeanDefinitionParser("registry", new DubboBeanDefinitionParser(RegistryConfig.class, true));
        registerBeanDefinitionParser("monitor", new DubboBeanDefinitionParser(MonitorConfig.class, true));
        registerBeanDefinitionParser("provider", new DubboBeanDefinitionParser(ProviderConfig.class, true));
        registerBeanDefinitionParser("consumer", new DubboBeanDefinitionParser(ConsumerConfig.class, true));
        registerBeanDefinitionParser("protocol", new DubboBeanDefinitionParser(ProtocolConfig.class, true));
        registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true));
        registerBeanDefinitionParser("reference", new DubboBeanDefinitionParser(ReferenceBean.class, false));
        registerBeanDefinitionParser("annotation", new AnnotationBeanDefinitionParser());
    }

}

3.3、dubbo原理-服务暴露

registerBeanDefinitionParser(“service”, new DubboBeanDefinitionParser(ServiceBean.class, true));

服务暴露的流程,这些东西需要去源码。

9-7

3.4、dubbo原理-服务引用

最终返回的代理对象 就是我们 要远程引用的service

引用服务最终就会给我们返回代理对象。

9-8

3.5、dubbo原理-服务调用

框架设计 | Apache Dubbo

9-9

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悬浮海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值