RPC(Remote Procedure Call)是一種通過網絡從遠程計算機程序中請求服務,而不需要了解底層網絡技術的方式。RPC使得調用遠程服務就像調用本地服務一樣簡單,將網絡通信、數據傳輸等相關細節都封裝在底層實現之中,使得上層應用程序可以像調用本地方法一樣透明地調用遠程方法。
一、RPC的概念與作用
RPC(Remote Procedure Call)意為遠程過程調用,是一種常用的跨機器、跨進程的通信方式,通俗來講,RPC就是一種接口,程序A通過調用RPC接口去請求程序B提供的服務。RPC的作用主要體現在分布式系統上,旨在讓分布式系統的各個節點之間實現無縫通信,方便編程人員編寫出更高效、更優雅的分布式系統。
RPC採用的是客戶端與服務端之間的通信模式,客戶端通過調用服務端的接口特定函數,請求服務端提供配置的服務。RPC使得調用遠程服務就像調用本地服務一樣簡單,通過把網絡通信、數據傳輸等相關細節都封裝到底層實現之中,RPC使得上層應用程序可以像調用本地方法一樣透明地調用遠程方法,使得分布式計算系統更加容易使用,讓開發人員能夠將精力更集中在編寫應用程序本身的業務邏輯上,可以更快地開發出線上服務。
RPC的工作流程大致分為下面這些步驟:
1.服務端啟動,並監聽一個網絡地址; 2.客戶端發起連接請求; 3.服務端接收到請求之後,將客戶端所需要執行的請求內容(請求體)提取出來,並交由解析器進行解析,生成具體的執行指令; 4.服務端開始執行指令,並將相應結果返回給客戶端。
二、RPC的實現方式
RPC的實現方式絕大部分都是基於網絡的一些通信協議實現的,RPC協議目前已經被多種語言所支持,例如在Java中我們可以使用Dubbo、Thrift、gRPC 等框架進行RPC的實現。
下面來簡單介紹下這幾個框架:
Dubbo
Dubbo是阿里巴巴開發的一個高性能、輕量級的開源Java RPC框架,可以用於構建高性能和可擴展的分布式服務應用程序。
Dubbo採用了RPC通信模式,可以支持多種協議(默認基於Netty+Http),提供了零配置、智能負載均衡、自動容錯等機制,支持以Spring為核心容器。
Dubbo的特性如下:
1. 快速編排:通過Dubbo提供的spring boot starter或官方提供的maven插件,便可幾行配置完成dubbo的接入,可快速進行服務接入調試; 2. 註解豐富:Dubbo提供了大量的註解來管理dubbo服務,例如dubbo的服務提供者、服務消費者、reference註解、service註解、path註解等; 3. 服務治理:Dubbo提供了四種註冊中心(ZooKeeper、Redis、Consul、Multicast)供我們選擇,並提供了服務降級、服務熔斷、流量分流等功能實現; 4. 高性能:通過協議的壓縮和Dubbo FastJson的序列化,Dubbo可以快速的序列化和反序列化對象; 5. 特性豐富:Dubbo完全實現Dubbo特性,保證API的功能穩定性,同時接口粒度可以細化到每個方法,支持多種API級別的自定義配置。
Thrift
Thrift是一款高效的、支持自動代碼生成的、可跨語言的RPC框架,由Facebook公司開發,用於處理大量跨語言服務調用的情況,目前已經成為了Apache的頂級項目。
Thrift主要支持數十種編程語言,因此稱其為多語言 RPC 框架也不為過,通過代碼生成器可以在多個應用程序之間自動序列化結構化數據,利用協議編解碼技術將結構化的數據序列化後,進行網絡傳輸,使得應用程序間的分布式調用就像本地方法一樣簡單。
Thrift的主要優點如下:
1. 可擴展性好:支持多種編程語言(如C++, Java, Python, Ruby, PHP等),對於開發人員來說非常方便和友好; 2. 可讀性高:內置接口描述語言IDL,注重接口定義的清晰性和可讀性,且IDL只與語言相關,不與協議相關,開發人員易於編寫和理解; 3. 序列化協議多樣化:支持幾種常見的數據序列化協議(如TBinaryProtocol、TCompactProtocol、TJSONProtocol等),對於不同的使用場景都有選擇; 4. 平台對接:Thrift支持多種平台的對接(如Java與C++、Python與Java等),支持多系統間的通信,便於實現分布式系統間的集成和調用;
gRPC
gRPC 是 Google 開發的下一代開源RPC框架,支持多種編程語言。gRPC 基於 HTTP/2 標準設計,帶來諸如雙向流、流控、頭部壓縮、多項 RPC 支持等特性。通過 ProtoBuf 序列化協議來精簡了消息大小。
它的優點如下:
1. 跨平台:gRPC支持多種語言(如Java、Python、C++等),可以互相進行調用,更加方便; 2. 傳輸格式:gRPC 默認使用 Protocol Buffers 作為數據傳輸格式,支持多種序列化方式,比如 Protobuf 和 JSON; 3. 壓縮:gRPC 內置基於 HTTP/2 標準的壓縮機制,能夠大幅度減小通訊數據量,這對於流量敏感的應用、大流量應用等來說非常有意義; 4. 雙向流:gRPC 實現了高級的流的支持,支持雙向流、指定大小的流和單項流等多種流; 5. 動態集成:支持向已經搭建好的系統中無縫集成 grpc 服務,通過函數綁定,相互調用,無需其他複雜的配置; 6. 大型系統:gRPC 適用於大型系統,高並發,支撐負載均衡和限流等操作,可以通過多種語言去控制與調用。
三、RPC的應用場景
RPC的應用場景非常廣泛,主要是針對分布式系統這個大家族的集群部署等場景。下面是一些比較常見的應用場景:
微服務
在微服務情況下,按照微服務架構的設計,各種屬性的微服務可通過RPC技術實現相互之間的各種調用和訪問。也就是各種微服務之間雙向的客戶端‐服務端調用,既可以實現同步調用,也可以做異步非阻塞調用,RPC可以通過微服務的Rest API實現,也可以直接通過直接函數調用實現例如:通過Grpc的封裝JAVA客戶端來調用Python的grpc服務。
分布式文件系統
分布式文件系統中集中設置文件訪問機制比較常見,一般採用了基於RPC通信的客戶端服務器模式。
分布式計算
分布式計算中,各個節點都需要協同工作,RPC 只是一種遠程調用技術,但是整合 RPC 可以很好的幫助分布式計算協調完成任務。
在線協作編輯器
在線協作編輯器一般需要多個用戶同時編輯同一個文檔,用戶對文檔的操作會實時同步到其他用戶的屏幕。RPC 十分適合這種場景,可將實時修改的內容通過服務端同步到其他用戶屏幕中。
遊戲行業
在遊戲開發中,RPC 也是一個比較重要的技術之一,因為遊戲中往往需要多個服務器提供計算和存儲服務,採用 RPC 技術可使多個服務器之間互相通信、互相交互。
四、RPC的代碼實例
下面給出一個簡單的代碼示例,演示了使用gRPC實現基本的遠程調用。
步驟一:在服務端定義一個數據結構和一個RPC函數
syntax = "proto3"; package hello; message HelloRequest { string name = 1; } message HelloResponse { string message = 1; } service HelloService { rpc hello(HelloRequest) returns (HelloResponse) {} }
步驟二:使用gRPC框架生成的代碼實現服務端函數
public class HelloServer extends HelloServiceGrpc.HelloServiceImplBase { @Override public void hello(HelloRequest request, StreamObserver<HelloResponse> responseObserver) { String message = "Hello " + request.getName() + "!"; HelloResponse response = HelloResponse.newBuilder().setMessage(message).build(); responseObserver.onNext(response); responseObserver.onCompleted(); } }
步驟三:啟動gRPC服務器,監聽指定端口
Server server = ServerBuilder.forPort(8080) .addService(new HelloServer()).build().start(); System.out.println("Server started, listening on " + server.getPort()); server.awaitTermination();
步驟四:在客戶端創建一個gRPC信道,發起請求
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 8080).usePlaintext().build(); HelloServiceGrpc.HelloServiceBlockingStub stub = HelloServiceGrpc.newBlockingStub(channel); HelloRequest request = HelloRequest.newBuilder().setName("World").build(); HelloResponse response = stub.hello(request); System.out.println(response.getMessage());
總結
RPC技術憑着其高效性和透明性多方得到了廣泛的應用。隨着微服務的興起和分布式技術的推廣,RPC技術也將逐步成為構建分布式架構的一項重要基礎技術。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/311283.html