zoukankan      html  css  js  c++  java
  • 【SpringBoot MQ系列教程】RabbitMq 初体验

    【SpringBoot MQ系列教程】RabbitMq 初体验

    mq 在异步解耦削峰的优势非常突出,现在很多的项目都会用到,掌握 mq 的知识点,了解如何顺畅的使用 mq,可以说是一个必备的职业技能点了

    接下来我们进入 rabbitmq 的学习过程

    I. 环境准备

    在测试之前,需要安装 rabbitmq,下面分别给出 mac + centos 的安装教程

    1. mac 安装

    安装命令

    brew install rabbitmq
    
    ## 进入安装目录
    cd /usr/local/Cellar/rabbitmq/3.7.5
    
    # 启动
    brew services start rabbitmq
    # 当前窗口启动
    rabbitmq-server
    

    启动控制台之前需要先开启插件

    ./rabbitmq-plugins enable rabbitmq_management
    

    进入控制台: http://localhost:15672/

    用户名和密码:guest,guest

    2. centos 安装

    安装命令

    yum install erlang
    wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.15/rabbitmq-server-3.6.15-1.el6.noarch.rpm
    yum install rabbitmq-server-3.6.15-1.el6.noarch.rpm
    

    插件开启

    rabbitmq-plugins enable rabbitmq_management
    # 启动
    rabbitmq-server -detached
    

    3. 配置

    添加账号,设置权限

    ## 添加账号
    ./rabbitmqctl add_user admin admin
    ## 添加访问权限
    ./rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
    ## 设置超级权限
    ./rabbitmqctl set_user_tags admin administrator
    

    4. 项目环境

    接下我们创建一个 SpringBoot 项目,用于简单的体验一下 rabbitmq 的发布和消费消息

    • springboot 版本为2.2.1.RELEASE
    • rabbitmq 版本为 3.7.5

    依赖配置文件 pom.xml

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
    
    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/libs-snapshot-local</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/libs-milestone-local</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>spring-releases</id>
            <name>Spring Releases</name>
            <url>https://repo.spring.io/libs-release-local</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
    

    application.yml配置文件中,添加 rabbitmq 的相关属性

    spring:
      rabbitmq:
        virtual-host: /
        username: admin
        password: admin
        port: 5672
    

    II. 实例演示

    接下来我们看一个hello world版本的 rabbitmq 的使用姿势,一个简单发布消息、消费消息

    1. 发布消息

    消息发布,我们主要借助AmqpTemplate来实现

    @Component
    public class PublishDemo {
        @Autowired
        private AmqpTemplate amqpTemplate;
    
        public String publish2mq(String ans) {
            String msg = "hello world = " + ans;
            System.out.println("publish: " + msg);
            amqpTemplate.convertAndSend(Pkg.exchange, Pkg.routing, msg);
            return msg;
        }
    }
    

    上面的 case 中,主要方法在于amqpTemplate#convertAndSend,第一个参数为 exchangeName, 第二个为 routingKey

    常量配置如下

    class Pkg {
        final static String exchange = "topic.e";
        final static String routing = "r";
        final static String queue = "topic.a";
    }
    

    2. 消费消息

    消费消息,需要指定 Queue,通过 routingKey 绑定 exchange,如下

    @Service
    public class ConsumerDemo {
    
        @RabbitListener(bindings = @QueueBinding(value = @Queue(value = Pkg.queue, durable = "false", autoDelete = "true"),
                exchange = @Exchange(value = Pkg.exchange, ignoreDeclarationExceptions = "true",
                        type = ExchangeTypes.TOPIC), key = Pkg.routing))
        public void consumer(String msg) {
            System.out.println("consumer msg: " + msg);
        }
    }
    

    3. 测试 demo

    写一个简单的 rest 接口,用于接收参数,发布消息到 mq,并被ConsumerDemo消费

    @RestController
    public class PubRest {
        @Autowired
        private PublishDemo publishDemo;
    
        @GetMapping(path = {"", "/", "/publish"})
        public String publish(String name) {
            return publishDemo.publish2mq(name);
        }
    }
    

    II. 其他

    0. 项目

    1. 一灰灰 Blog

    尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现 bug 或者有更好的建议,欢迎批评指正,不吝感激

    下面一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

    一灰灰blog

  • 相关阅读:
    Oracle EBS 配置文件取值
    “嗯...无法访问此页面 尝试此操作.....”的解决方法
    为什么在开发的微信小程序项目里写不上汉字?
    VM1238:2 pages/logs/logs.json 文件解析错误 SyntaxError: Unexpected token / in JSON at position 41....
    allparis工具的使用
    can't open 1.txt at releaseallpairs.pl line 368.
    element.style的样式问题解决方法
    常见的http状态码有哪些,代表什么意思?
    怎样快速修改文件名的后缀
    “该文件没有与之关联的应用来执行操作请安装应用若已安装应用程序请在默认应用设置...”
  • 原文地址:https://www.cnblogs.com/yihuihui/p/12292604.html
Copyright © 2011-2022 走看看