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