模倣
gRPC
関数は、ローカル メソッドを呼び出すのと同じように、他のサーバー メソッドを呼び出すことを実装します。
gRPC
関数は、ローカル メソッドを呼び出すのと同じように、他のサーバー メソッドを呼び出すことを実装します。
導入
gRPC
概要を紹介する前に、まず概念を理解しましょう。
モノリシックアーキテクチャ
モノリシック アーキテクチャを簡単に理解すると、すべてのビジネス コードが 1 つのサーバー上にあり、特定のサービスが停止すると、アプリケーション全体が使用できなくなり、分離性が低下します。アプリケーション全体のみをスケーリングできます。たとえば、アプリケーション全体がパッケージ化されて 1 つ以上のサーバーにデプロイされますが、これではリソースが無駄になり、スケーラビリティが低くなります。コードが結合されており、保守性が悪くなります。
マイクロサービスアーキテクチャ
モノリシック アーキテクチャの欠点を解決します。必要に応じて複数のサービスに分割することが可能で、例えばユーザーのリクエストが多く、決済のリクエストが少ない場合には、ユーザーの業務機能を複数のサーバーに分割し、決済のビジネス機能を単一のサーバーに分割することができます。
コードの冗長性やインターフェースなど複数のサーバーに同じコードを書かなければならないなどのデメリットもあります。サービス間には呼び出し関係があり、サービス分割後はサービスとプロセス間の呼び出し、サーバー間の呼び出しが発生します。
このとき、ネットワーク呼び出しを開始する必要があります。ネットワーク呼び出しは一般的に使用されますHTTP
が、マイクロサービス アーキテクチャではHTTP
便利ですが、パフォーマンスが低くなります。このとき、RPC
(リモート プロシージャ コール)を導入して開始する必要があります。カスタム プロトコルを介して呼び出しを行うとTCP
、伝送効率が向上します。
RPC
RPC
正式名称はRemote Procedure Call
リモートプロシージャコールです。これは、分散コンピューティングでさまざまな呼び出しの詳細を保護するために使用されるプロトコルであり、ローカル呼び出しのようにリモート関数を直接呼び出すことができます。
gPRC
gRPC
RPC
モバイルとデザインのための高性能、オープンソースの汎用フレームワークですHTTP/2
。現在C
、 、、の言語バージョンJava
がGo
それぞれ利用可能です: grpc
、grpc-java
、バージョンgrpc-go.
は、、、、、をサポートします。C
C
C++
Node.js
Python
Ruby
Objective-C
PHP
C#
中国語ドキュメント: 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 Server
lis.Accept
まで開始しますStop
。
クライアントロジック
- 指定されたターゲット サーバーとの接続対話を作成します。
server
クライアント オブジェクトが作成されました。- リクエストを送信し
RPC
、同期応答を待ち、コールバックを取得した後に応答結果を返します。 - 応答ノットを出力します。
サンプルグラフ
以下の図に示すように、業務サーバーは業務サーバー、決済サーバー、在庫サーバーにログインするために呼び出します。
gRPC
模倣フレームワークのネイティブ実装
gRPC
現在フレームワークはサポートしていないためIRIS/Caché
、ここではgRPC
原理を理解してgRPC
フレームワークを模倣して同様の機能を実現します。通常どおりコードを記述することで、意識せずに他のサーバー上のコード メソッドを呼び出します。
注: ここで表示するには、Caché
クライアントまたはIRIS
サーバーとして使用します。
クライアントメソッドを書く
- まず、クライアント側、つまり呼び出し側でクライアント クラスを作成します
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
}
}
- 空のクラスを作成し、
M.Login
それぞれ継承します。M.Pay
M.Stock
Util.RPC.Client
- 他のサーバー メソッドを呼び出すには、最初に呼び出されるサーバー インターフェイスの名前を決定する必要があるため、対話型インターフェイスをシミュレートすることが目的です。
-
通常のメソッド呼び出しパターンに従ってメソッドを記述します。
-
前のステップで作成されたクラスは空のクラスである
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),!
}
}
サーバー側のメソッドを作成する
- サーバー側のリスニング
Util.RPC.Server
クラスを作成します。これは、オブジェクトのgRPC
作成、 の作成、およびリスニングポートをシミュレートします。コードは以下のように表示されます:Server
Listen
TCP
- パラメータは、
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
}
}
-
サーバー側の
M.Login
メソッドLogin
、M.Pay
メソッドPay
、M.Stock
メソッドを記述しますStock
。-
ここではサーバーが使用されており
IRIS
、実装されたメソッドはすべてサーバー上にありますが、クライアントにはこのメソッドがありません。 -
クライアントによって呼び出されるメソッドは、実際にはサーバー上のメソッドです。
-
総合的なデモンストレーション
-
IRIS
サーバー側でリスニング方法を有効にします。 -
クライアントは、
Caché
ビジネス ロジックを意識することなく、Sales メソッドを呼び出しますBiz()
。-
クライアントがサーバーのメソッドを直接呼び出しており、コーディング方法は通常のコード作成方法と何ら変わらないことがわかります。
-
クライアントは基礎となる詳細を知る必要はなく、
client
定義されたメソッドを直接呼び出すことのみが必要です。
-
このようにして、同様のgRPC
機能を実現し、通常のコードを記述するのと同じようにサーバー側プログラムを呼び出します。
価値を創造し、学びを共有し、共に成長し、共に前進し、誰もが意見を出し合い、コミュニケーションを図りましょう。