需要注意的是,一个微服务如果只对外提供服务就是Provider,如果只请求其他微服务就是Consumer。两者都涉及。那么这个微服务既是Provider又是Consumer,比如Edge网关就是这样的。它接收外部请求,此时它是Provider角色,将请求转发给其他下游微服务,这时候它是Consumer角色。通常不会有只扮演Consumer角色的微服务,因为在Consumer的实际应用中是没有意义的。请求处理流程Producer服务启动后,会部署vertx服务,监听端口,等待客户端连接,客户端请求路由配置到VertxRestDispatcher。客户端发起请求,请求路由到VertxRestDispatcher通过vertx,用户配置的HttpServerFilter接收请求。预处理操作。其中,ServerRestArgsFilter是ServiceComb内置的过滤器,专门用于反序列化请求和序列化响应体。经过HttpServerFilter的afterReceiveRequest处理后,正式进入Handler链进行具体的业务处理。用户可以自定义多个Handler,但最后一个Handler是ProducerOperationHandler,它是ServiceComb中内置的一个Handler。它负责通过反射调用相应的操作。处理请求并获得响应。得到response后,回调sendResponseQuietly(resp)方法处理response。该方法的作用是在发送前调用HttpServerFilter链上每个过滤器的beforeSendResponseAsync进行处理。内置的ServerRestArgsFilter会将response对象序列化,转成json字符串,响应给clientServerRestArgsFilter1。接收请求解析参数@OverridepublicResponseafterReceiveRequest(Invocationinvocation,HttpServletRequestExrequestEx){OperationMetaoperationMeta=invocation.getOperationMeta();休息restOperationMeta=operationMeta.getExtData(RestConst.SWAGGER_REST_OPERATION);//解析参数MapswaggerArguments=RestCodec.restToArgs(requestEx,restOperationMeta);调用.setSwaggerArguments(swaggerArguments);返回空值;}2.在发送响应之前处理Responsefore@OverridepublicCompletableFuturebeforeSendResponseAsync(Invocationinvocation,HttpServletResponseExresponseEx){...//设置响应内容类型responseEx.setContentType(produceProcessor.getName()+";charset=utf-8");CompletableFuture未来=newCompletableFuture<>();尝试(BufferOutputStream输出=新的BufferOutputStream(Unpooled.compositeBuffer())){//编码响应体produceProcessor.encodeResponse(output,body);//获取编码后的字节并设置在responseEx中用于发送responseEx.setBodyBuffer(output.getBuffer());未来。完成(空);}catch(Throwablee){...}返回未来;}微服务间的上下文传递微服务Consumer和微服务Producer之间,通过rest进行调用,上下文通过调用rest放置在header中实现上下文传递。我们看一下Consumer调用相关代码的发送:在发送请求之前设置header,在RestClientInvocation发送过程中设置CseContext,header中的key为x-cse-context,publicstaticfinalStringCSE_CONTEXT=in代码“x-cse-context”;protectedvoidsetCseContext(){try{clientRequest.putHeader(Const.CSE_CONTEXT,JsonUtils.writeValueAsString(invocation.getContext()));}catch(Throwablee){invocation.getTraceIdLogger().error(LOGGER,"无法编码和设置cseContext,message={}.",ExceptionUtils.getExceptionMessageWithoutTrace(e));}}Producerrecoveryofinvocation:在调用handler之前,AbstractRestInvocation创建invocation并传递Consumer传递的contextresumed调用,参见this.setContext();protectedvoidscheduleInvocation(){尝试{createInvocation();}catch(Throwablee){sendFailResponse(e);返回;}尝试{this.setContext();}catch(Exceptione){LOGGER.error("设置调用上下文失败",e);发送失败响应(e);返回;}...Producer的最后一个Handler-ProducerOperationHandler,在doInvoke业务之前,将invocation设置到线程上下文中,业务处理完成后,在线程上下文中移除invocation。因此,在业务处理中,可以通过上下文获取调用信息。publicvoidsyncInvoke(Invocationinvocation,SwaggerProducerOperationproducerOperation,AsyncResponseasyncResp){ContextUtils.setInvocationContext(invocation);响应response=doInvoke(invocation,producerOperation);ContextUtils.removeInvocationContext(响应)上下文(});