IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 九、Dubbo原理 -> 正文阅读

[网络协议]九、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

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 12:47:24  更:2022-04-04 12:49:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:24:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码