做网站编辑需要经验吗,wordpress网站app,谷歌seo网络公司,响应式网站的开发听说ES网络层很难#xff1f;今天来卷它#x1f604; 前言
ES网络层比较复杂#xff0c;分为两个部分#xff1a;
基于HTTP协议的REST服务端基于TCP实现的PRC框架 插件化设计的网络层模块#xff08;NetworkModule#xff09;
入口还是上一章的创建Node构造方法的地方…听说ES网络层很难今天来卷它 前言
ES网络层比较复杂分为两个部分
基于HTTP协议的REST服务端基于TCP实现的PRC框架 插件化设计的网络层模块NetworkModule
入口还是上一章的创建Node构造方法的地方一直往下会找到之前说的加载module和服务的地方
NetworkModule
NetworkModule属性
有两个map一个map存放tcp层的实现一个map存放http层的实现
NetworkModule构造方法
上面的参数分别为
settingssettings配置transportClient: 一般为falsepluginsNetworkPlugin 提供了获取TCPTransport和HTTPTransport的接口NetworkModule通过遍历全部networkPlugin来加载所有的网络层实现也就说说ES的网络层不一定就是一种实现。你也可以通过实现NetworkPlugin去提供网络层实现。我们主要看的网络层是Netty4PluginthreadPool线程池bigArrays大数组通信的时候会使用它的空间pageCacheRecycler和核心流程没关系跳过circuitBreakerService和核心流程没关系跳过namedWritableRegistryxContentRegistrynetworkService网络服务主要是将host地址转换为 Java Network地址对象解析地址使用dispatcher它的实现是RestControllerRestController内部注册了很多处理器对外提供访问路由的功能也就说Http请求会转换为RestRequestRestRequest最终会交给RestController去找到合适的handler然后去访问最终的义务层逻辑后面源码会分析到clusterSettings集群配置
我们来看这里做了几件事我们这里看的是Netty4Plugin
plugin.getHttpTransports获取Http网络层的实现这里返回的是一个mapkey是netty4value是一个Netty4Plugin lambda表达式 遍历httpTransportFactory将key和value值放到之前的transportHttpFactories 后面的RPC逻辑类似直接过 HTTP通信层**Netty4HttpServerTransport** Netty4HttpServerTransport构造方法
和之前NetworkModule的参数基本差不多多了一个sharedGroupFactory这里是一个netty NioEventGroup。学过netty源码应该都懂如果不懂可以看我写的netty源码解析。 Netty4HttpServerTransport.doStart方法 入口
Node-start() injector.get(HttpServerTransport.class).start()Netty4HttpServerTransport.doStart在node节点启动的时候会存在这个httpServerTransport实现了AbstractLifecycleComponent在它的start最终会调用到子类Netty4HttpServerTransport的doStart方法 doStart方法
都是netty服务端常规的配置如果看不懂还是要学一下netty源码的。学过netty的都知道肯定是有一个服务端的请求入口Handler类的这个类才是我们最要注意看的Netty4HttpRequestHandler Netty4HttpRequestHandler.channelRead0
请求处理入口Netty4HttpRequestHandler-channelRead0(ctx, httpRequest)又把请求转接给了Netty4HttpServerTransport.incomingRequest Netty4HttpServerTransport.incomingRequest
请求处理入口 Netty4HttpServerTransport-incomingRequest(httpRequest, httpChannel
这里的核心逻辑就是解析HttpRequest为RestRequest包装HttpChannel为RestChannel。包装之后最终交给 Dispatcher 方法 RestController.dispatchRequest
会接着调用RestController.tryAllHandlers方法总结一下一共做了这几件事
读取RestRequest请求路径rawPath及MethodGET、POST、DELETE…等信息根据rawPath等信息到PathTrie字典树结构中找到提供服务的Handler调用BaseRestHandler-handleRequest(restRequest, restChannel, nodeClient) BaseRestHandler为所有Rest*Action的父类…比如我这里debug用的是写索引数据的rest请求实际请求到的是RestIndexAction #### BaseRestHandler.handleRequest 

总结一下这里做了几件事
BaseRestHandler的prepareRequest是模版方法最终会调用到RestIndexAction里面的prepareRequest方法里面就是负责解析restRequest请求为具体的 业务请求对象并生成一个lambda表达式BaseRestHandler调用action.accept 调用之前的lambda表达式
TCP通信层ES内置RPC 实现Netty4Transport