面試官:微服務(wù)通訊方式有哪些?
作者:磊哥
基于 HTTP 協(xié)議的 RESTful API 是最常用的微服務(wù)通訊方式之一。RPC 允許一個(gè)服務(wù)像調(diào)用本地方法一樣調(diào)用另一個(gè)服務(wù)的方法。RESTful API 和 RPC 是微服務(wù)間最常用的通訊方式。
微服務(wù)的通訊方式主要有以下幾種:
- RESTful API:基于 HTTP 協(xié)議的 RESTful API 是最常用的微服務(wù)通訊方式之一。服務(wù)之間通過 HTTP 請求和響應(yīng)進(jìn)行通訊,實(shí)現(xiàn)數(shù)據(jù)交換。這種方式簡單、通用,適用于各種場景,但可能不適合對實(shí)時(shí)性要求非常高的場景。
- RPC(遠(yuǎn)程過程調(diào)用):RPC 允許一個(gè)服務(wù)像調(diào)用本地方法一樣調(diào)用另一個(gè)服務(wù)的方法。它通過將方法調(diào)用封裝成網(wǎng)絡(luò)數(shù)據(jù)包并在不同的進(jìn)程之間傳輸,實(shí)現(xiàn)不同服務(wù)之間的互相調(diào)用。RPC 方式可以提高調(diào)用的效率和性能,但可能需要更多的配置和管理工作。
- 消息隊(duì)列通訊:如 RabbitMQ、Kafka、RocketMQ 等,服務(wù)之間不直接調(diào)用,而是通過消息隊(duì)列進(jìn)行異步消息傳遞,實(shí)現(xiàn)服務(wù)之間的解耦和異步處理。
- 事件驅(qū)動(dòng)通訊:服務(wù)之間通過事件觸發(fā)通訊,一旦某個(gè)服務(wù)發(fā)生了某個(gè)事件,就會(huì)觸發(fā)其他服務(wù)的響應(yīng)。這種方式可以實(shí)現(xiàn)服務(wù)的松耦合和事件的實(shí)時(shí)處理,典型的實(shí)現(xiàn)如 Event Bus。
- WebSocket(長連接通信):使用 WebSocket 實(shí)現(xiàn)雙向通信,常用于實(shí)時(shí)推送場景,服務(wù)間可以維持長期的 TCP 連接進(jìn)行數(shù)據(jù)交換。
其中,RESTful API 和 RPC 是微服務(wù)間最常用的通訊方式,但它們的使用場景又略有不同:
- RESTful API 通常用于外部接口或第三方接口通訊。
- RPC 通常用于內(nèi)部微服務(wù)之間的方法調(diào)用。
1.RESTful API VS RPC
它們的區(qū)別主要體現(xiàn)在以下幾點(diǎn):
功能和用途不同:
- RESTful API 常用于瀏覽器和服務(wù)器之間的通信,第三方接口通訊等,它可以實(shí)現(xiàn)基于請求-響應(yīng)模式的通信,支持無狀態(tài)和有狀態(tài)的交互。
- RPC 是一種用于遠(yuǎn)程過程調(diào)用的協(xié)議,用于不同計(jì)算節(jié)點(diǎn)之間的通信,多用于微服務(wù)內(nèi)部間的調(diào)用。它允許應(yīng)用程序通過網(wǎng)絡(luò)調(diào)用遠(yuǎn)程服務(wù),并像調(diào)用本地方法一樣輕松實(shí)現(xiàn)分布式系統(tǒng)的集成。
數(shù)據(jù)格式不同:
- RESTful API 使用文本格式來傳輸數(shù)據(jù),通常使用 JSON 或 XML 進(jìn)行序列化。
- RPC 通常使用二進(jìn)制格式來傳輸數(shù)據(jù),例如 Protocol Buffers(ProtoBuf)或 Apache Thrift。
- 性能不同:RPC 通常比 RESTful API 更高效。這是因?yàn)?RPC 的協(xié)議設(shè)計(jì)更加輕量級,并且它可以對傳輸?shù)臄?shù)據(jù)進(jìn)行二進(jìn)制壓縮,使得請求報(bào)文體積更小,從而提高傳輸效率。而 RESTful API 基于 HTTP 協(xié)議,其報(bào)文頭等信息可能使得傳輸?shù)臄?shù)據(jù)量相對較大,傳輸效率較低。
2.RESTful API 通訊實(shí)現(xiàn)
RESTful API 目前主流的實(shí)現(xiàn)方式有以下兩種:
- RestTemplate:Spring 內(nèi)置的用于執(zhí)行 HTTP 請求的類。
- Spring Cloud OpenFegin:OpenFeign 是 Spring Cloud 對 Feign 庫的封裝,提供聲明式的 HTTP 客戶端,簡化了服務(wù)調(diào)用的編碼工作。
具體實(shí)現(xiàn)如下。
(1)RestTemplate 使用
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
// 使用時(shí)
@Autowired
private RestTemplate restTemplate;
public void callOtherService(String serviceName) {
String url = "http://" + serviceName + "/api/path";
ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
}
(2)Spring Cloud OpenFegin 使用
OpenFegin 引入到項(xiàng)目之后,需要先在 Spring Boot 啟動(dòng)類上添加 @EnableFeignClients 注解,之后使用以下代碼就可以實(shí)現(xiàn) RESTful 通訊了:
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient(name = "service-provider")
public interface ServiceProviderClient {
@GetMapping("/api/hello")
String hello();
}
3.RPC 通訊實(shí)現(xiàn)
RPC 目前主流的通訊方式有以下兩種:
- Dubbo:阿里巴巴公司開源的一個(gè) Java 高性能優(yōu)秀的服務(wù)框架,它基于 TCP 或 HTTP 的 RPC 遠(yuǎn)程過程調(diào)用,支持負(fù)載均衡和容錯(cuò),自動(dòng)服務(wù)注冊和發(fā)現(xiàn)。
- gRPC:Google 開發(fā)的高性能、通用的開源 RPC 框架,它主要面向移動(dòng)應(yīng)用開發(fā)并基于 HTTP/2 協(xié)議標(biāo)準(zhǔn)設(shè)計(jì)。gRPC 使用 ProtoBuf(Protocol Buffers)作為序列化工具和接口定義語言,要求在調(diào)用前需要先定義好接口契約,并使用工具生成代碼,然后在代碼中調(diào)用這些生成的類進(jìn)行服務(wù)調(diào)用。
責(zé)任編輯:姜華
來源:
Java中文社群