微服務(wù)中跨服務(wù)請(qǐng)求選擇Fegin還是RestTemplate?

問(wèn)題:微服務(wù)流行之后,如何進(jìn)行跨服務(wù)的接口訪問(wèn)呢?

兩種方案:Feign或者RestTemplate

Feign是一個(gè)聲明式的REST客戶端,它的目的就是讓REST調(diào)用更加簡(jiǎn)單

RestTemplate是Spring提供的訪問(wèn)Rest服務(wù)的客戶端,RestTemplate提供三種訪問(wèn)遠(yuǎn)程http服務(wù)的方法,來(lái)提高代碼效率。

如何選擇:

FeginClient簡(jiǎn)化了請(qǐng)求的編寫(xiě),且通過(guò)動(dòng)態(tài)負(fù)載進(jìn)行選擇使用哪個(gè)服務(wù)進(jìn)行消費(fèi),由Spring實(shí)現(xiàn),編寫(xiě)時(shí)直接調(diào)用方法即可。RestTemplate還需要編寫(xiě)服務(wù)器IP,需了解HTTP提供的http級(jí)別api的細(xì)節(jié)等,較為復(fù)雜。


以下是二者的使用方式:

1.Feign:

假設(shè)A服務(wù)要調(diào)用B服務(wù)中的find方法,可以在A服務(wù)中增加一個(gè)接口(其實(shí)將B服務(wù)中方法定義進(jìn)行復(fù)制即可)

@FeignClient(name = "B") //模塊名稱(chēng)

public interface PublishClient {

? ?//? 該模塊中要訪問(wèn)的方法

? ? @PostMapping("/download")

? ? Response find(@RequestParam("mediaId") String mediaId,@RequestParam("userName") String userName);

}

2.RestTemplate:

(1)訪問(wèn)指定ip地址和端口

?????????RestTemplate restTemplate = new RestTemplate();

?????????String response = restTemplate.getForObject("http://localhost:ip/msg", String.class);

(2)使用配置的restTemplate,通過(guò)應(yīng)用名直接調(diào)用。前提在配置文件中一定要配置應(yīng)用名稱(chēng): spring.application.name=MANAFEMENT

????????String response = restTemplate.getForObject("http://MANAFEMENT/msg", String.class);

? ? ? ? log.info("response={}",response);

(3)使用LoadBalancerClient獲取url,例如獲取management應(yīng)用

????????ServiceInstance serviceInstance = loadBalancerClient.choose("MANAFEMENT");

? ? ? ? String url = String.format("http://%s:%s", serviceInstance.getHost(), serviceInstance.getPort()+"/msg");

? ? ? ? RestTemplate restTemplate = new RestTemplate();

? ? ? ? String response = restTemplate.getForObject(url, String.class);

以上是我個(gè)人實(shí)踐,有問(wèn)題歡迎指出。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容