第 31 章 - 源码篇 - Elasticsearch 写入流程深入分析

写入源码分析

接收与处理

请求首先会被 Netty4HttpServerTransport 接收,接着交由 RestController 进行路由分发。

private void tryAllHandlers(final RestRequest request, final RestChannel channel, final ThreadContext threadContext) throws Exception {
   
    
    // 从 tier 树中,找到该请求路径对应的 RestHandler
    Iterator<MethodHandlers> allHandlers = getAllHandlers(request.params(), rawPath);
    while (allHandlers.hasNext()) {
   
        final RestHandler handler;
        final MethodHandlers handlers = allHandlers.next();
        if (handlers == null) {
   
            handler = null;
        } else {
   
            handler = handlers.getHandler(requestMethod, restApiVersion);
        }
        if (handler == null) {
   
            if (handleNoHandlerFound(rawPath, requestMethod, uri, channel)) {
   
                return;
            }
        } else {
   
            // 找到后,将本次请求转发给该 RestHandler
            dispatchRequest(request, channel, handler, threadContext);
            return;
        }
    }
}

那么 ES 如何知道对应的路由应该由谁处理呢?
Node 初始化时,会执行 ActionModule#initRestHandlers(...)

public void initRestHandlers(Supplier<DiscoveryNodes> nodesInCluster) {
    ...
    ...
    // 注册路由
    registerHandler.accept(new RestIndexAction());
    ...
    ...
}

RestIndexAction 注册的路由如下所示

public List<Route> routes() {
   
    return List.of(
        new Route(POST, "/{index}/_doc/{id}"),
        new Route(PUT, "/{index}/_doc/{id}"),
        Route.builder(POST, "/{index}/{type}/{id}").deprecated(TYPES_DEPRECATION_MESSAGE, RestApiVersion.V_7).build(),
        Route.builder(PUT, "/{index}/{type}/{id}").deprecated(TYPES_DEPRECATION_MESSAGE, RestApiVersion.V_7).build()
    );
}

每个 RestHandlerprepareRequest(final RestRequest request, final NodeClient client) 都会声明与之绑定的 TransportAction,之后所有逻辑会交由 TransportAction 处理。
其绑定的 TransportActionTransportIndexAction
RestIndexAction#prepareRequest(...)

public RestChannelConsumer prepareRequest(final RestRequest request, final NodeClient client) throws IOException {
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值