ES源码四:网络通信层流程

听说ES网络层很难?今天来卷它😄

前言

ES网络层比较复杂,分为两个部分:

  1. 基于HTTP协议的REST服务端
  2. 基于TCP实现的PRC框架

插件化设计的网络层模块(NetworkModule)

入口还是上一章的创建Node构造方法的地方:
image.png
一直往下会找到之前说的加载module和服务的地方:
image.png

NetworkModule:

NetworkModule属性

image.png
有两个map,一个map存放tcp层的实现,一个map存放http层的实现

NetworkModule构造方法

image.png
上面的参数分别为:

  1. settings:settings配置
  2. transportClient: 一般为false
  3. plugins:NetworkPlugin 提供了获取TCPTransport和HTTPTransport的接口,NetworkModule通过遍历全部networkPlugin来加载所有的网络层实现,也就说说,ES的网络层不一定就是一种实现。你也可以通过实现NetworkPlugin去提供网络层实现。我们主要看的网络层是Netty4Plugin
  4. threadPool:线程池
  5. bigArrays:大数组,通信的时候会使用它的空间
  6. pageCacheRecycler:和核心流程没关系,跳过
  7. circuitBreakerService:和核心流程没关系,跳过
  8. namedWritableRegistry:
  9. xContentRegistry:
  10. networkService:网络服务,主要是将host地址转换为 Java Network地址对象,解析地址使用
  11. dispatcher:它的实现是RestController,RestController内部注册了很多处理器,对外提供访问路由的功能,也就说Http请求会转换为RestRequest,RestRequest最终会交给RestController去找到合适的handler,然后去访问最终的义务层逻辑,(后面源码会分析到)
  12. clusterSettings:集群配置

image.png
我们来看这里做了几件事(我们这里看的是Netty4Plugin):

  1. plugin.getHttpTransports:获取Http网络层的实现,这里返回的是一个map,key是netty4,value是一个Netty4Plugin lambda表达式

image.png
image.png

  1. 遍历httpTransportFactory,将key和value值放到之前的transportHttpFactories

image.png

  1. 后面的RPC逻辑类似,直接过😄


HTTP通信层**(Netty4HttpServerTransport)**

Netty4HttpServerTransport构造方法

image.png
和之前NetworkModule的参数基本差不多,多了一个sharedGroupFactory:这里是一个netty NioEventGroup。学过netty源码应该都懂,如果不懂,可以看我写的netty源码解析。

Netty4HttpServerTransport.doStart方法

入口:

Node->start() => injector.get(HttpServerTransport.class).start()=>Netty4HttpServerTransport.doStart
在node节点启动的时候,会存在image.png,这个httpServerTransport实现了AbstractLifecycleComponent,在它的start最终会调用到子类Netty4HttpServerTransport的doStart方法
image.png
image.png

doStart方法

image.png
image.png
都是netty服务端常规的配置,如果看不懂,还是要学一下netty源码的。学过netty的都知道,肯定是有一个服务端的请求入口Handler类的,这个类才是我们最要注意看的:Netty4HttpRequestHandler

Netty4HttpRequestHandler.channelRead0

请求处理入口:Netty4HttpRequestHandler->channelRead0(ctx, httpRequest)
image.png
又把请求转接给了Netty4HttpServerTransport.incomingRequest

Netty4HttpServerTransport.incomingRequest

请求处理入口: Netty4HttpServerTransport->incomingRequest(httpRequest, httpChannel
image.png
image.png

这里的核心逻辑就是:解析HttpRequest为RestRequest,包装HttpChannel为RestChannel。包装之后,最终交给 Dispatcher 方法


RestController.dispatchRequest

image.png
会接着调用RestController.tryAllHandlers方法
image.png
image.png
总结一下一共做了这几件事:

  1. �读取RestRequest请求路径(rawPath)及Method(GET、POST、DELETE…)等信息
  2. 根据rawPath等信息到PathTrie(字典树结构)中找到提供服务的Handler
  3. 调用BaseRestHandler->handleRequest(restRequest, restChannel, nodeClient) (BaseRestHandler为所有Rest*Action的父类…),比如我这里debug用的是写索引数据的rest请求,实际请求到的是RestIndexAction

#### BaseRestHandler.handleRequest ![image.png](https://img-blog.csdnimg.cn/img_convert/4415eb016166c65ad43bc4a09b57ef01.png)
![image.png](https://img-blog.csdnimg.cn/img_convert/7ce72cd7f91d788b21329c44389f03b0.png)
总结一下这里做了几件事:
  1. BaseRestHandler的prepareRequest是模版方法,最终会调用到RestIndexAction里面的prepareRequest方法,里面就是负责解析restRequest请求为具体的 业务请求对象,并生成一个lambda表达式
  2. BaseRestHandler调用action.accept 调用之前的lambda表达式

TCP通信层(ES内置RPC 实现,Netty4Transport)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/824745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL 安装与配置】Window简单安装MySQL,并配置局域网连接

文章日期:2024.04.17 系统:Window10 || Window11 类型:安装与配置MySQL数据库 文章全程已做去敏处理!!! 【需要做的可联系我】 AES解密处理(直接解密即可)(crypto-js.js…

系统稳定性建设

说到系统稳定性,不知道大家会想起什么?大多数人会觉得这个词挺虚的,不知道系统稳定性指的是什么。 一年前看到这个词,也是类似于这样的感受,大概只知道要消除单点、做好监控报警,但却并没有一个体系化的方…

记录一下我102连不上MySQL的问题 NotBefore

【背景描述】我在102上是能登录上MySQL的,但是用客户端(DataGrip、SQLyog就连不上) 【解决方案】 加个这个?useSSLfalse&serverTimezoneUTC 【另外的小问题】如果直接输mysql 上面这个不是报错,不用管 再输mysql -uroot -p…

upload-labs靶场详解

靶场环境 下载链接:https://codeload.github.com/c0ny1/upload-labs/zip/refs/heads/master 使用小皮集成环境来完成这个靶场 将文件放到WWW目录下就可以进行访问 进入关卡后页面呈现: Pass-01(前端绕过) 我们先尝试上传一个web.…

[svelte]属性和逻辑块

属性 / Default values • Svelte 教程 | Svelte 中文网 属性 Declaring props 到目前为止,我们只处理了内部状态——也就是说,这些值只能在给定的组件中访问。 在任何实际应用程序中,都需要将数据从一个组件向下传递到其子组件。为此&…

【Spring】-编程式事务和声明式事务

spring中控制事务的方式有两种:编程式事务和声明式事务,今天我以两种事务出发,对spring中实现事务的EnableTransactionManagement和Transaction两个注解的底层原理进行讨论。 一、编程式事务 什么是编程式事务? 硬编码的方式实现…

Adobe将Sora、Runway、Pika,集成在PR中

4月15日晚,全球多媒体巨头Adobe在官网宣布,将OpenAI的Sora、Pika 、Runway等著名第三方文生视频模型,集成在视频剪辑软件Premiere Pro中(简称“PR”)。 同时,Adob也会将自身研发的Firefly系列模型包括视频…

【Python】高级进阶(专版提升3)

Python 1 程序结构1.1 模块 Module1.1.1 定义1.1.2 作用1.1.3 导入1.1.3.1 import1.1.3.2 from import 1.1.4 模块变量1.1.5 加载过程1.1.6 分类 1.2 包package1.2.1 定义1.2.2 作用1.2.3 导入1.1.3.1 import1.1.3.2 from import 2 异常处理Error2.1 异常2.2 处理 3 迭代3.1 可…

Three.js 入门——核心概念和坐标系理解

Three.js 是什么? 一个封装了 WebGL 的库,简化 WebGL 的使用 WebGL vs OpenGL OpenGL 主要被认为是一种 API(应用程序编程接口),它为我们提供了大量可用于操作图形和图像的函数,主要用 C语言编写的。 然…

python辅助QQ登入

python辅助QQ登入 import pyautogui import time import random from pyautogui import ImageNotFoundException# 生成随机等待时间,范围在1到3秒之间 random_time random.uniform(1, 3)def find_and_click(image_path, moveFalse, execute_nextTrue):try:image_l…

【QT学习】7.事件,把文本显示在页面中(文本可变),鼠标指针切换,鼠标左键右键按下,qt设置背景样式

0.创建项目,事件的创建 1.事件的位置 2.这就是多态,子类重写父类函数,子类调用子类函数,也可以调用父类函数。但同函数名 1.要求:文本显示在页面中(文本可变) 1.文本显示在页面的核心代码 主要步…

DRF requets源码分析

【四】requets源码分析 【1】查看request传递的数据 (1)视图层 编写传输数据的接口查看request方法的参数 class BookAPIView(APIView):def get(self, request, *args, **kwargs):return Response({body: request.body, data: request.data, post: r…

【Web】DASCTF X GFCTF 2022十月挑战赛题解

目录 EasyPOP hade_waibo EasyLove BlogSystem EasyPOP 先读hint.php sorry.__destruct -> secret_code::secret() exp: $anew sorry(); $bnew secret_code(); $a->password"suibian"; $a->name"jay"; echo serialize($a); 真暗号啊&…

web项目中jsp页面不识别el表达式

如果使用el表达式出现下图问题 ** 解决办法 ** 这是因为maven创建项目时&#xff0c;web.xml头部声明默认是2.3&#xff0c;这个默认jsp关闭el表达式 修改web.xml文件开头的web-app的版本 <?xml version"1.0" encoding"UTF-8"?> <web-app x…

Python爬取猫眼电影票房 + 数据可视化

目录 主角查看与分析 爬取可视化分析猫眼电影上座率前10分析猫眼电影票房场均人次前10分析猫眼电影票票房占比分析 主角查看与分析 爬取 对猫眼电影票房进行爬取&#xff0c;首先我们打开猫眼 接着我们想要进行数据抓包&#xff0c;就要看网站的具体内容&#xff0c;通过按F12…

Postman之安装

Postman工具之介绍与安装 Postman是什么&#xff1f;Postman有几种安装方式&#xff1f; Postman是什么&#xff1f; postman是一款http客户端的模拟器&#xff0c;它可以模拟发出各种各样的网络请求&#xff0c;用于接口测试。 Postman有几种安装方式&#xff1f; 两种&…

4.17 网络编程

思维导图 select实现TCP并发服务器 #include <myhead.h> #define SER_IP "192.168.125.26" #define SER_PORT 8888int main(int argc, const char *argv[]) {int sfd socket(AF_INET,SOCK_STREAM,0);if(sfd -1){perror("socket error");return -1…

基于Java+SpringBoot+Mybaties-plus+Vue+elememt 小区物业管理系统 的设计与实现

一.项目介绍 系统分为管理员 和 业主 两块&#xff1a; 管理员点击进入到系统操作界面&#xff0c;可以对首页、业主信息管理、管理员信息管理、 楼栋和房屋信息管理、物业费管理、地下停车位管理、公告信息管理、报修信息管理、 投诉管理以及个人信息等功能模块 …

libftdi1学习笔记 5 - SPI Nor Flash

目录 1. 初始化 2. CS控制例子 3. 读ID 3.1 制造商 3.2 容量大小 3.3 设置IO类型 3.3.1 setQSPIWinbond 3.3.2 setQSPIMxic 3.3.3 setQSPIMicrochip 3.3.4 setQSPIMicron 4. 写保护 5. 等待空闲 6. 擦除扇区 7. 页编程 8. 页读 9. 写 10. 读 11. 验证 基于M…

cesium加载高层级离线影像地图瓦片(天地图、19级Arcgis)

实际加载效果如图&#xff1a; 1、下载离线地图瓦片方式&#xff08;多种任选其一&#xff0c;个人倾向于Qgis工具&#xff09;&#xff1a; 方式1、采用第三方下载工具如&#xff1a;91卫图、水经注、全能电子地图下载器、bigemap等等。&#xff08;这些有的下载层级不够&…