展开

关键词

httptcp

相关内容

云服务器

云服务器

稳定、安全、弹性、高性能的云端计算服务,实时满足您的多样性业务需求
  • ElasticSearch 5.6源码解析HTTPTCP请求

    http请求解析NettyHttpServerTransport 监听http请求。在其他版本中这个类在源码内,可直接找到。但在5.6中这个类被封装在netty插件中。因此从监听到http请求到请求转发到restController这部分我没看到。以下是从网络上找到的。http:blog.csdn.netxgjianstartarticledetails70143365 首先,NettyHttpServerTransport 会负责进行监听Http请求。通过配置http.netty.http.blocking_server 你可以选择是Nio还是传统的阻塞式服务。默认是NIO。该类在配置pipeline的时候,最后添加了HttpRequestHandler,所以具体的接受到请求后的处理逻辑就由该类来完成了。 pipeline.addLast(handler, requestHandler);HttpRequestHandler 实现了标准的 messageReceived(ChannelHandlerContext ctx, MessageEvent e) 方法,在该方法中,HttpRequestHandler 会回调NettyHttpServerTransport.dispatchRequest方法,而该方法会调用HttpServerAdapter.dispatchRequest,接着又会调用HttpServer.internalDispatchRequest方法(额,好吧,我承认嵌套挺深有点深):public void internalDispatchRequest(final HttpRequest request, final HttpChannel channel) { String rawPath = request.rawPath(); if (rawPath.startsWith(_plugin)) { RestFilterChain filterChain = restController.filterChain(pluginSiteFilter); filterChain.continueProcessing(request, channel); return; } else if (rawPath.equals(favicon.ico)) { handleFavicon(request, channel); return; } restController.dispatchRequest(request, channel); } 这个方法里我们看到了plugin等被有限处理。最后请求又被转发给 RestController。 从上面可以看出,请求被分发到RestController,然后调用dispatchRequest方法。在dispatchRequest方法中首先获取到根据请求的类型获取handler:final RestHandler handler = getHandler(request);这个handler是在创建具体的请求实例时写入restController中的。public RestSearchAction(Settings settings, RestController controller) { super(settings); controller.registerHandler(GET, _search, this); controller.registerHandler(POST, _search, this); controller.registerHandler(GET, {index}_search, this); controller.registerHandler(POST, {index}_search, this); controller.registerHandler(GET, {index}{type}_search, this); controller.registerHandler(POST, {index}{type}_search, this);}以search请求为例,此处的handler是RestSearchAction类型的。 最后调用的是handler的handlerequest方法。 wrappedHandler.handleRequest(request, channel, client);RestSearchAction继承了 BaseRestHandler。因此这个地方调用的是BaseRestHandler的handleRequest,在handleRequest中准备请求: final RestChannelConsumer action = prepareRequest(request, client);这个prepareRequest方法是RestSearchAction的prepareRequest,根据RestRequest生成一个SearchRequest,交给NodeClient执行。channel -> client.search(searchRequest, new RestStatusToXContentListener(channel))NodeClient执行doExecute方法,将之前的SearchAction.INSTANCE(GenericAction)转化为对应的TransportSearchAction:transportAction(action).execute(request, listener);上述TransportSearchAction的execute方法最终执行的是自身的doExecute方法this.action.doExecute(task, request, listener);在doExecute中执行真正的查找流程。Tcp请求解析Tcp请求是由Netty4Transport来接收解析的。和上述一样,Netty4Transport被封装在netty插件中,因此没看到tcp接收的过程。 后面请求被转发至TCPtransport的messageReceived方法。而在该方法中调用handleRequest处理请求。handleRequest(channel, profileName, streamIn, requestId, messageLengthBytes, version, remoteAddress, status);在handleRequest中读取出action,跟不同的action生成具体的TransportRequest子类和一个RequestHandler,并执行该RequestHandler。final String action = stream.readString();.....final TransportRequest request = reg.newRequest();.....threadPool.executor(reg.getExecutor()).execute(new RequestHandler(reg, request, transportChannel));RequestHandler是一个可运行的AbstractRunnable,最后执行的dorun方法: protected void doRun() throws Exception { reg.processMessageReceived(request, transportChannel); }processMessageReceived中则是通过handler调用其messageReceived方法handler.messageReceived(request, channel);以search请求为例,这个handler不是上述生成的RequestHandler而是RequestHandlerRegistry中的handler,是一个TransportRequestHandler。而这个TransportRequestHandler是handledTransportAction中的一个变量,而handledTransportAction继承于transportAction,且是所有transport*action的父类,比如说transportBulkAction,transportSearchAction等等。 因此上述的handler.messageReceived(request, channel)调用的是handledTransportAction的子类transportSearchAction的messageReceived。至此总算找到了执行该请求的最终方法,即ransportSearchAction的messageReceived方法。但是还有个问题,reg(RequestHandlerRegistry )是从哪来的? 这个RequestHandlerRegistry 则在TCPtransport的messageReceived方法中通过transportServiceAdapter获取的:final RequestHandlerRegistry reg = transportServiceAdapter.getRequestHandler(action);而这个RequestHandlerRegistry是transportSearchAction构建的时候调用父类HandledTransportAction的构造方法注册的:protected HandledTransportAction(Settings settings, String actionName, boolean canTripCircuitBreaker, ThreadPool threadPool,TransportService transportService, ActionFilters actionFilters,IndexNameExpressionResolver indexNameExpressionResolver, Supplier request) { super(settings, actionName, threadPool, actionFilters, indexNameExpressionResolver, transportService.getTaskManager()); transportService.registerRequestHandler(actionName, request, ThreadPool.Names.SAME, false, canTripCircuitBreaker, new TransportHandler()); }找到了RequestHandlerRegistry(TransportService中),获取reg的transportServiceAdapter(TCPtransport),二者是怎么联系起来的?TransportService中有一个adapter,实现了TransportServiceAdapter方法。在dostart方法中设置了transport的adpter:transport.transportServiceAdapter(adapter);即设置了TCPtransport的adapter。那么TCPtransport调用的RequestHandlerRegistry reg = transportServiceAdapter.getRequestHandler(action),就是调用transportService中的adapter,从而获取到注册的RequestHandlerRegistry。 此处我们还是没回答TransportService和TCPtransport二者的关系。networkModule中的提供了注册transport的方法,但是一直没找到TcpTransport的注册方法,后来发现tcptransport是通过netty插件注册进去的。 在Node类构造TransportService时传入:Transport transport = networkModule.getTransportSupplier().get();final TransportService transportService = newTransportService(settings, transport, threadPool,networkModule.getTransportInterceptor(), localNodeFactory, settingsModule.getClusterSettings());终于找到源头了。。真的好乱。其类依赖关系如下:?image.png
    来自:
    浏览:867
  • GPU 云服务器

    腾讯GPU 云服务器是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于深度学习训练、科学计算、图形图像处理、视频编解码等场景……
    来自:
  • FPGA 云服务器

    腾讯FPGA云服务器是基于FPGA硬件可编程加速的弹性计算服务,您只需几分钟就可以获取并部署您的FPGA实例。结合IP市场提供的图片,视频,基因等相关领域的计算解决方案,提供无与伦比的计算加速能力……
    来自:
  • 广告
    关闭

    50+款云产品免费体验

    提供包括云服务器,云数据库在内的50+款云计算产品。打造一站式的云产品试用服务,助力开发者和企业零门槛上云。

  • 专用宿主机

    专用宿主机(CDH)提供用户独享的物理服务器资源,满足您资源独享、资源物理隔离、安全、合规需求。专用宿主机搭载了腾讯云虚拟化系统,购买之后,您可在其上灵活创建、管理多个自定义规格的云服务器实例,自主规划物理资源的使用。
    来自:
  • 黑石物理服务器2.0

    腾讯黑石物理服务器2.0(CPM)是一种包年包月的裸金属云服务,为您提供云端独享的高性能、无虚拟化的、安全隔离的物理服务器集群。使用该服务,您只需根据业务特性弹性伸缩物理服务器数量,获取物理服务器的时间将被缩短至分钟级。
    来自:
  • 容器服务

    腾讯云容器服务(Tencent Kubernetes Engine ,TKE)基于原生kubernetes提供以容器为核心的、高度可扩展的高性能容器管理服务。腾讯云容器服务完全兼容原生 kubernetes API ,扩展了腾讯云的云硬盘、负载均衡等 kubernetes 插件,为容器化的应用提供高效部署、资源调度、服务发现和动态伸缩等一系列完整功能,解决用户开发、测试及运维过程的环境一致性问题,提高了大规模容器集群管理的便捷性,帮助用户降低成本,提高效率。容器服务提供免费使用,涉及的其他云产品另外单独计费。
    来自:
  • 弹性伸缩

    腾讯弹性伸缩(AS)为您提供高效管理计算资源的策略。您可设定时间周期性地执行管理策略或创建实时监控策略,来管理 CVM 实例数量,并完成对实例的环境部署,保证业务平稳顺利运行。弹性伸缩策略不仅能够让需求稳定规律的应用程序实现自动化管理,同时告别业务突增或CC攻击等带来的烦恼,对于每天、每周、每月使用量不停波动的应用程序还能够根据业务负载分钟级扩展。
    来自:
  • 云函数

    云函数(Serverless Cloud Function,SCF)是腾讯云为企业和开发者们提供的无服务器执行环境,帮助您在无需购买和管理服务器的情况下运行代码。您只需使用平台支持的语言编写核心代码并设置代码运行的条件,即可在腾讯云基础设施上弹性、安全地运行代码。SCF 是实时文件处理和数据处理等场景下理想的计算平台。
    来自:
  • 批量计算

    批量计算(Batch)是为有大数据计算业务的企业、科研单位等提供高性价比且易用的计算服务。批量计算可以根据用户提供的批处理规模,智能地管理作业和调动所其需的最佳资源……
    来自:
  • 消息队列 CMQ

    腾讯云消息队列(CMQ)是一种分布式消息队列服务,它能够提供可靠的基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)之间的收发消息,存储在可靠有效的 CMQ 队列中,防止消息丢失。CMQ 支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
    来自:
  • 消息队列 CKafka

    CKafka(Cloud Kafka)是一个分布式的、高吞吐量、高可扩展性的消息系统,100%兼容开源 Kafka API(0.9版本)。Ckafka 基于发布/订阅模式,通过消息解耦,使生产者和消费者异步交互,无需彼此等待。Ckafka 具有数据压缩、同时支持离线和实时数据处理等优点,适用于日志压缩收集、监控数据聚合等场景。
    来自:
  • API 网关

    腾讯云 API 网关(API Gateway)是腾讯云推出的一种 API 托管服务,能提供 API 的完整生命周期管理,包括创建、维护、发布、运行、下线等。您可使用 API 网关封装自身业务,将您的数据、业务逻辑或功能安全可靠的开放出来,用以实现自身系统集成、以及与合作伙伴的业务连接。
    来自:
  • 微服务平台 TSF

    腾讯微服务平台(TSF)是一个围绕应用和微服务的 PaaS 平台,提供一站式应用全生命周期管理能力和数据化运营支持,提供多维度应用和服务的监控数据,助力服务性能优化。
    来自:
  • 对象存储

    腾讯云对象存储数据处理方案主要针对于存储于腾讯云对象存储COS中的数据内容进行处理加工,满足压缩、转码、编辑、分析等多种诉求,激活数据价值。
    来自:
  • 文件存储

    文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。CFS 可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云 CFS 的管理界面简单、易使用,可实现对现有应用的无缝集;按实际用量付费,为您节约成本,简化 IT 运维工作。
    来自:
  • 归档存储

    腾讯云归档存储(Cloud Archive Storage, CAS)是面向企业和个人开发者提供的低成本、高可靠且易于管理的云端离线存储服务,适用于海量、非结构化数据长时间备份,实现数据的容灾和c。归档存储采用分布式云端存储,您可以通过 RESTful API 对存储的数据进行访问。归档存储易于管理,您无需关心硬件维护及容量扩展;按实际使用量付费,为您节省额外成本。
    来自:
  • 存储网关

    存储网关(CSG)是一种混合云存储方案,旨在帮助企业或个人实现本地存储与公有云存储的无缝衔接。您无需关心多协议本地存储设备与云存储的兼容性,只需要在本地安装云存储网关即可实现混合云部署,并拥有媲美本地性能的海量云端存储。
    来自:
  • 云硬盘

    云硬盘(CBS)为您提供云服务器的持久性块存储服务。云硬盘中的数据自动地在可用区内以多副本冗余方式存储,避免数据的单点故障风险,提供高达99.9999999% 的数据可靠性。云硬盘提供多种类型及规格的磁盘实例,满足稳定低延迟的存储性能要求。
    来自:
  • 云数据迁移

    云数据迁移(Cloud Data Migration)是腾讯云提供的 TB ~ PB 级别的数据迁移上云服务。本服务提供了安全可靠的离线迁移专用设备,满足本地数据中心进行大规模数据迁移上云的需求,解决本地数据中心通过网络传输时间长、成本高、安全性低的问题。
    来自:

扫码关注云+社区

领取腾讯云代金券