(転送+共有)メッセージミドルウェアに基づくシンプルなRPCサービスRabbitMQ / MarkerHub 4月8日MarkerHub 4月8日

リトルハブは読む:

RabbitMq、RPCフレームワークの作成方法に基づいて、コードを見てください。理解できるはずです。

RPC(Remote Procedure Call)は、コンピューター通信プロトコルです。2台のマシンの場合、サーバーAのアプリケーションはサーバーBの関数またはメソッドを呼び出します。これらは同じメモリスペースまたはマシンで実行されていないため、ネットワーク通信が必要です。

1.RPCフレームワーク

まず、RPCのワークフローを図から理解します。

したがって、最も単純なRPCサービスを実装するには、クライアント、サーバー、およびネットワークのみが必要です。この記事では、メッセージミドルウェアRabbitMQをネットワークのキャリアとして使用して、情報を送信し、単純なRPCサービスを実装します。簡単な原理を次の図に示します。

つまり、クライアントがRPC要求を送信するとき、クライアントはメッセージプロデューサーであり、サーバーはメッセージコンシューマーです。サーバーが結果を返すとき、サーバーはメッセージプロデューサーであり、クライアントはメッセージコンシューマーです。異なるキューは送受信に使用されます。

次に、コードを使用して、フィボナッチ数列を計算するRPCサービスを詳細に示します。

2.RPCServerの実装

2.1サーバーの初期化

初期化は、RabbitMQリンクファクトリ、リンク、チャネル、キュー、スイッチなどを宣言し、それらをバインドしてAMQP通信構造を形成することです。

2.2キューとフィードバックを聞く

	
	
		/**

		* 开启server

		*/

		private void startServer() {

		try {

				LOG.info("Waiting for RPC calls.....");

				while (true) {
			
					//获得文本消息
			
					QueueingConsumer.Delivery delivery = consumer.nextDelivery();
			
					BasicProperties props = delivery.getProperties();
			
			
					//返回消息的属性
			
					BasicProperties replyProps = new BasicProperties.Builder().correlationId(props.getCorrelationId()).build();
			
					long receiveTime = System.currentTimeMillis();
			
					JSONObject json = new JSONObject();
	
					try {
			
							String message = new String(delivery.getBody(), "UTF-8");
					
							int n = Integer.parseInt(message);
					
							LOG.info("Got a request: fib(" + message + ")");
					
							json.put("status", "success");
					
							json.put("result", fib(n));
			
					} catch (Exception e) {
				
							json.put("status", "fail");
					
							json.put("reason", "Not a Number!");
					
							LOG.error("receive message failed!", e);
			
					} finally {
			
							long responseTime = System.currentTimeMillis();
					
							json.put("calculateTime", (responseTime - receiveTime));
					
							channel.basicPublish("", props.getReplyTo(), replyProps, json.toString().getBytes("UTF-8"));
					
							channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
			
					}
		
				}
		
			} catch (Exception e) {
	
				LOG.error("server failed!", e);
	
			} finally {
	
				if (connection != null) {
		
					try {
			
						connection.close();
			
					} catch (Exception e) {
			
						LOG.error("close failed!", e);
			
					}
		
				}
		
			}

		}

このメソッドでは無限ループが使用され、一度に1つのメッセージが処理されます。コンシューマーオブジェクトのnextDeliveryメソッドを呼び出して、RabbitMQキュー内の最新のメッセージを取得します。同時に、クライアントの属性をマークするために使用されるgetPropertiesを介して、メッセージ内のフィードバック情報属性を取得します。次に、フィボナッチ数列の結果を計算します。
最後に、basicAckはメッセージエンベロープを使用して、RabbitMQへのメッセージを確認しました。

この時点で、フィボナッチ数列を計算するためのRPCサービスのサーバー側が実現されます。

3.RPCClientの実装

3.1クライアントの初期化

ここでAMQP構造を宣言する方法は、クライアント側がRPC応答用に追加のキューを宣言する必要があることを除いて、サーバー側の方法と似ています。

3.2メッセージの送受信


		/**

		* 请求server

		* @param message

		* @return

		* @throws Exception

		*/

		private String requestMessage(String message) throws Exception {

			String response = null;
	
			String corrId = UUID.randomUUID().toString();
	
			BasicProperties props = new BasicProperties.Builder().correlationId(corrId).replyTo(RESPONSE_QUEUE).build();
	
			channel.basicPublish("", QUEUE_NAME, props, message.getBytes("UTF-8"));
	
			while (true) {
	
				QueueingConsumer.Delivery delivery = consumer.nextDelivery();
		
				if (delivery.getProperties().getCorrelationId().equals(corrId)) {
		
					response = new String(delivery.getBody(),"UTF-8");
		
					break;
				}
			}
			return response;

		}

BasicPropertiesは、リクエストメッセージのプロパティを格納するために使用されます。ここでは、サーバー側のリターンIDのcorrelationIdプロパティとreplyToプロパティを設定します。

4.テストを実行します

クライアント側は以下を送信します:

サーバー側は以下を受信して​​処理します。

クライアントは計算結果を受け取ります:

RabbitMQを実行しているサーバーはAlibabaCloudによってレンタルされているため、送信遅延は約60ミリ秒です。RPCサービスとメッセージミドルウェアが同じコンピュータールームにデプロイされている場合、遅延は基本的にミリ秒レベルです。

5.よくある質問

5.1説明

完全なプロセスを体験するには、次の環境が必要です。

JDK1.6以上 + Maven+ RabbitMQ

5.2ソースコード

完全なコードを突いてください:github:https://github.com/chadwick521/rabbitmqdemo

サーバーのコードは次のとおりです。

rpc.RPCServer

クライアント側のコードの場所:

rpc.RPCClient

上記の内容はすべて、メッセージミドルウェアRabbitMQに基づく単純なRPCサービスの実装に関するものです。ここを読んでいただきありがとうございます。

 

                                     ------------------------------------------- <終了> ---- -----------------------------------

著者:zhaoyh

元のアドレスhttps://blog.csdn.net/ZYH920521/article/details/88974607

MarkerHub記事インデックス:(クリックして元のテキストを直接読む)

https://github.com/MarkerHub/JavaIndex

MarkerHub  4月8日

 

おすすめ

転載: blog.csdn.net/qq_31653405/article/details/107205780