关于请求:我是一个请求我是如何被发送的

摘要:本文次要剖析应用cse提供的RestTemplate的场景,其实cse提供的rpc注解(RpcReference)的形式最初的调用逻辑和RestTemplate是必由之路的。本文分享自华为云社区《我是一个申请,我该何去何从(下)》,原文作者:向昊 。 上次咱们大略理解到了服务端是怎么解决申请的,那么发送申请又是个什么样的流程了?本文次要剖析应用cse提供的RestTemplate的场景,其实cse提供的rpc注解(RpcReference)的形式最初的调用逻辑和RestTemplate是必由之路的。 应用应用cse提供的RestTemplate时候,是这样初始化的: RestTemplate restTemplate = RestTemplateBuilder.create();restTemplate.getForObject("cse://appId:serviceName/xxx", Object.class);咱们能够留神到2个怪异的中央: RestTemplate是通过RestTemplateBuilder.create()来获取的,而不是用的Spring里提供的。申请门路结尾是cse而不是咱们常见的http、https且须要加上服务所属的利用ID和服务名称。解析依据url匹配RestTemplate首先看下RestTemplateBuilder.create(),它返回的是org.apache.servicecomb.provider.springmvc.reference.RestTemplateWrapper,是cse提供的一个包装类。 // org.apache.servicecomb.provider.springmvc.reference.RestTemplateWrapper// 用于同时反对cse调用和非cse调用class RestTemplateWrapper extends RestTemplate { private final List<AcceptableRestTemplate> acceptableRestTemplates = new ArrayList<>(); final RestTemplate defaultRestTemplate = new RestTemplate(); RestTemplateWrapper() { acceptableRestTemplates.add(new CseRestTemplate()); } RestTemplate getRestTemplate(String url) { for (AcceptableRestTemplate template : acceptableRestTemplates) { if (template.isAcceptable(url)) { return template; } } return defaultRestTemplate; }}AcceptableRestTemplate:这个类是一个抽象类,也是继承RestTemplate的,目前其子类就是CseRestTemplate,咱们也能够看到在初始化的时候会默认往acceptableRestTemplates中增加一个CseRestTemplate。 回到应用的中央restTemplate.getForObject:这个办法会委托给如下办法: public <T> T getForObject(String url, Class<T> responseType, Object... urlVariables) throws RestClientException { return getRestTemplate(url).getForObject(url, responseType, urlVariables);}能够看到首先会调用getRestTemplate(url),即会调用template.isAcceptable(url),如果匹配到了就返回CseRestTemplate,否则就返回惯例的RestTemplate。那么再看下isAcceptable()这个办法: ...

July 14, 2021 · 2 min · jiezi