美文网首页
RabbitMQ实现RPC调用

RabbitMQ实现RPC调用

作者: 砒霜拌辣椒 | 来源:发表于2020-09-25 22:42 被阅读0次

    Remote Procedure Call:远程过程调用,一次远程过程调用的流程即客户端发送一个请求到服务端,服务端根据请求信息进行处理后返回响应信息,客户端收到响应信息后结束。

    RPC

    这里生产者作为客户端来调用,消费者作为服务端接收请求然后响应给生产者。

    1、同步调用

    1.1、绑定队列

    @Configuration
    public class RPCRabbitConfig {
        @Bean
        public Queue RPCQueue() {
            return new Queue("RPCQueue", true, false, false);
        }
    
        @Bean
        public DirectExchange RPCExchange() {
            return new DirectExchange("RPCExchange", true, false);
        }
    
        @Bean
        public Binding bindingRPC() {
            return BindingBuilder.bind(RPCQueue()).to(RPCExchange()).with("RPC");
        }
    }
    

    1.2、消费者(服务端)

    @Component
    @RabbitListener(queues = "RPCQueue")
    @Slf4j
    public class RPCReceiver {
        @RabbitHandler
        public String process(String message) {
            log.info("接收远程调用请求消息:[{}]", message);
            return "remote procedure call success!";
        }
    }
    

    1.3、生产者(客户端)

    @RestController
    @Slf4j
    public class RPCController {
        @Autowired
        private RabbitTemplate rabbitTemplate;
    
        @PostConstruct
        public void init() {
            // 同步调用设置远程调用响应超时时间,单位:毫秒
            rabbitTemplate.setReplyTimeout(60000);
        }
    
        @PostMapping("/syncRPC")
        public String syncRPC() {
            Object response = rabbitTemplate.convertSendAndReceive("RPCExchange", "RPC", "RPC同步调用");
            String respMsg = response.toString();
            log.info("远程调用响应:[{}]", respMsg);
            return respMsg;
        }
    }
    

    可以通过setReplyTimeout(long milliseconds)函数设置超时时间。

    1.4、结果

    接收远程调用请求消息:[RPC同步调用]
    远程调用响应:[remote procedure call success!]
    

    2、异步调用

    2.1、配置Bean

    /**
     * 配置AsyncRabbitTemplate SpringBoot 没有默认的AsyncRabbitTemplate注入,所以这里需要自己配置
     *
     * @param rabbitTemplate
     * @return
     */
    @Bean
    public AsyncRabbitTemplate asyncRabbitTemplate(RabbitTemplate rabbitTemplate) {
        return new AsyncRabbitTemplate(rabbitTemplate);
    }
    

    2.2、生产者(客户端)

    @RestController
    @Slf4j
    public class RPCController {
        @Autowired
        private AsyncRabbitTemplate asyncRabbitTemplate;
    
        @PostMapping("/asyncRPC")
        public String asyncRPC() {
            AsyncRabbitTemplate.RabbitConverterFuture<Object> future = asyncRabbitTemplate.convertSendAndReceive("RPCExchange", "RPC", "RPC异步调用");
            future.addCallback(new ListenableFutureCallback<Object>() {
                @Override
                public void onFailure(Throwable throwable) {
                    log.error("异步调用失败", throwable);
                }
    
                @Override
                public void onSuccess(Object o) {
                    log.info("异步调用响应:[{}}", o.toString());
                }
            });
            return "ok";
        }
    }
    

    2.3、结果

    SimpleConsumer [queue=amq.rabbitmq.reply-to, consumerTag=amq.ctag-nHw71SucAmOUHb6hGVjaZA identity=5fbed23f] started
    接收远程调用请求消息:[RPC异步调用]
    异步调用响应:[remote procedure call success!}
    

    参考链接

    代码地址

    相关文章

      网友评论

          本文标题:RabbitMQ实现RPC调用

          本文链接:https://www.haomeiwen.com/subject/jyyquktx.html