博客 / 詳情

返回

微服務框架ServiceComb源碼解析之一——Consumer發起request請求

需要説明的是,一個微服務,如果僅僅對外提供服務就是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
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.