RPCとRESTの違い


最近、フォーラムや微信グループに参加して、この問題について多くの人が議論しているのを見ていますが、実は最も重要なのはRPCとRESTとは何かを理解していないことです.
RPC
RPCとは何ですか.ブラウザでjsを通じてhttpアドレスにアクセスしてバックグラウンドインタフェースを呼び出したのはRPCですか.tcp通信プロトコルでクライアントがサーバにバイナリメッセージを送信してサーバの関数の実行をトリガーしました.これはRPCですか?WikipediaのRPCの定義は以下の通りです.
リモート・プロシージャ・コール(英語:Remote Procedure Call、略称RPC)は、コンピュータ通信プロトコルです.このプロトコルは、1つのコンピュータで実行されるプログラムが別のコンピュータのサブルーチンを呼び出すことを可能にし、プログラマはこのインタラクションのために追加的にプログラミングする必要はありません.
この定義を参照すると、上記の2つの場合はRPCに分類できるようですが、定義の中で最も重要な言葉は、重点的に説明されるべきです.
プログラマーはこのインタラクションのためにプログラミングする必要はありません
JSがHTTPにアクセスするにはhttpプロトコルの詳細を処理する必要があり、tcpがバイナリメッセージを送信するにはsocketのリンク中断の様々な状況を処理する必要があります.つまり、プログラマはこれらのインタラクションを処理するためにプログラミングする必要があるので、RPCには属しません.RPCの1つの典型的な特徴は1つのstub(ルートを保存する)プログラムがあって、一般的にサーバーのインタフェースを通じてstubを生成して、それから直接クライアントに使用して、クライアントはコードの中で直接このstub(C++の中で1つのヘッダファイルで、javaの中で1つのinterfaceインタフェース)を導入して、それからクライアントは直接この関数を呼び出すことができます.
この例を参照:コードリンクサーバコード
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
 
//     
public class ServiceImpl extends UnicastRemoteObject implements IService {
 
    /**
     */
    private static final long serialVersionUID = 682805210518738166L;
 
    /**
     * @throws RemoteException
     */
    protected ServiceImpl() throws RemoteException {
        super();
    }
 
    /* (non-Javadoc)
     *
     */
    @Override
    public String queryName(String no) throws RemoteException {
        //        
        System.out.println("hello" + no);
        return String.valueOf(System.currentTimeMillis());
    }
    
}

STUBプログラム:
public interface IService extends Remote {
 
    public String queryName(String no) throws RemoteException;
 
}

クライアント:
import java.rmi.AccessException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
 
// RMI   
public class Client {
 
    public static void main(String[] args) {
        //      
        Registry registry = null;
        try {
            //          
            registry = LocateRegistry.getRegistry("127.0.0.1",8088);
            //          
            String[] list = registry.list();
            for(String s : list){
                System.out.println(s);
            }
        } catch (RemoteException e) {
            
        }
        try {
            //         
            IService server = (IService) registry.lookup("vince");
            //       
            String result = server.queryName("ha ha ha ha");
            //       
            System.out.println("result from remote : " + result);
        } catch (AccessException e) {
            
        } catch (RemoteException e) {
            
        } catch (NotBoundException e) {
            
        }
    }
}

クライアントがstub関数を直接呼び出すのを見ることができます.ローカル関数を呼び出すのと同じように、各記事で紹介したRPCの定義と特徴にも合っています.
String result = server.queryName("ha ha ha ha");

REST
RESTはすでに接触していますが、ここでは2つの誤解に重点を置いています.
リンク動的生成へのアクセス
一般的なwebプログラムは、サーバとクライアントによってurlパスと役割を約束します.例えば、http://test/class 対応クラス、http://test/class/1/students クラス1の生徒に対応する.RESTはエントリURLを1つだけ約束し,その他はサーバが生成してクライアントに送信する.例えばクライアントがhttp://test/class/1すると、サーバはjsonデータを介してクライアントクラス1の下の学生リストにurlがhttp://test/class/1/students サーバがurlをクライアントに通知しないと、クライアントはstudentsリスト情報にアクセスできません.これは,REST定義で述べたサーバ制御リソースの状態遷移である.
HTTP VERBOSE
HTTP verboseのput get delete postは、必ずしもデータベースの削除・変更に対応する必要はありません.RESTにはこのような要求はありません.
区別する
ここからRESTとRPCが比較できないことがわかります.RPCはローカルプログラムとリモートプログラムのインタラクションの一種である.RESTは、クライアントとサーバ間のインタフェースをどのように定義するかを約束するアーキテクチャスタイルです.開発で完全なインタラクションを実現するには、インタフェースのフォーマットを定義する必要があり、双方のインタラクション方式を定義する必要があります.例えばC++プログラムではバイナリフォーマットのプロトコル(すなわちインタフェースフォーマット)を定義し,どの通信プロトコル(TCPやUDPなど)を選択するかを決定する.だからrestとrpcは異なる階層の問題を解決します