restTemplate服務調用踩坑

restTemplate 調用服務的不同的方式需要的服務實例是不一樣的。

restTemplate 調用服務有以下幾種方式:請求地址直接調用服務名調用

請求地址直接調用

restTemplate實例如果使用@Autowire方式注入,url中直接寫明調用接口具體的IP地址(域名)及端口號

服務名調用

服務名調用也可以分爲兩種方式:一種是自行獲取註冊中心的服務列表,根據服務名找到對應的服務實例進行調用;第二種方法就是使用@LoadBalanced註解,系統自動根據hostName來獲取對應的服務實例,LoadBalancerInterceptor.intercept如下

public ClientHttpResponse intercept(final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) throws IOException {
        URI originalUri = request.getURI();
        String serviceName = originalUri.getHost();
        Assert.state(serviceName != null, "Request URI does not contain a valid hostname: " + originalUri);
        return (ClientHttpResponse)this.loadBalancer.execute(serviceName, this.requestFactory.createRequest(request, body, execution));
    }

踩坑過程

項目使用了spring boot 2.2.5,spring cloud Finchley.SR2

該項目主要用於調用外部公司的接口,爲本公司的其他的系統提供統一的調用外部公司接口的地址。調用外部公司接口時使用請求地址直接調用。項目中我直接使用@Autowire方式注入restTemplate實例,此時調用外部公司接口可以正常調用,回調本公司其他服務的接口時通過服務名調用,調用接口失敗,調用時沒有將服務名轉爲對應的IP及端口號。

restTemplate實例上增加@LoadBalanced註解後,本公司接口調用成功,外部公司接口調用失敗(接口調用時,IP地址也被認爲是服務名,到服務列表中去尋找對應的服務實例,找不到對應的實例報錯了)最終在啓動類裏注入了兩個restTemplate實例

錯誤排查的過程中,還遇到了另外一個小問題,版本降低到E版本之後增加了@LoadBalanced註解之後還是無法通過服務名進行調用,發現啓動類上沒有加@EnableDIscoveryClient註解,增加該註解之後通過服務名調用接口成功。網上查詢發現E版本之後無需在啓動類上增加服務發現的相關注解,E版本是否需要加該註解,大家可以自行驗證一下。

 

菜鳥踩坑中,高手們請自動忽略

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章