`gRPC` 関数を模倣して、ローカル メソッドを呼び出すように他のサーバー メソッドを呼び出す

模倣 gRPC 関数は、ローカル メソッドを呼び出すのと同じように、他のサーバー メソッドを呼び出すことを実装します。

導入

gRPC概要を紹介する前に、まず概念を理解しましょう。

モノリシックアーキテクチャ

モノリシック アーキテクチャを簡単に理解すると、すべてのビジネス コードが 1 つのサーバー上にあり、特定のサービスが停止すると、アプリケーション全体が使用できなくなり、分離性が低下します。アプリケーション全体のみをスケーリングできます。たとえば、アプリケーション全体がパッケージ化されて 1 つ以上のサーバーにデプロイされますが、これではリソースが無駄になり、スケーラビリティが低くなります。コードが結合されており、保守性が悪くなります。

マイクロサービスアーキテクチャ

モノリシック アーキテクチャの欠点を解決します。必要に応じて複数のサービスに分割することが可能で、例えばユーザーのリクエストが多く、決済のリクエストが少ない場合には、ユーザーの業務機能を複数のサーバーに分割し、決済のビジネス機能を単一のサーバーに分割することができます。

コードの冗長性やインターフェースなど複数のサーバーに同じコードを書かなければならないなどのデメリットもあります。サービス間には呼び出し関係があり、サービス分割後はサービスとプロセス間の呼び出し、サーバー間の呼び出しが発生します。

このとき、ネットワーク呼び出しを開始する必要があります。ネットワーク呼び出しは一般的に使用されますHTTPが、マイクロサービス アーキテクチャではHTTP便利ですが、パフォーマンスが低くなります。このとき、RPC(リモート プロシージャ コール)を導入して開始する必要があります。カスタム プロトコルを介して呼び出しを行うとTCP、伝送効率が向上します。

RPC

RPC正式名称はRemote Procedure Callリモートプロシージャコールです。これは、分散コンピューティングでさまざまな呼び出しの詳細を保護するために使用されるプロトコルでありローカル呼び出しのようにリモート関数を直接呼び出すことができます。

gPRC

gRPCRPCモバイルとデザインのための高性能、オープンソースの汎用フレームワークですHTTP/2現在C、 、、の言語バージョンJavaGoそれぞれ利用可能です: grpcgrpc-javaバージョンgrpc-go.サポートします。CCC++Node.jsPythonRubyObjective-CPHPC#

中国語ドキュメント: http://doc.oschina.net/grpc

ではgRPC、呼び出し元を呼び出しclient、呼び出し先を呼び出しますserver他のRPCフレームワークと同様に、gRPCこれもサービス定義の考え方に基づいています。簡単に言うと、言語に依存しない特定の方法でサービスを記述します。このサービスを定義するプロセスでは、サービス名が何であるか、どのメソッドを呼び出すことができるか、これらのメソッドにどのような入力パラメータがあるか、およびどのような種類の戻りパラメータがあるかを記述します。

つまり、これらのサービスとメソッドが定義された後は、gRPC基礎となる詳細がシールドされ、client期待される戻り結果を取得するには、定義されたメソッドを直接呼び出すだけで済みます。最後にserver、定義したメソッドを実装する必要もあります。同様に、gRPC基礎となる詳細をシールドするのにも役立ちます。定義されたメソッドの特定のロジックを実装するだけで済みます。

上記の記述プロセスでは、いわゆるサービス定義がインターフェイス定義のセマンティクスに非常に近いことがわかります。私はこれを「合意」として理解することを好みます。双方がインターフェイスに同意し、その後、serverこのインターフェイスを実装して、clientこのインターフェイスのプロキシ オブジェクトを呼び出します。その他の詳細については、私にお任せくださいgRPC

gRPCインタラクションロジック

サーバー側ロジック

  • gRPC Serverオブジェクトの作成は、Server抽象オブジェクトとして理解できます。
  • server(呼び出す必要があるサーバー インターフェイスを含む) をgRPC Server内部登録センター に登録します。
    • これは、リクエストを受信したときに内部サービスを通じて検出できます。サーバー インターフェイスを検出し、論理処理のために転送します。
  • ポートを作成してListenリッスンします。TCP
  • gRPC Serverlis.Acceptまで開始しますStop

クライアントロジック

  • 指定されたターゲット サーバーとの接続対話を作成します。
  • serverクライアント オブジェクトが作成されました。
  • リクエストを送信しRPC、同期応答を待ち、コールバックを取得した後に応答結果を返します。
  • 応答ノットを出力します。

サンプルグラフ

以下の図に示すように、業務サーバーは業務サーバー、決済サーバー、在庫サーバーにログインするために呼び出します。

ここに画像の説明を挿入します

gRPC模倣フレームワークのネイティブ実装

gRPC現在フレームワークはサポートしていないためIRIS/Caché、ここではgRPC原理を理解してgRPCフレームワークを模倣して同様の機能を実現します。通常どおりコードを記述することで、意識せずに他のサーバー上のコード メソッドを呼び出します。

注: ここで表示するには、CachéクライアントまたはIRISサーバーとして使用します。

クライアントメソッドを書く

  1. まず、クライアント側、つまり呼び出し側でクライアント クラスを作成しますUtil.RPC.Client。コードは次のとおりです。
    • %DispatchClassMethod- 動的なディスパッチ方法が、知覚不可能性を実現する鍵となります。
    • SERVERIP- ターゲットサーバーのアドレスIP
    • PORT- ターゲットサーバーのポート番号。
Class Util.RPC.Client Extends %RegisteredObject
{
    
    

Parameter SERVERIP = "127.0.0.1";

Parameter PORT = 7788;

ClassMethod %DispatchClassMethod(class As %String, method As %String, args...) [ ServerOnly = 1 ]
{
    
    
	
	#; 客户端通信、客户端需要设置服务器IP与端口号
	#dim clientSocket As %IO.Socket = ##class(%IO.Socket).%New()
	s host = ..#SERVERIP
	s port = ..#PORT
	s clientSocket.TranslationTable = "UTF8"
	
	d clientSocket.Open(host, port, .sc)
	
	s obj = {
    
    }	//注释1
	s obj.class = class
	s obj.method = method
	
	s params = []
	
	s i = ""
	for {
    
    
		s i = $o(args(i))
		q:(i = "")
		d params.%Push(args(i))
	}
	
	s obj.params = params
	d clientSocket.WriteLine(obj.%ToJSON())	//注释2
	
	while (1) {
    
    

		s data = clientSocket.ReadLine() 
		if (data '= "" ){
    
    	//注释3
			ret data
		}
		
	}
	
	q $$$OK
}

}
  1. 空のクラスを作成しM.Loginそれぞれ継承しますM.PayM.StockUtil.RPC.Client
    • 他のサーバー メソッドを呼び出すには、最初に呼び出されるサーバー インターフェイスの名前を決定する必要があるため、対話型インターフェイスをシミュレートすることが目的です。

ここに画像の説明を挿入します

  1. 通常のメソッド呼び出しパターンに従ってメソッドを記述します。

    • 前のステップで作成されたクラスは空のクラスであるLoginためPay実際にはここにはメソッドはありません。Stock

    • ルーチンに従って直接メソッドを呼び出すと必ずメソッドが存在しないというエラーが表示されますが、ここでは実際にサーバー側でメソッドを呼び出しています。

    • ここのコードはクラス メソッドを呼び出す通常の方法で記述されており、他に追加の操作がないことがわかります。

Class M.RPC Extends %RegisteredObject
{
    
    

/// d ##class(M.RPC).Biz()
ClassMethod Biz()
{
    
    
	w ##class(M.Login).Login("yx","123456"),!
	w ##class(M.Pay).Pay(100),!
	w ##class(M.Stock).Stock(3),!
}

}

サーバー側のメソッドを作成する

  1. サーバー側のリスニングUtil.RPC.Serverクラスを作成します。これは、オブジェクトのgRPC作成、 の作成、およびリスニングポートをシミュレートします。コードは以下のように表示されます: ServerListenTCP
    • パラメータは、PORTサーバーが監視して開くインターフェイスです。
Class Util.RPC.Server Extends %RegisteredObject
{
    
    

Parameter PORT = 7788;

/// d ##class(Util.RPC.Server).ServerRPC()
ClassMethod ServerRPC()
{
    
    
	#; 服务端通信、服务端需要打开端口,等待客户端通信
	#dim severSocket As %IO.ServerSocket = ##class(%IO.ServerSocket).%New()
	s port = ..#PORT
	s severSocket.TranslationTable="UTF8"
	s severSocket.ConnectionQueueSize = 2
	
	d severSocket.Open(port, 10, .sc)
	q:($$$ISERR(sc)) "Open:" _ $System.Status.GetOneErrorText(sc)
	
	d severSocket.Listen(10, .sc)
	q:($$$ISERR(sc)) "Listen:" _ $System.Status.GetOneErrorText(sc)
	
	while (1) {
    
    
		s data =  severSocket.ReadLine()
		if (data '= "") {
    
    
			s obj = {
    
    }.%FromJSON(data)	//注释1
			s arg = obj.params.%Size()
			for i = 1 : 1 : arg{
    
    
				s arg(i) = obj.params.%Get(i - 1)
			}
			s ret = $classmethod(obj.class, obj.method, arg...)	//注释2
			d severSocket.WriteLine(ret)	//注释3
		}
	}

	q $$$OK
}

}
  1. サーバー側のM.LoginメソッドLoginM.PayメソッドPayM.Stockメソッドを記述しますStock

    • ここではサーバーが使用されておりIRIS、実装されたメソッドはすべてサーバー上にありますが、クライアントにはこのメソッドがありません。

    • クライアントによって呼び出されるメソッドは、実際にはサーバー上のメソッドです。

ここに画像の説明を挿入します

総合的なデモンストレーション

  1. IRISサーバー側でリスニング方法を有効にします。

  2. クライアントは、Cachéビジネス ロジックを意識することなく、Sales メソッドを呼び出しますBiz()

    • クライアントがサーバーのメソッドを直接呼び出しており、コーディング方法は通常のコード作成方法と何ら変わらないことがわかります。

    • クライアントは基礎となる詳細を知る必要はなく、client定義されたメソッドを直接呼び出すことのみが必要です。

ここに画像の説明を挿入します

このようにして、同様のgRPC機能を実現し、通常のコードを記述するのと同じようにサーバー側プログラムを呼び出します。

価値を創造し、学びを共有し、共に成長し、共に前進し、誰もが意見を出し合い、コミュニケーションを図りましょう。

おすすめ

転載: blog.csdn.net/yaoxin521123/article/details/132636985