需要注意的是,一个微服务如果只对外提供服务就是Provider,如果只请求其他微服务就是Consumer。两者都涉及到,那么这个微服务既是Provider又是Consumer,比如Edge网关。它接收外部请求,此时它是Provider角色,将请求转发给其他下游微服务,这时候它是Consumer角色。通常不会有只扮演Consumer角色的微服务,因为在Consumer的实际应用中是没有意义的。Consumer的restclient消费者发送请求,主要是利用Spring的RestTemplate、ServiceComb做一层包装,兼容ServiceComb格式的URL格式:cse://microserviceName/businessurl,如cse://business/business/v1/频道/新闻/订阅。封装类的主要类图如下,以servicecomb-java-chassis项目下的demo为例,下面是cse://格式的uri调用过程中的关键方法,classConsumerMain:newConsumer().invokeBusiness("cse://business/business/v1",newChannelRequestBase());...classConsumer:ResponseEntityresponse=template.postForEntity(url,entity,AppClientDataRsp.class);...类RestTemplateWrapper:getRestTemplate(url)。postForEntity(url,request,responseType,uriVariables);...类RestTemplate:(ResponseEntity)nonNull(this.execute(url,HttpMethod.POST,requestCallback,responseExtractor,uriVariables));this.getUriTemplateHandler().expand(url,uriVariables);...抽象类AbstractUriTemplateHandler:publicURIexpand(StringuriTemplate,Object...uriVariables){URIurl=this.expandInternal(uriTemplate,uriVariables);返回this.insertBaseUrl(url);}...classCseUriTemplateHandler:createUri(uriTemplate,uriComponents);Consumer微服务请求调用流程以servicecomb-java-chassis项目下的demo例子开始请求starttemplate.postForEntity(url,entity,AppClientDataRsp.class),经过一系列的调用,进入request.execute();这个request,类型是ClientHttpRequest,实际上是CseClientHttpRequestFactory创建的一个CseClientHttpRequest实例,execute()其实就是CseClientHttpRequest的execute()CseClientHttpRequest是ClientHttpRequest的子类。在CseClientHttpRequest的execute()中,创建了一个Invocation,开始进入Invocation流程。Invocation一个一个调用自己的Handlers。这些Handlers来自Cosumer微服务的microservice.yaml配置。下面是loadbalance,Consumer的最后一个Handler是ServiceComb内置了一个TransportClientHandler,负责发送前的HttpClientFilter处理,发送请求,收到响应后的HttpClientFilter处理,最后将一系列处理后的响应传递给Consumers。