1
需要说明的是,一个微服务,如果仅仅对外提供服务就是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。包装类主要的类图如下,

image.png

servicecomb-java-chassis项目下的demo例子,
image.png

如下是把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微服务请求调用过程

image.png

servicecomb-java-chassis项目下的demo例子,
image.png

  1. 开始发起请求开始template.postForEntity(url, entity, AppClientDataRsp.class),
    image.png
  2. 经过一系列调用,进入request.execute();这个request,类型是ClientHttpRequest,实际上是CseClientHttpRequestFactory创建的CseClientHttpRequest实例,execute()实际上是CseClientHttpRequest的execute()
    image.png
    CseClientHttpRequest是ClientHttpRequest的子类
    image.png
  3. CseClientHttpRequest的execute()中,创建Invocation,开始进入Invocation处理,Invocation逐个调用自身的Handler,这些Handler来自Cosumer微服务的microservice.yaml配置,如下是loadbalance,Consumer的最后一个Handler是ServiceComb内置TransportClientHandler,它负责发送前HttpClientFilter处理,发送请求,收到响应后的HttpClientFilter处理,最终经过一系列处理的response给Consumer.
    image.png

ThinkFault
16 声望2 粉丝