什麼是RPC?

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-hk/n/311283.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-05 13:23
下一篇 2025-01-05 13:23

相關推薦

  • 使用RPC研發雲實現分佈式服務交互

    本文將基於RPC研發雲,闡述分佈式服務交互實現的過程和實現方式。 一、RPC研發雲簡介 RPC研發雲是一種基於分佈式架構的服務框架,在處理不同語言之間的通信上變得越來越流行。通過使…

    編程 2025-04-28
  • Python RPC框架:詳解

    一、簡介 Python RPC (Remote Procedure Call)框架,是Python中常用的一種通信方式。它可以讓一個進程中的函數或方法調用另外一個進程中的函數或方法…

    編程 2025-01-09
  • 阿里G2-高效可擴展的RPC框架

    一、基本概念 阿里G2是一款高效可擴展的RPC框架,它支持同步和異步兩種調用方式,並且提供了efficient tracking(ET)和熔斷器(Circuit Breaker)等…

    編程 2024-12-29
  • 深入了解RPCS4:一個多語言RPC框架

    一、RPCS4簡介 RPCS4是一個開源、跨語言的RPC框架,它可以幫助不同的程序在不同的計算機之間進行通信,使得不同語言編寫的程序可以方便地進行互操作。RPCS4支持多種協議和傳…

    編程 2024-12-15
  • RPC和HTTP的區別

    一、RPC和HTTP的區別 RPC和HTTP協議都是用於不同進程或者不同計算機之間通信的協議。但是RPC具有以下兩個優點:1. RPC通信速度更快,因為它不需要像HTTP一樣進行大…

    編程 2024-12-15
  • RPC調用與HTTP調用的區別

    一、RPC調用與本地調用的區別 遠程過程調用(RPC, Remote Procedure Call)就是異地的計算機通過一條網絡連接,像執行本地操作一樣去執行遠端計算機上的操作。 …

    編程 2024-12-12
  • 什麼是RPC?

    RPC,即Remote Procedure Call,是一種遠程過程調用協議。與傳統的HTTP請求不同,RPC允許像調用本地函數一樣調用服務端的函數,讓分佈式應用程序像本地應用一樣…

    編程 2024-12-12
  • HTTP與RPC的詳解

    一、HTTP與TCP HTTP是基於TCP協議的應用層協議,它是一種無狀態的、面向請求和響應的協議。使用HTTP協議時,應用程序向服務器發送一個請求,服務器會返回相應的響應。請求和…

    編程 2024-11-24
  • 深入探究clnt_create:rpc:unabletore

    在進行RPC遠程調用的過程中,常常會遇到clnt_create:rpc:unabletore這個錯誤。它的出現意味着客戶端無法創建一個遠程過程調用(RPC)的句柄,從而無法連接到服…

    編程 2024-11-22
  • 手寫rpc實現詳解

    一、手寫rpc框架 RPC(Remote Procedure Call,遠程過程調用),是一種用於客戶端和服務器端進行通信的協議。通過RPC可以實現跨語言、跨平台、不同機器之間的服…

    編程 2024-11-21

發表回復

登錄後才能評論