面試官:微服務通訊方式有哪些?
作者:磊哥
基于 HTTP 協(xié)議的 RESTful API 是最常用的微服務通訊方式之一。RPC 允許一個服務像調用本地方法一樣調用另一個服務的方法。RESTful API 和 RPC 是微服務間最常用的通訊方式。

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































