Servicio RPC simple basado en el middleware de mensajes RabbitMQ, resumen del principio de inicio de Springboot

2.2 Escuche la cola y dé su opinión

  1. /**

  2. * 开启server

  3. */

  4. private void startServer() {

  5. try {

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

  7. while (true) {

  8. //获得文本消息

  9. QueueingConsumer.Delivery delivery = consumer.nextDelivery();

  10. BasicProperties props = delivery.getProperties();

  11. //返回消息的属性

  12. BasicProperties replyProps = new BasicProperties.Builder()

  13. .correlationId(props.getCorrelationId())

  14. .build();

  15. long receiveTime = System.currentTimeMillis();

  16. JSONObject json = new JSONObject();

  17. try {

  18. String message = new String(delivery.getBody(), "UTF-8");

  19. int n = Integer.parseInt(message);

  20. LOG.info("Got a request: fib(" + message + ")");

  21. json.put("status", "success");

  22. json.put("result", fib(n));

  23. } catch (Exception e) {

  24. json.put("status", "fail");

  25. json.put("reason", "Not a Number!");

  26. LOG.error("receive message failed!", e);

  27. } finally {

  28. long responseTime = System.currentTimeMillis();

  29. json.put("calculateTime", (responseTime - receiveTime));

  30. channel.basicPublish("", props.getReplyTo(), replyProps, json.toString().getBytes("UTF-8"));

  31. channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);

  32. }

  33. }

  34. } catch (Exception e) {

  35. LOG.error("server failed!", e);

  36. } finally {

  37. if (connection != null) {

  38. try {

  39. connection.close();

  40. } catch (Exception e) {

  41. LOG.error("close failed!", e);

  42. }

  43. }

  44. }

  45. }

En este método se usa un ciclo infinito, procesando un mensaje a la vez. Obtenga el último mensaje de la cola de RabbitMQ llamando al método nextDelivery del objeto consumidor. Al mismo tiempo, el atributo de información de retroalimentación en el mensaje se obtiene a través de getProperties, que se utiliza para marcar el atributo del cliente Cliente. Luego calcula el resultado de la sucesión de Fibonacci.
El mensaje finalmente se reconoce en RabbitMQ mediante un sobre de mensaje a través de basicAck.

Hasta ahora, se ha realizado el lado del servidor del servicio RPC para calcular la secuencia de Fibonacci.

3. Implementación de RPCClient

3.1 Inicializar CLIENTE

  1. /**

  2. * 消息请求的队列名、交换机名、路由键

  3. */

  4. private static final String EXCHANGE_NAME = "rpc_exchange";

  5. private static final String QUEUE_NAME = "request_rpc_queue";

  6. private static final String ROUTING_KEY = "rpc_routing_key";

  7. /**

  8. * 消息返回的队列名、交换机名、路由键

  9. */

  10. private static final String RESPONSE_QUEUE = "response_rpc_queue";

  11. private static final String RESPONSE_ROUTING_KEY = "response_rpc_routing_key";

  12. /**

  13. * RabbitMQ的实体

  14. */

  15. private Connection connection = null;

  16. private Channel channel = null;

  17. private QueueingConsumer consumer = null;

  18. /**

  19. * 构造客户端

  20. * @throws Exception

  21. */

  22. private RPCClient() throws Exception {

  23. ConnectionFactory factory = new ConnectionFactory();

  24. factory.setHost(Config.HOST);

  25. factory.setPort(Config.PORT);

  26. factory.setUsername(Config.USER);

  27. factory.setPassword(Config.PASSWORD);

  28. connection = factory.newConnection();

  29. channel = connection.createChannel();

  30. channel.exchangeDeclare(EXCHANGE_NAME, "direct");

  31. channel.queueDeclare(QUEUE_NAME, false, false, false, null);

  32. channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);

  33. channel.queueDeclare(RESPONSE_QUEUE, false, false, false, null);

  34. channel.queueBind(RESPONSE_QUEUE, EXCHANGE_NAME, RESPONSE_ROUTING_KEY);

  35. consumer = new QueueingConsumer(channel);

  36. channel.basicConsume(RESPONSE_QUEUE, true, consumer);

  37. }

La forma de declarar la estructura AMQP aquí es similar a la del lado del servidor, excepto que el lado del cliente necesita declarar una cola adicional para RPC re

"Análisis de las preguntas de la entrevista de Java en fabricantes de primera línea + notas de estudio de desarrollo de back-end + video de explicación de arquitectura más reciente + folletos de código fuente del proyecto real"

[docs.qq.com/doc/DSmxTbFJ1cmN1R2dB] Uso compartido de código abierto de contenido completo

respuesta。

3.2 Enviar/recibir mensajes

  1. /**

  2. * 请求server

  3. * @param message

  4. * @return

  5. * @throws Exception

  6. */

  7. private String requestMessage(String message) throws Exception {

  8. String response = null;

  9. String corrId = UUID.randomUUID().toString();

  10. BasicProperties props = new BasicProperties.Builder().correlationId(corrId).replyTo(RESPONSE_QUEUE).build();

  11. channel.basicPublish("", QUEUE_NAME, props, message.getBytes("UTF-8"));

  12. while (true) {

  13. QueueingConsumer.Delivery delivery = consumer.nextDelivery();

  14. if (delivery.getProperties().getCorrelationId().equals(corrId)) {

  15. response = new String(delivery.getBody(),"UTF-8");

  16. break;

  17. }

  18. }

  19. return response;

  20. }

BasicProperties se utiliza para almacenar los atributos de su mensaje de solicitud Aquí configuro los atributos de correlaciónId y de respuesta para la identificación de retorno en el lado del servidor.

4. Ejecute las pruebas

El cliente envía:

El servidor recibe y procesa:

El cliente recibe el resultado del cálculo:

Dado que el servidor que ejecuto RabbitMQ se alquila de Alibaba Cloud, la demora de transmisión es de aproximadamente 60 ms.Si el servicio RPC y el middleware de mensajes se implementan en la misma sala de computadoras, la demora es básicamente del nivel de ms.

5. Preguntas frecuentes

5.1 Descripción

Para experimentar el proceso completo, necesita el siguiente entorno:

  1. JDK1.6以上 + Maven+ RabbitMQ

5.2 Código fuente

Selle el código de código completo: github: https://github.com/chadwick521/rabbitmqdemo

El código del Servidor está en:

  1. rpc.RPCServer

Alrededor de 60 ms, si el servicio RPC y el middleware de mensajes se implementan en la misma sala de computadoras, la demora es básicamente del nivel de ms.

5. Preguntas frecuentes

5.1 Descripción

Para experimentar el proceso completo, necesita el siguiente entorno:

  1. JDK1.6以上 + Maven+ RabbitMQ

5.2 Código fuente

Selle el código de código completo: github: https://github.com/chadwick521/rabbitmqdemo

El código del Servidor está en:

  1. rpc.RPCServer

Supongo que te gusta

Origin blog.csdn.net/m0_65484000/article/details/122133420
Recomendado
Clasificación