問(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)題歡迎指出。