SpringBoot整合RabbitMQ实现RPC远程调用功能

Springboot整合Netty实现RPC服务器 还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!ava开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**[外链图片转存中…(img-Av8lOV55-1713320457290)] 阅读详情

在这里插入图片描述

在分布式系统中,RPC(Remote Procedure Call)是一种常用的通信机制,它可以让不同的节点之间像调用本地函数一样进行函数调用,隐藏了底层的网络通信细节。通过本教程,你可以了解RPC的基本原理以及如何使用Java实现一个简单的RPC客户端和服务端。

1. 交互过程

  1. 启动 RPC 服务端和客户端,创建连接和通道。
  2. 声明请求队列和回复队列,确保使用相同的队列名称。
  3. 客户端发送请求:客户端将请求消息发送到指定的请求队列中。
  4. 服务端监听请求队列:服务端在指定的请求队列上监听请求消息。
  5. 服务端接收请求:服务端接收到客户端发送的请求消息。
  6. 服务端处理请求:服务端根据请求消息中的参数,执行相应的业务逻辑,并得到处理结果。
  7. 服务端发送响应:服务端将处理结果作为响应消息发送到客户端指定的回复队列中。
  8. 客户端监听响应队列:客户端在指定的回复队列上监听响应消息。
  9. 客户端接收响应:客户端接收到服务端发送的响应消息。
  10. 客户端处理响应:客户端根据响应消息中的结果进行相应的处理。

2. 导入依赖

创建一个SpringBoot项目并导入依赖坐标

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.10.RELEASE</version>
    <relativePath/>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.3.10.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
        <version>2.3.10.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>com.rabbitmq</groupId>
        <artifactId>amqp-client</artifactId>
        <version>5.12.0</version>
    </dependency>
</dependencies>

application.yml

spring:
  rabbitmq:
    host: localhost # 主机名
    port: 5672 # 端口
    username: guest # 用户名
    password: guest # 密码
    virtual-host: /
    template:
      receive-timeout: 2000
      reply-timeout: 2000
    listener:
      simple:
        concurrency: 1
        max-concurrency: 3
        prefetch: 1 # 消费者每次只能预取1条数据到内存并处理,默认为250条
        acknowledge-mode: manual # 确定机制 manual:手动确认
    publisher-returns: true
    publisher-confirm-type: correlated

注意:需要提前开启RabbitMQ服务,否则项目运行会报错

3. RPC 服务端

首先,我们来看一下RPC服务端的代码。

package com.rabbit.rpc;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeoutException;

/**
 * rpc服务端
 */
public class RPCServer {

    // 定义请求队列常量
    private final static String REQUEST_QUEUE_NAME = "rpc_queue";
    // 定义回复队列常量
    private final static String REPLY_QUEUE_NAME = "rpc_reply_queue";

    /**
     * 服务端启动入口
     */
    public static void main(String[] args) {
        // 创建连接
        ConnectionFactory factory = new ConnectionFactory();
        //factory.setHost("localhost");

        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {

            // 声明请求队列和回复队列
            channel.queueDeclare(REQUEST_QUEUE_NAME, false, false, false, null);
            channel.queueDeclare(REPLY_QUEUE_NAME, false, false, false, null);

            // 每次仅接收一条未经确认的消息
            channel.basicQos(1);

            // 构建消费者属性
            Consumer consumer = new DefaultConsumer(channel) {
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                    // 获取消息
                    String message = new String(body, StandardCharsets.UTF_8);

                    // 进行业务处理构建响应数据 (这里做字符串拼接模拟响应数据)
                    String response = message + ":::";

                    // 构造响应基本属性
                    AMQP.BasicProperties replyProps = new AMQP.BasicProperties.Builder()
                            .correlationId(properties.getCorrelationId())   // 设置关联id
                            .build();

                    // 发送响应数据到回复队列 (rpc_reply_queue)
                    channel.basicPublish("", properties.getReplyTo(), replyProps, response.getBytes(StandardCharsets.UTF_8));

                    // 手动回执消息确认消费
                    channel.basicAck(envelope.getDeliveryTag(), false);
                }
            };

            // 消费rpc_queue队列的消息
            channel.basicConsume(REQUEST_QUEUE_NAME, false, consumer);

            // 持续监听请求消息
            while (true) {
                Thread.sleep(50);
            }
        } catch (IOException | TimeoutException | InterruptedException e) {
            e.printStackTrace();
        }
    }

}

在RPC服务端的代码中,我们首先创建了一个连接和一个通道,然后声明了请求队列和回复队列。我们设置每一次只接收一条未确认的消息,并创建了一个消费者对象,用于处理接收到的消息。

在handleDelivery方法中,我们从消息中获取请求数据,并进行业务处理,然后构造响应数据并发送到回复队列。最后,我们手动确认消费,并继续监听请求消息。

4. RPC 客户端

接下来,我们看一下RPC客户端的代码。

package com.rabbit.rpc;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.UUID;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeoutException;

/**
 * rpc客户端
 */
public class RPCClient {

    // 定义请求队列常量
    private final static String REQUEST_QUEUE_NAME = "rpc_queue";
    // 定义回复队列常量
    private final static String REPLY_QUEUE_NAME = "rpc_reply_queue";

    /**
     * 客户端启动入口
     */
    public static void main(String[] args) {
        System.out.println("Response1: " + call("Hello, RPC Server1"));
        System.out.println("Response2: " + call("Hello, RPC Server2"));
        System.out.println("Response3: " + call("Hello, RPC Server3"));
    }

    /**
     * 发送请求到队列并返回响应数据
     *
     * @param message 请求消息
     * @return 响应数据
     */
    public static String call(String message) {
        // 创建连接
        ConnectionFactory factory = new ConnectionFactory();
        //factory.setHost("localhost");

        String result = "";

        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {

            // 声明请求队列和回复队列
            channel.queueDeclare(REQUEST_QUEUE_NAME, false, false, false, null);
            channel.queueDeclare(REPLY_QUEUE_NAME, false, false, false, null);

            // 每次仅接收一条未经确认的消息
            channel.basicQos(1);

            // 生成关联id
            String correlationId = UUID.randomUUID().toString();

            // 构造请求基本属性
            AMQP.BasicProperties props = new AMQP.BasicProperties.Builder()
                    .correlationId(correlationId)   // 设置关联id
                    .replyTo(REPLY_QUEUE_NAME)      // 设置回复队列 (rpc_reply_queue)
                    .build();

            // 发送请求消息到rpc_queue队列
            channel.basicPublish("", REQUEST_QUEUE_NAME, props, message.getBytes(StandardCharsets.UTF_8));

            // 用于保存响应消息的阻塞队列
            final BlockingQueue<String> response = new ArrayBlockingQueue<>(1);

            // 监听回复队列接收响应消息
            String consumerTag = channel.basicConsume(REPLY_QUEUE_NAME, true, new DefaultConsumer(channel) {
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) {
                    // 通过关联id获取到响应数据
                    if (properties.getCorrelationId().equals(correlationId)) {
                        response.offer(new String(body, StandardCharsets.UTF_8));
                    }
                }
            });

            // 清空阻塞队列
            response.clear();

            // 等待接收响应消息
            result = response.take();

            // 取消消费者的监听
            channel.basicCancel(consumerTag);

        } catch (IOException | TimeoutException | InterruptedException e) {
            e.printStackTrace();
        }

        return result;
    }

}

在RPC客户端的代码中,我们同样创建了一个连接和一个通信,并声明了请求队列和回复队列。然后,我们设置每次只接收一条未确认的消息,并创建了一个唯一的关联id。

在call方法中,我们构建了请求消息的基础属性,并将请求消息发送到请求队列。接下来,我们创建了一个阻塞队列,用于保存response响应消息。

通过监听回复队列接收响应消息,并通过关联id接收到对应的响应数据,然后将其放入response队列中。最后,通过阻塞队列接收响应消息,并返回响应数据。

5. 运行代码

现在,我们可以运行RPC服务端和客户端的代码了。首先运行服务端代码,它会启动一个监听请求的进程。然后,运行客户端代码,它会发送请求消息并等待接收响应消息。

最终会看到客户端发出了三次请求,并打印了对应的响应数据。
在这里插入图片描述
项目地址:项目Git地址
在这里插入图片描述

springboot+rabbitMQ实现RPC远程调用 如题,我们要使用Spring Boot和RabbitMQ实现RPC远程调用,那么首先要了解RPC。RPC,即Remote Procedure Call Protocol 远程过程调用协议,在大型的公司,系统一般都是由大大小小的服务构成,不同的团队维护不同的代码,部署在不同的机器。但是在做开发时候往往要用到其它团队的方法,因为已经有了实现。但是这些服务部署不同的机器上,想要调用就需要网络通信,这... 阅读详情

相关推荐

Springboot+rabbitmq如何实现高并发的rpc调用

2019年5月最新更新:注意!并不推荐RPC式的mq调用,这么做完全没有发挥mq异步削峰的作用。之所以会有这篇文章完全是因为架构无法更改。 RPC式的mq调用,会使调用端的线程一直阻塞,中间还过了一层mq。虽然仍旧是rpc式的通信,但是效果还不如dubbo,建议需要同步的业务直接使用dubbo。 2018年8月: 一.背景 公司项目的收单前置服务A与收单服务B之间是通过ra...

优快云OFZHC的博客 1万+

实现RPC的基本方法与步骤(SpringBoot)

笔者从入门Java后端至今,一直都在做笔记(电子笔记),但是始终没有动手写博客。如今笔者即将毕业,现阶段正处于实习期,虽然有了一定的Java后端基础,但仍然需快速的学习。本次起笔写博客,是想从此刻开始,对自己学到的东西进行纪录,以便日后遇到类似的问题时,能够方便快捷的解掉。一、实现RPC的思路。

m0_52218259的博客 2373

Springboot整合RabbitMQ(六):远程过程调用(RPC)

在第二篇教程中我们介绍了如何使用工作队列(work queue)在多个工作者(woker)中间分发耗时的任务。 可是如果我们需要将一个函数运行在远程计算机上并且等待从那儿获取结果时,该怎么办呢?这就是另外的故事了。这种模式通常被称为远程过程调用(Remote Procedure Call)或者 RPC。 这篇教程中,我们会使用 RabbitMQ 来构建一个 RPC 系统:包含一个客户端和一个 RP...

weixin_45821812的博客 1042

SpringBoot--什么是RPC

1. SpringBoot--什么是RPC RPC两个核心模块:通讯,序列化。 1.1 什么是RPC RPC【Remote Procedure Call】是指远程过程调用,是一种进程间通信方式,他 是一种技术的思想,而不是规范。它允许程序调用另一个地址空间(通常是共享网络 的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程 序员无论是调用本地的还是远程的函数,本质上编写的调用代码基本相同。 也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供 的函数/方

天行健 君子以自强不息,地势坤 君子以厚德载物。 2355

【项目实战】Spring Boot工程整合Dubbo框架,实现RPC远程调用

【项目实战】Springboot 整合Dubbo, 项目中引入Dubbo实现远程调用

奶爸的编程之路,也就一周冷个三天 2364

springboot | Rabbitmq 实现RPC方式 远程同步调用

RabbitMQ是一个开源的消息代理软件,它实现了高级消息队列协议(AMQP),用于在应用程序之间进行异步通信和消息传递。RabbitMQ提供了可靠的消息传递机制,具有高吞吐量、低延迟和可扩展性等特点,被广泛应用于分布式系统、微服务架构和消息驱动的应用程序中。

洛阳泰山的博客 2324

SpringBoot中使用RabbitMQ的RPC功能

一、RabbitMQ的RPC简介 实际业务中,有的时候我们还需要等待消费者返回结果给我们,或者是说我们需要消费者上的一个功能、一个方法或是一个接口返回给我们相应的值,而往往大型的系统软件,生产者跟消费者之间都是相互独立的两个系统,部署在两个不同的电脑上,不能通过直接对象.方法的形式获取想要的结果,这时候我们就需要用到RPC(Remote Procedure Call)远程过程调用方式。 Rabbi...

小帅的博客 4805

用Matlab系统辨识工具箱搞定温控系统建模:从阶跃响应到传递函数(附完整代码)

本文详细介绍了如何使用Matlab系统辨识工具箱进行温控系统建模,从阶跃响应数据采集到传递函数参数辨识的全过程。通过实际案例和完整代码,帮助工程师快速掌握PID控制参数整定技巧,提升温控系统设计效率。特别适合单片机开发者和自动化控制工程师参考。

weixin_30736301的博客 309

SpringBoot+RabbitMQ 实现 RPC 调用

说到 RPC(Remote Procedure Call Protocol 远程过程调用协议),小伙伴们脑海里蹦出的估计都是 RESTful API、Dubbo、WebService、Java RMI、CORBA 等。 其实,RabbitMQ 也给我们提供了 RPC 功能,并且使用起来很简单。 今天松哥通过一个简单的案例来和大家分享一下 Spring Boot+RabbitMQ 如何实现一个简单的 RPC 调用。 注意 关于 RabbitMQ 实现 RPC 调用,有的小伙伴可能会有一些误解,心想这还不简单?

江南一点雨的专栏 4904

处理SAP资产折旧AFAB 过账报错:“科目 8019010100 要求一个成本会计分配”

本文介绍如何处理资产折旧报错 ““科目XXXXXXX 要求一个成本会计分配””

IT小职员 2775

Windows 10下三菱PLC控件安装报错Error Number:-119的终极解决方案(附详细步骤)

本文针对Windows 10系统安装三菱PLC控件时常见的Error Number:-119报错,提供了深度分析与终极解决方案。文章剖析了该错误源于oleaut32.dll文件版本冲突,并详细介绍了通过设置兼容性模式、手动注册DLL、直接安装MX Component以及高级系统修复等多种方法,帮助用户彻底解决此安装难题,顺利搭建PLC开发环境。

weixin_29289821的博客 332

RabbitMQ 基本api使用 以及和spring、springboot整合

1 RabbitMQ介绍 1.1 RabbitMQ简介及使用场景 MQ全称为Message Queue,即消息队列, RabbitMQ是由erlang语言开发,基于AMQP(Advanced MessageQueue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。RabbitMQ官网 消息队列应用场景: 任务异步处理。 将不需要同...

qqxhb 资源共享 2449

2080Ti双卡开启NVLink

本文介绍了如何在Ubuntu 22.04系统下给2080Ti双卡开启NVLink的方法。

flymyd的博客 2900

springboot整合rpc远程调用_springboot-mqrpc

#springboot-mqrpc欢迎加入开源技术QQ群一起交流:613025121通过spring +RabbitMQ+hessian的Rpc远程调用来理解RPC调用原理1.对Rpc的简单阐述对RPC通俗的理解就是,调用远程服务和调用本地服务一样透明化无感知。使用过dubbo和motan的同学肯定有这种感觉。实现RPC调用过程,无非解决两个问题:1.数据的传输:这里使用RabbitMQ来收发消息...

weixin_39982933的博客 243

UE5 C++教程(一、基本结构)

虚幻API由三块组成,分别是Runtime,Developer utilitiew,functionality for the Editor,大多数游戏性编程只使用运行时模块,最常见的三个是Corn、CornUObject和Engine。

skycol的博客 1万+

6.5 构网型储能系统的协同控制策略

本文系统阐述了构网型储能系统的协同控制策略,重点分析了多机组群协同运行面临的功率分配不均、动态响应失配等挑战。研究提出了改进型下垂控制与虚拟阻抗法、基于一致性算法的分布式协同控制等解决方案,探讨了构网型储能与同步发电机在惯性响应、一次调频等方面的协同机制,以及与跟网型电源在电压支撑、阻抗重塑等方面的互补作用。文章构建了分层控制架构,为实现多类型电源的全局优化运行提供了技术路径,对提升高比例新能源电力系统的稳定性具有重要意义。

技术工作者 1002

SpringBoot整合RabbitMQ 实现五种消息模型 详细教程

今天说下了消息队列中间件,各种队列性能对比,RabbitMQ队列,交换机(Exchange)以及消息 中间件的应用场景,然后带着大家一起实现RabbitMQ的五种消息模型。 消息队列中间件 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题实现高性能,高可用,可伸缩和终一致性[架构] 使用较多的消息队列有 ActiveMQ,RabbitMQ,ZeroMQ,K...

小宋的博客 8914

基于DINO自监督学习对YOLO11 Backbone进行预训练

这PoolHead将获取前一层的输出并应用卷积,然后应用自适应平均池化以将特征图的空间维度减小为固定且一致的大小(1x1)。这是必需的,因为否则空间维度会根据输入的大小而变化,这将使将 DINO 头部附加到主干变得困难,因为它需要固定的输入大小。在本指南中,我们将介绍如何使用 Lightly 使用 DINO 预训练 YOLO 11主干,以及如何将其重新加载到 Ultralytics 中进行微调。您可以使用不同的大小,例如,640这与 YOLO 中的默认图像大小更一致,但它也会在训练期间消耗更多 VRAM。

如果想成为中心,那么就到中心去吧。 1014

springboot整合rabbitmq的五种模式示例

springboot整合rabbitmq RabbitMQ提供了6种消息模型,但是第6种其实是RPC,并不是MQ,因此不予学习。那么也就剩下5种。 1.基本消息模型:生产者–>队列–>一个消费者 2.work消息模型:生产者–>队列–>多个消费者共同消费 3.订阅模型-Fanout:广播,将消息交给所有绑定到交换机的队列,每个消费者都可以收到同一条消息 4.订阅模型-Di...

not only a 程序员的博客 8306

xilinx原语及bank简介

图8是HP bank与HR bank的IO模块,其中PAD是FPGA的金属管脚,IOB是输入、输出引脚的控制模块。此时使用原语就可以只调用需要的组件,不需要去考虑其余组件参数设置,就方便很多,借助此次机会就对IDDR、ODDR、IDELAYE2、ODELAYE2、IDELAYCRTL、ISERDESE、OSERDESE等几个原语做了简要了解,并对原语的各个模式进行了仿真,本文最初是介绍IDDR的,但在介绍IDDR这些原语之前,还需要了解一下7系列FPGA bank的分类和区别,所以就有了本文。

qq_43416206的博客 413

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

SpringBoot中使用RabbitMQ(三) RPC

RPC是什么? Remote Procedure Call:远程过程调用,一次远程过程调用的流程即客户端发送一个请求到服务端,服务端根据请求信息进行处理后返回响应信息,客户端收到响应信息后结束。 RabbitMQ 使用RPC 发送消息后会收到回复 同步阻塞(在一条消息接受到回复前不能发送其他消息) 异步(可以不用等待回复,继续发送别的消息) 同步实例 下文使用的队列和交换器在SpringBoo...

weixin_34383618的博客 1913

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

springboot 整合 rabbitmq

rabbitmq的了解和使用

静心123的博客 1605

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

SpringBoot整合RabbitMQ实现六种工作模式

整合SpringBoot实现RabbitMQ六种工作模式,并详细讲解RabbitMQ简单模式无需创建交换机,匹配生产端和消费的routingKey即可。工作模式多个消费端公平竞争同一个消息。发布订阅模式一次向多个消费者发送消息。路由模式根据特定的路由键转发消息。主题模式根据通配符,匹配路由键转发消息。RPC模式生产端接收消费端发送的返回值。...

JavaShark的博客 1001

SpringBoot整合RabbitMQ(AmqpAdmin)

文章目录SpringBoot中使用RabbitMQ1 环境2 hello world 模型3 WorkQueues4 Publish/Subscribe5. Routing模式6 Topic动态路由(通配符)AmqpAdmin-RabbitMQ组件管理 SpringBoot中使用RabbitMQ RabbitMQ总共6种模型“Hello World!”、Work Queues、Publish/Subscribe、Routing、Topics、RPC 通过@RabbitListener来对队列进行监听,@En

ccccrj博客 1320

SpringBoot整合RabbitMQ详解

rabbitMQ的简单记录

m0_57249797的博客 598
上一篇: 一文看懂gRPC远程调用框架
下一篇: 解决异步任务中访问ThreadLocal报错的方案及实现
霁晨晨晨
博客等级 码龄4年 359粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

霁晨晨晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值