1.概述

转载:[6]elasticsearch源码深入分析——API源码分析

2.RestController的继承关系

Node实例化的过程中,我们知道ActionModuleNode提供Rest请求功能的主要模块。RestController的实例是在ActionModule实例化的时候传入的重要参数之一,RestControllerAPI提供服务的关键类之一,我们先从这个类开始梳理Rest API的加载逻辑。


RestController继承自AbstractComponent,实现了HttpServerTransport.Dispatcher接口。

抽象类AbstractComponent,没什么复杂的逻辑,就是定义了一个基类Logger,一个DeprecationLoggerDeprecation的Logger用处是打印settings配置中不提倡的参数设定(提醒ElasticSearch的使用者),该抽象类只有两个关于日志的方法:

  1. 调用AbstractComponentlogDeprecatedSetting(String settingName, String alternativeName)方法就能提示启动ElasticSearch的用户参数中的settingName是弃用的,可以用方法中的参数alternativeName来代替。
  2. 调用AbstractComponentlogRemovedSetting(String settingName, String alternativeName)方法能提示用户settingName参数已经被移除,可用alternativeName来代替。

因为设计思路是将dispatchRequest这样的方法设计成接口,而发送请求逻辑分组率属于HttpServerTransport,所以将Dispatcher接口设计成HttpServerTransport的内部接口,这样所有的Dispatcher的实现类都会带有HttpServerTransport接口的标记。

HttpServerTransport接口又实现了LifecycleComponent接口,LifecycleComponent接口标记了生命周期状态相关的逻辑,如下图:

其中Releasable类是ElasticSearch自己封装JDK1.7中的AutoCloseable。从LifecycleComponent的方法中可以看出该接口主要标记了Component的生命周期状态相关,当然还有添加和移除生命周期监听器,主要还是看LifecycleComponent的实现类是怎么实现这些标记的逻辑的。

下面我们查看HttpServerTransport接口的逻辑,这个接口也不复杂,在HttpServerTransport接口中则主要配置了http线程的线程名前缀,绑定的Address,Http信息和状态

HttpServerTransport的内部接口Dispatcher中,主要是两个方法:

void dispatchRequest(RestRequest request, RestChannel channel, ThreadContext threadContext)

发送request到相关处理请求程序,如果request不能被任何处理请求程序处理则直接响应给RestChannel

void dispatchBadRequest(RestRequest request, RestChannel channel, ThreadContext threadContext, Throwable cause)

发送一个失败的RestRequest,用在request是残缺的情况下。

2.1 RestController中的主要方法

梳理了RestController的父类结构,终于到了梳理RestController本身的时候了。RestController中最关键的方法是:

dispatchRequest(RestRequest request, RestChannel channel, ThreadContext threadContext)registerHandler(RestRequest.Method method, String path, RestHandler handler)

2.1.1 registerHadler方法

RestControllerregisterHandler方法做了哪些事呢?registerHandler的主要功能是当注册了一个REST处理程序后,如果提供的方法和路径之一匹配请求时,执行处理程序。

查看源码我们会发现主要做了两个操作

  1. registerHandler方法将BaseRestHandler的实例注册到usageService中,UsageService是监控ElasticSearch特性的服务(UsageService的主要逻辑是统计了RestController实例中的handler的占用数,底层是用的LongAdder,其适用于统计计数的场景),简而言之就是让NodeusageService加入对参数中handler和path的监控。
  2. 更新handlers中的参数。因为RestController中持有一个PathTrie<MethodHandlers>类型的handler,每次注册都更新这个handler里面的值。

2.1.2 dispatchRequest方法

这个方法是实现了Dispatcher接口中的dispatchRequest方法。

由于ElasticSearch没有用到任何WEB框架,rest请求底层都是使用Netty实现的,收到的请求都是从ElasticSearchtransport-netty4模块里面发送给ElasticSearch的核心的。

  1. transport-netty4模块的Netty4HttpRequestHandler类的channelRead0(ChannelHandlerContext ctx, Object msg)方法接受到其请求,然后发送给Netty4HttpServerTransportdispathchRequest方法
  2. Netty4HttpServerTransport再转发给RestControllerDispatchRequest方法RestControllerdispatchRequest,遍历所有可能的处理程序,发送请求:
 Iterator<MethodHandlers> allHandlers = getAllHandlers(request);for (Iterator<MethodHandlers> it = allHandlers; it.hasNext(); ) {final Optional<RestHandler> mHandler = Optional.ofNullable(it.next()).flatMap(mh -> mh.getHandler(request.method()));requestHandled = dispatchRequest(request, channel, client, mHandler);if (requestHandled) {break;}}

如果返回的requestHandledfalse,则返回失败的handleBadRequest(request, channel);

3.CAT API

3.1 cat aliases API

aliases显示有关当前配置的别名的信息,包括过滤器和路由信息。

GET /_cat/aliases?v

可能的响应:

alias  index filter routing.index routing.search
alias1 test1 -      -            -
alias2 test1 *      -            -
alias3 test1 -      1            1
alias4 test1 -      2            1,2

输出显示alias2已经配置了一个过滤器,以及alias3alias4中的特定路由配置。

如果只想获取有关特定别名的信息,则可以使用逗号分隔格式指定别名作为URL参数,例如,/_cat/aliases/aliases/alias1,alias2

REST请求是通过准备一个channel消费者(RestChannelConsumer)来处理的,Node在接收到aliases catAPI请求后,转发到RestAliasAction的doCatRequest方法,该方法会先确定这个请求是否是来自本地。RestAliasAction类的doCatRequest方法会返回一个RestChannelConsumer

RestAliasAction类的doCatRequest方法接收两个参数RestRequestNodeClient

这里的NodeClient是在本地节点上执行操作的Client。继承关系如下图:


其中Client接口提供了一个用于对集群执行actions或操作的接口。客户可以从一个org.elasticsearch.node.node检索开始,或远程连接使用一个或多个节点org.elasticsearch.client.transport.transportclient

NodeClientadmin方法是取得AbstractClient.Admin.IndicesAdmin实例,通过参数“索引别名请求(getAliasesRequest)”和“通知结果监听器(new RestResponseListener<GetAliasesResponse>(channel))”来获取特定索引或按名称存在的特定索引别名。

【es】es API源码分析相关推荐

  1. Asp.net web Api源码分析-HttpParameterBinding

    接着上文Asp.net web Api源码分析-Filter 我们提到filter的获取和调用,后面通过HttpActionBinding actionBinding = actionDescript ...

  2. Android 系统(78)---《android framework常用api源码分析》之 app应用安装流程

    <android framework常用api源码分析>之 app应用安装流程 <android framework常用api源码分析>android生态在中国已经发展非常庞大 ...

  3. 【ElasticSearch】Es 启动流程 源码分析

    文章目录 1. 概述 2. start方法 2.1 启动生命周期相关的组件 2.2 启动IndicesService 2.3 IndicesClusterStateService启动 2.4 Snap ...

  4. 【ES源码分析】强制合并分段(_forcemerge API)源码分析

    _forcemerge API 源码分析 文章目录 _forcemerge API 源码分析 合并方式 只合并删除文档 没有限制最大segment数的合并 限制了最大segment数的合并 合并策略 ...

  5. JDK源码分析 FutureTask源码分析

    文章目录 前言 一.Callable接口 二.Future接口 三.FutureTask源码分析 3.1 Future继承结构图 3.2 参数介绍 3.3 构造函数 3.4. FutureTask的A ...

  6. java 源代码 分析_Java Collections 源码分析

    Java Collections API源码分析 侯捷老师剖析了不少Framework,如MFC,STL等.侯老师有句名言: 源码面前,了无秘密 这句话还在知乎引起广泛讨论. 我对教授程序设计的一点想 ...

  7. SDL2源码分析之OpenGL ES在windows上的渲染过程

    SDL2源码分析之OpenGL ES在windows上的渲染过程 更新于2018年11月4日. 更新于2018年11月21日. ffmpeg + SDL2实现的简易播放器 ffmpeg和SDL非常强大 ...

  8. Elasticsearch-Jest 配置ES集群源码解读

    文章目录 Jest Github地址 搭建源码环境 Jest配置ES集群 Jest 配置ES集群,确保应用高可用的原理探究 初始化 JestClient NodeChecker 源码分析 发起请求的过 ...

  9. 【Android 插件化】VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )

    文章目录 一.目前的 API 现状 二.安装应用源码分析 1.安装按钮执行的操作 2.返回到 HomeActivity 执行的操作 一.目前的 API 现状 下图是 VirtualApp 官方给出的集 ...

最新文章

  1. 关于NB-IoT的十大问题和答案【转】
  2. jquery ajax返回Internal server error 500错误解决方案
  3. Java_Shell多线程
  4. CentOS 初体验十三:yum 安装 tomcat
  5. statusbar 尺寸 显示图标_StatusBar 图标展示流程 - 状态栏(StatusBar)镜头布局分析...- git完代码后的异常_169IT.COM...
  6. 从Hotspot JIT编译器打印生成的汇编代码
  7. plc单片机组态软件php_STC8单片机扩展WiFi通信实现功能与组态王组态软件详细组态...
  8. C++ 继承的构造与析构
  9. python 绘制多个子图
  10. 拓端tecdat|疫情下的在线教学数据观
  11. 毕设题目:Matlab图像配准
  12. PHP面试常考内容之面向对象(2)
  13. mysql数据库基础知识--入门必看
  14. 解决VB6控件对象库未注册的问题
  15. Qt QTableView样式设置
  16. NS和DNS的区别有哪些?
  17. 美光证实:DDR5 内存供应不足与 PMIC 和 VRM 短缺有关,2022 年改善的可能性很小
  18. 设置chrome浏览器访问http服务时使用麦克风
  19. C++上机实验六第2题
  20. 职场防背锅的有效方式

热门文章

  1. 从潘叔到潘子,潘长江走下「神坛」
  2. 外媒确认iPhone 13 Pro系列采用120Hz OLED面板:支持智能调节屏幕刷新率
  3. 比茅台还暴利!靠卖牌子年赚40个亿,如今被质疑造假
  4. 罗永浩吐槽clubhouse:玩了两天 没有一个房间能待上10分钟
  5. 淘宝特价版注册“1元更香”商标,又一个新“节日”诞生了
  6. 蚂蚁集团与CCF达成合作成立基金,支持35岁以下青年学者
  7. 罗永浩与银联合作直播,但因过程太流畅被网友调侃是录播
  8. 华为FreeBuds 3耳机更新推送:新增支持骨声纹识别特征
  9. 贾跃亭债务小组:美法院支持贾跃亭个人破产重组继续进行
  10. 机器成为家人!华为发布2025十大趋势展望...