需要说明的是,一个微服务,如果仅仅对外提供服务就是Provider,如果仅仅是请求其他微服务就是Consumer,两者都涉及,那么这个微服务,既是Provider又是Consumer,如Edge网关,就是这样,它接收外部的请求,此时是Provider角色,把请求转给下游的其他微服务,此时是Consumer角色。通常不会存在仅仅是Consumer角色的微服务,因为单纯是Consumer实际应用中没有意义。
Consumer的rest client
consumer发送请求,主要是用Spring的RestTemplate,ServiceComb做了一层包装,兼容ServiceComb格式的URL format:cse://microserviceName/business url,如cse://business/business/v1/channel/news/subscribe。包装类主要的类图如下,
以servicecomb-java-chassis项目下的demo例子,
如下是把cse://格式的uri调用过程中关键方法,
class ConsumerMain:
new Consumer().invokeBusiness("cse://business/business/v1", new ChannelRequestBase());
...
class Consumer:
ResponseEntity<AppClientDataRsp> response = template.postForEntity(url, entity, AppClientDataRsp.class);
...
class RestTemplateWrapper:
getRestTemplate(url).postForEntity(url, request, responseType, uriVariables);
...
class RestTemplate:
(ResponseEntity)nonNull(this.execute(url, HttpMethod.POST, requestCallback, responseExtractor, uriVariables));
this.getUriTemplateHandler().expand(url, uriVariables);
...
abstract class AbstractUriTemplateHandler:
public URI expand(String uriTemplate, Object... uriVariables) {
URI url = this.expandInternal(uriTemplate, uriVariables);
return this.insertBaseUrl(url);
}
...
class CseUriTemplateHandler:
createUri(uriTemplate, uriComponents);
Consumer微服务请求调用过程
以servicecomb-java-chassis项目下的demo例子,
- 开始发起请求开始template.postForEntity(url, entity, AppClientDataRsp.class),
- 经过一系列调用,进入request.execute();这个request,类型是ClientHttpRequest,实际上是CseClientHttpRequestFactory创建的CseClientHttpRequest实例,execute()实际上是CseClientHttpRequest的execute()
CseClientHttpRequest是ClientHttpRequest的子类 - CseClientHttpRequest的execute()中,创建Invocation,开始进入Invocation处理,Invocation逐个调用自身的Handler,这些Handler来自Cosumer微服务的microservice.yaml配置,如下是loadbalance,Consumer的最后一个Handler是ServiceComb内置TransportClientHandler,它负责发送前HttpClientFilter处理,发送请求,收到响应后的HttpClientFilter处理,最终经过一系列处理的response给Consumer.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。