`
情情说
  • 浏览: 37550 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

RabbitMQ实战:运行和管理RabbitMQ

阅读更多

 

本系列是「RabbitMQ实战:高效部署分布式消息队列」书籍的总结笔记。

关注我的微信公众号:情情说,查看更多文章 ~

上一篇介绍了AMQP消息通信,包括队列、交换器和绑定,通过虚拟主机还可以隔离数据和权限,消息持久化和发送方确认模式确保了消息不丢失。

本篇主要介绍如何运行和管理RabbitMQ,在介绍之前,会有个DEMO演示消息发送和接收,一方面对AMQP的元素有更直观的认识,一方面为后面介绍监控做数据来源。

通过介绍,你会了解到:

  • 消息发送和接收简单实现
  • 服务器管理-启动和停止节点
  • 权限配置
  • 使用统计

消息发送和接收简单实现

该Demo主要用于收集日志,消息发送者是各个应用子系统,消息接收者是日志收集服务,使用RabbitMQ可以很容易实现。

基于Spring Boot框架实现,主要类的作用如下:

  • LogRabbitConfig:创建队列、交换器、绑定等初始化操作;
  • Sender:消息发送者;
  • AllReceiver:所有级别日志接收者,接收所有级别的日志;
  • ErrorReceiver:错误级别日志接受者,只接收错误级别的日志;
  • LogSenderTest:测试用例类;

消息模型如下:
Demo的消息模型

配置

首先,配置spring boot和rabbitmq依赖:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
    <relativePath/>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <!--rabbitmq依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
</dependencies>

然后在application.properties文件中配置rabbitmq地址:

spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.publisher-confirms=true
spring.rabbitmq.virtual-host=/
LogRabbitConfig实现

使用Spring的@Configuration定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,用于构建bean定义,初始化Spring容器。

@Configuration
public class LogRabbitConfig {
    final static String QUEUE_LOG_ERROR = "log.error";
    final static String QUEUE_LOG_ALL = "log.all";

    //创建log.error队列
    @Bean
    public Queue logError() {
        return new Queue(QUEUE_LOG_ERROR);
    }
    //创建log.all队列
    @Bean
    public Queue logAll() {
        return new Queue(QUEUE_LOG_ALL);
    }
    //创建exchange,命名为log
    @Bean
    TopicExchange exchange() {
        return new TopicExchange("log");
    }
    //绑定log.error队列到exchange,routingkey为log.error
    @Bean
    Binding bindingExchangeError(Queue logError, TopicExchange exchange) {
        return BindingBuilder.bind(logError).to(exchange).with("log.error");
    }
    //绑定log.all队列到exchange,routingkey为log.#
    @Bean
    Binding bindingExchangeAll(Queue logAll, TopicExchange exchange) {
        return BindingBuilder.bind(logAll).to(exchange).with("log.#");
    }
}
Sender实现

各个子系统向rabbitmq服务器发送消息:

@Component
public class Sender {
    @Autowired
    private AmqpTemplate rabbitTemplate;

    public void send() {
        //向mq服务端发送消息,exchange为log,routingkey为log.error
        String context = "error log";
        this.rabbitTemplate.convertAndSend("log", "log.error", context);

        //向mq服务端发送消息,exchange为log,routingkey为log.info
        context = "info log";
        System.out.println("send msg : " + context);
        this.rabbitTemplate.convertAndSend("log", "log.info", context);

        //向mq服务端发送消息,exchange为log,routingkey为log.warn
        context = "warn log";
        System.out.println("send msg : " + context);
        this.rabbitTemplate.convertAndSend("log", "log.warn", context);
    }

}
AllReceiver和ErrorReceiver实现

从rabbitmq服务器接收消息。

AllReceiver从服务器的log.all队列获取消息,因为它绑定的routingkey为”log.#”,所以,会收到所有级别的日志:

@Component
@RabbitListener(queues = "log.all")
public class AllReceiver {
    @RabbitHandler
    public void process(String context) {
        System.out.println("receive log : " + context);
    }
}

ErrorReceiver从服务器的log.error队列获取消息,因为它绑定的routingkey为”log.error”,所以,只会收到error级别的日志:

@Component
@RabbitListener(queues = "log.error")
public class ErrorReceiver {
    @RabbitHandler
    public void process(String context) {
        System.out.println("receive error : " + context);
    }
}
LogSenderTest测试用例

测试用例很简单,就是调用Sender发送消息,观察消息的接收情况。

@RunWith(SpringRunner.class)
@SpringBootTest
@SpringBootApplication
public class LogSenderTest {
    @Autowired
    Sender sender;

    @Test
    public void sendLog() {
        sender.send();
    }
}

运行日志如下:
运行日志

可以看到,error收到了2次,说明exchange同时分发给了log.all和log.error队列,其他级别的日志分发给了log.all队列。

服务器管理-启动和停止节点

RabbitMQ是用Erlang编写的,Erlang天生就能让应用程序无需知道对方是否在同一台机器上即可相互通信,这让集群和可靠的消息路由变得简单。

理解节点和Erlang应用程序

和Java有JVM虚拟机类似,Erlang也有虚拟机,虚拟机的每个实例称之为「节点」,不同的是,多个Erlang应用程序可以运行在同一个节点之上,如果应用程序崩溃了,Erlang节点会自动尝试自动重启应用程序。

节点的操作:

  • 后台启动节点:./rabbitmq-server -detached
  • 停止节点:./rabbitmqctl stop
  • 仅停止rabbit应用程序:./rabbitmqctl stop_app
配置文件

配置文件的格式本质上是原始的Erlang数据结构,是一个包含了嵌套哈希表的数组,如下:

[
    [mnesia , [{dump_log_write_threshold , 1000}]],
    [rabbit , [{vm_memory_high_wateremark , 0.4}]]
]

上面配置了2个应用,每个应用会有自己的哈希表来配置选项:

  • mnesia:是rabbitmq用来存储交换器和队列元数据的;
  • rabbit:是rabbitmq特定的配置选项;

每个应用如果有多个选项,用逗号隔开。

权限配置

RabbitMQ权限系统中,单个用户可以跨越多个vhost进行授权,而且可以对读、写、配置分别授权。

首先创建一个用户dongqingqing,密码为123456:

./rabbitmqctl add_user dongqingqing 123456

授予dongqingqing用户权限,可以读取所有队列和交换器,只可写log.*格式的队列和交换器,无法创建或删除队列和交换器

./rabbitmqctl set_permissions  dongqingqing ".*" "log.*" ""

set_permissions 后面的参数分别为用户名、读权限、写权限、配置权限。

其他详细用法可查看文档。

使用统计

查看数据统计

可通过rabbitmqctl命令查看数据统计信息,比如队列和消息数目、交换器和绑定等。

查看所有队列,包含上面demo定义的log.all和log.error:
查看所有队列

查看所有交换器,包含上面demo定义的log
查看所有交换器

另外,rabbitmq提供了管理界面插件,更方便的查看各种统计,可以通过下面的命令开启:

sudo ./rabbitmq-plugins enable rabbitmq_management

rabbitmq_management插件

查看日志

可以在文件系统中查看日志,启动rabbitmq后,会显示日志的路径:
rabbitmq日志路径

另外,可以通过AMQP获取实时日志信息,有一个amq.rabbitmq.log的topic交换器,监听对应的队列即可。

下一篇将介绍消息通信模式和最佳实践,感谢大家持续关注。

欢迎扫描下方二维码,关注我的个人微信公众号 ~

情情说

 

 

1
0
分享到:
评论

相关推荐

    RabbitMQ【高效部署分布式消息队列.实战】.rar

    实战】本书对RabbitMQ做了全面、翔实的讲解,体现了两位专家的真知灼见。本书首先介绍了有关MQ的历史,然后从基本的消息通信原理讲起,带领读者一路探索RabbitMQ的消息通信世界。这当中不仅包含了针对单台RabbitMQ...

    springboot+mybatis+shiro+rabbitmq+redis项目实战,自动生成dao,service,controler层代码

    1. 用到技术:springboot+mybatis+shiro+rabbitmq+redis项目实战, 2. mybatisplus根据表自动生成dao,service,controler层的增删改成方法,极大提升开发效率 3. 包含功能:登录,用户管理,角色管理,菜单管理。用到...

    基于Springboot+Mybatis+Redis+MySql+RabbitMq的校园医疗管理系统.zip

    1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合...

    RabbitMq从入门到精通

    本课程深入浅出带领大家从头开始学习rabbitMq,利用实战的方式进行演示教学,是大家能够详细的了解并熟练使用rabbitMq。

    springboot 自动生成代码.zip

    2. 用到技术:springboot+mybatis+shiro+rabbitmq+redis项目实战, 3. 包含功能:登录,用户管理,角色管理,菜单管理。用到插件:插件:lombok,finbugs,p3c等 4. 项目有源代码,有数据库脚本,可快速部署运行 5...

    轻量级Java EE企业应用实战(第3版):Struts 2+Spring 3+Hibernate整合开发

    原书200多M,放到了百度网盘里。直接下载就行。 本书是《轻量级JavaEE企业应用实战》的第3版,第3版保持了第2...本书还全面介绍了Servlet3.0的新特性,以及Tomcat 7.0的配置和用法,本书的示例应该在Tomcat7.0上运行。

    用python+redis+rabbitmq搭建一个简单的秒杀系统.zip

    Python使用技巧,实战应用开发小系统参考资料,源码参考。经测试可运行。 详细介绍了一些Python框架的各种功能和模块,以及如何使用Python进行GUI开发、网络编程和跨平台应用开发等。 适用于初学者和有经验的开发者...

    亿级流量电商详情页系统实战-缓存架构+高可用服务架构+微服务架构

    课程中,将会讲解完整的微服务架构,包括基于Spring Cloud作为微服务架构的基础技术架构,基于DevOps思想与Jenkins构建持续交付流水线以及自动化测试套件,基于Docker作为容器部署和运行微服务。同时最有价值的地方...

    .Net最流行的开源企业服务总线 NServiceBus.zip

    3、工作流和后台任务调度通过Saga来完成长时间运行的流程定义和管理功能,提供强大而灵活的工作流功能。4、消息的集中审核流程很容易将整个分布式系统聚集到一个中心位置配置消息审核。5、通过发布/订阅来减少耦合...

    基于Java+多种缓存、异步下单+实现了口隐藏、验证码等功能的校园票务系统完整源码+说明(购买讲座、演出等票务).zip

    1、该资源内项目代码都是经过测试运行成功,功能正常的情况下才上传的,请放心下载使用。 2、适用人群:主要针对计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、数学、电子信息等...

    python入门到高级全栈工程师培训 第3期 附课件代码

    11 函数闭包装饰器运行流程 12 函数闭包带参数装饰器 第21章 01 查询功能 02 修改功能 03 程序的解耦 04 module模块和包的介绍 05 模块的执行以及__name__ 06 关于模块的介绍 07 time时间模块 08 random模块 第22...

    java版商城源码下载-miaosha:秒杀项目学习

    其中,中间件主要包括:缓存中间件Redis、消息中间件RabbitMQ、统一协调调度中心中间件ZooKeeper、综合中间件Redisson等等,详细的技术列表可以参见下方“系统整体架构说明” (走过路过,千万要记得Fork和Star哦!!...

    java版商城源码下载-SpringBoot-SecondKill:分叉来自https://gitee.com/steadyjack/Spri

    其中,中间件主要包括:缓存中间件Redis、消息中间件RabbitMQ、统一协调调度中心中间件ZooKeeper、综合中间件Redisson等等,详细的技术列表可以参见下方“系统整体架构说明” (走过路过,千万要记得Fork和Star哦!!...

    java版商城源码下载-bootSecondKill:船二杀

    其中,中间件主要包括:缓存中间件Redis、消息中间件RabbitMQ、统一协调调度中心中间件ZooKeeper、综合中间件Redisson等等,详细的技术列表可以参见下方“系统整体架构说明” (走过路过,千万要记得Fork和Star哦!!...

    java版商城源码下载-SpringBoot-SecondKill:SpringBoot-SecondKill

    其中,中间件主要包括:缓存中间件Redis、消息中间件RabbitMQ、统一协调调度中心中间件ZooKeeper、综合中间件Redisson等等,详细的技术列表可以参见下方“系统整体架构说明” (走过路过,千万要记得Fork和Star哦!!...

    java版商城源码下载-LXR-Kill1:LXR-Kill1

    其中,中间件主要包括:缓存中间件Redis、消息中间件RabbitMQ、统一协调调度中心中间件ZooKeeper、综合中间件Redisson等等,详细的技术列表可以参见下方“系统整体架构说明” (走过路过,千万要记得Fork和Star哦!!...

    spring-boot-demo_xkcoding.tar.gz

    plus(快速操作Mybatis)、BeetlSQL(强大的ORM框架)、upload(本地文件上传和七牛云文件上传)、redis(缓存)、ehcache(缓存)、email(发送各种类型邮件)、task(基础定时任务)、quartz(动态管理定时任务)、xxl-job(分布式...

    spring boot集成demo大全.zip

    job(`分布式定时任务`)、swagger(`API接口管理测试`)、security(`基于RBAC的动态权限认证`)、SpringSession(`Session共享`)、Zookeeper(`结合AOP实现分布式锁`)、RabbitMQ(`消息队列`)、Kafka(`消息队列`)、...

    Eclipse开发分布式商城系统+完整视频代码及文档

    │ 16-tomcat的3种运行模式和执行器(线程池).avi │ 17-tomcat中连接器.avi │ 18-禁用AJP连接器.avi │ 19-tomcat中JVM参数优化.avi │ ├─补充2:Redis3.0新特性、主从复制、集群视频教程 │ │ 打开必读.txt ...

Global site tag (gtag.js) - Google Analytics