安装RabbitMQ

window下安装:

(1):下载erlang,原因在于RabbitMQ服务端代码是使用并发式语言erlang编写的,下载地址:http://www.erlang.org/downloads,双击.exe文件进行安装就好,安装完成之后创建一个名为ERLANG_HOME的环境变量,其值指向erlang的安装目录,同时将%ERLANG_HOME%\bin加入到Path中,最后打开命令行,输入erl,如果出现erlang的版本信息就表示erlang语言环境安装成功;

(2):下载RabbitMQ,下载地址:http://www.rabbitmq.com/,同样双击.exe进行安装就好。然后下载RabbitMQ 管理插件,可以更好的可视化方式查看Rabbit MQ 服务器实例的状态。
1.使用管理员打开命令窗口,进入安装目录sbin:
输入命令:rabbitmq-plugins.bat enable rabbitmq_management

2.安装成功后,重启服务器

输入命令:net stop RabbitMQ && net start RabbitMQ

3.用户及权限管理

使用rabbitmqctl控制台命令来创建用户,密码,绑定权限等。

查看已有用户及用户的角色:rabbitmqctl.bat list_users  默认会存在一个来宾账号 guest

新增一个用户:rabbitmqctl.bat add_user username password

新增成功后,可以看见新增的角色为[],guest的角色是administor。

rabbitmq用户角色可分为五类:超级管理员, 监控者, 策略制定者, 普通管理者以及其他

(1) 超级管理员(administrator)
可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。
(2) 监控者(monitoring)
可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等) 
(3) 策略制定者(policymaker)
可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。
(4) 普通管理者(management)
仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理。
(5) 其他的
无法登陆管理控制台,通常就是普通的生产者和消费者

下面给新增的用户来增加administrator角色

rabbitmqctl.bat set_user_tags username administrator

4.消息队列的管理

使用浏览器打开http://localhost:15672访问Rabbit Mq的管理控制台,使用刚才创建的账号登陆系统:

RibbitMQ的具体运用

结构原理:

spring cloud stream

Spring Cloud Stream 是一个构建消息驱动微服务的框架.

应用程序通过 inputs 或者 outputs 来与 Spring Cloud Stream 中binder 交互,通过我们配置来 binding ,而 Spring Cloud Stream 的 binder 负责与中间件交互。

Binder 是 Spring Cloud Stream 的一个抽象概念,是应用与消息中间件之间的粘合剂。

通过 binder ,可以很方便的连接中间件,可以动态的改变消息的destinations(对应于 Kafka 的topic,Rabbit MQ 的 exchanges)

,这些都可以通过外部配置项来做到。

新建一个stream项目,主要有3部分,消息产生者类(provider),消息消费者类(receive),stream input/output通道定义类(source)

由于是微服务框架,这里我把stream的有关定义都放到了这个项目集中定义,其他用到stream的项目直接引入这个项目的jar包就可以使用其中的类:

消息提供者配置:

  1. public interface MessageProviderSource {
  2.  
  3. // exchange名称
  4. public static final String EXCHANGE_OUT = "exporttv_exchange_out";
  5.  
  6. // 绑定exchange
  7. @Output(MessageProviderSource.EXCHANGE_OUT)
  8. public MessageChannel messageOutput();
  9.  
  10. }
  1. @EnableBinding(MessageProviderSource.class)
  2. public class MessageProvider {
  3.  
  4. @Autowired
  5. private MessageProviderSource messageSource;
  6.  
  7. public void sendApplicationLoadMessage(HashMap<String, Integer> map) {
  8. // 创建并发送消息
  9. messageSource.messageOutput().send(message(map));
  10. }
  11.  
  12. private static final <T> Message<T> message(T val) {
  13. return MessageBuilder.withPayload(val).build();
  14. }
  15. }

消息消费者配置:

  1. public interface MessageReceiveSource {
  2.  
  3. // exchange名称
  4. public static final String EXCHANGE_IN = "exporttv_exchange_in";
  5. // 绑定通道
  6. @Input(MessageReceiveSource.EXCHANGE_IN)
  7. public SubscribableChannel messageIutput();
  8. }
  1. @EnableBinding(MessageReceiveSource.class)
  2. public class MessageReceive {
  3.  
  4. @StreamListener(MessageReceiveSource.EXCHANGE_IN)
  5. public void ApplicationLoadMessage(Message<HashMap<String,Integer>> message) {
  6.  
  7. }
  8. }

然后其他项目引入这个项目后,还要在yml中配置一下绑定:

消息提供者yml

  1. spring:
  2. cloud:
  3. stream:
  4. bindings: # 服务的整合处理
  5. exporttv_exchange_out:
  6. destination: exporttv_exchange # 绑定exchange
  7. content-type: application/json # 设置消息类型
  8. binder: exporttv-rabbitmq # 消息中间件
  9. binders:
  10. exporttv-rabbitmq:
  11. type: rabbit
  12. environment:
  13. spring:
  14. rabbitmq:
  15. host: localhost
  16. port:
  17. username: guest
  18. password: guest
  19. virtual-host: /

消息消费者yml:

  1. spring:
  2. cloud:
  3. stream:
  4. bindings: # 服务的整合处理
  5. exporttv_exchange_in:
  6. destination: exporttv_exchange # 绑定exchange
  7. content-type: application/json # 设置消息类型
  8. group: exporttv-group # 进行操作的分组
  9. binder: exporttv-rabbitmq # 消息中间件
  10. binders:
  11. exporttv-rabbitmq:
  12. type: rabbit
  13. environment:
  14. spring:
  15. rabbitmq:
  16. host: localhost
  17. port:
  18. username: guest
  19. password: guest
  20. virtual-host: /

下面说说提供者和消费者怎么引用之前定义的类

消息提供者项目:

  1. @Service
  2. public class SendApplicationMessage {
  3.  
  4. @Autowired
  5. private MessageProvider messageProvider;
  6.  
  7. public void SendApplicationLoadMessage() {
  8.  
  9. try {
  10.  
  11. // 业务功能省略
  12.  
  13. messageProvider.sendApplicationLoadMessage();
  14.  
  15. } catch (Exception e) {
  16. // 打印错误日志
  17. LogUtil.printLog(e, Exception.class);
  18. // 抛出错误
  19. throw new MyRuntimeException(ResultEnum.DBException);
  20. }
  21. }
  22.  
  23. }

消息消费者子项目:

  1. @Component
  2. public class ReceiveApplicationMessage extends MessageReceive{
  3.  
  4. @Autowired
  5. private ApplicationService applicationService;
  6.  
  7. @Override
  8. public void ApplicationLoadMessage(Message<HashMap<String,Integer>> message) {
  9.  
  10. Integer toalYear = message.getPayload().get("year");
  11. Integer toalMonth = message.getPayload().get("month");
  12. Integer toalWeek = message.getPayload().get("week");
  13. Integer toanId = message.getPayload().get("toanId");
  14.  
  15. applicationService.updateApplicationLoad(toalYear, toalMonth, toalWeek, toanId);
  16. }
  17.  
  18. }

个人觉得这样做不够好,后期再改进

springboot+cloud 学习(三)消息中间件 RibbitMQ+Stream的更多相关文章

  1. springboot+cloud 学习(五)统一配置中心 spring cloud config + cloud bus + WebHooks +RibbitMQ

    前言 微服务要实现集中管理微服务配置.不同环境不同配置.运行期间也可动态调整.配置修改后可以自动更新的需求,Spring Cloud Config同时满足了以上要求.Spring Cloud Conf ...

  2. springboot+cloud 学习(四)Zuul整合Swagger2

    前言 在微服务架构下,服务是分散的,怎么把所有服务接口整合到一起是我们需要关注的. 下面举例用zuul作为分布式系统的网关,同时使用swagger生成文档,想把整个系统的文档整合在同一个页面上来说明. ...

  3. springboot+cloud 学习(二)应用间通信Feign(伪RPC,实则HTTP)

    在微服务中,使用什么协议来构建服务体系,一直是个热门话题. 争论的焦点集中在两个候选技术:  RPC or Restful Restful架构是基于Http应用层协议的产物,RPC架构是基于TCP传输 ...

  4. springboot+cloud 学习(一)高可用服务注册中心(Eureka)

    先说说Eureka Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的.SpringClo ...

  5. spring cloud学习(三)使用Ribbon实现客户端负载均衡

    使用Ribbon实现客户端的负载均衡 * 个人博客空间 : https://zggdczfr.cn/ * Ribbon Spring Cloud Netflix Ribbon 是一个客户端负载均衡的组 ...

  6. springboot深入学习(三)-----docker

    一.spring data思路 spring data使用统一的api来对各种数据库存储技术进行数据访问操作提供了支持,包括oracle.mysql.redis.mongoDB等等.主要是通过spri ...

  7. spring cloud学习(三) 断路器

    在Spring Cloud中使用了Hystrix 来实现断路器的功能.Hystrix是Netflix开源的微服务框架套件之一,该框架目标在于通过控制那些访问远程系统.服务和第三方库的节点,从而对延迟和 ...

  8. Spring Cloud 学习 (三) Feign

    新建 spring-cloud-eureka-feign-client Module pom <parent> <artifactId>spring-cloud-parent& ...

  9. springboot+cloud 学习(六)Docker

    注:由于本人用的是window10系统,docker的版本是Docker Community Edition(Docker CE ). 什么是Docker 按官网的话说,Docker是一个世界领先的容 ...

随机推荐

  1. 20172306《Java程序设计与数据结构》第一周总结

    20172306<Java程序设计>第一周学习总结 教材学习内容总结 本周主要学习<Android和Java>书中的第二十三章和第二十六章. 第二十三章:Android简介 A ...

  2. laravel config 配置无效

    修改了配置文件config  发现逻辑代码中并无生效. 猜测缓存,所以执行下: php artisan config:cache 缓存文件默认会存在bootstrap/cache 中,并不在stora ...

  3. solr7.7.0搜索引擎使用(三)(添加文件索引)

    众所周知,solr与es的最大区别是,solr可以对pdf,txt,doc等文件生成索引 那我们如何添加文件索引呢? 步骤1.添加core,取名暂且为 coreFile 在bin下执行命令 ./sol ...

  4. 别人的Linux私房菜(9)文件与文件系统的压缩

    www网站利用文件压缩技术进行数据传输,提升网络带宽. 压缩命令gzip与显示zcat.zmore.zless.zgrep -c将压缩的数据显示到屏幕上 -d解压缩 -v显示原文件/压缩文件的压缩比等 ...

  5. docer compose学习

    docker-compose 编排lnmp容器 https://gitee.com/lichenxin/docker-compose-mnpr version: '2' services: mysql ...

  6. ScriptOJ-unique#89

    一般做法 const unique = (arr) => { const result = arr.reduce((acc, iter) => { if(acc.indexOf(iter) ...

  7. Android-Java-抽象类

    定义抽象类,就一定会定义抽象方法,抽象方法没有方法体{},就证明抽象方法 是不运行的,抽象方法 是给子类继承覆盖运行的, 子类继承->抽象类 就必须覆盖抽象方法,否则编译都失败: 水果案例: 定 ...

  8. C#使用iTextSharp+ZXing.Net+FreeSpire.PDF生成和打印pdf文档

    项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.Net+FreeSpire.PDF三个类库实现了生成pdf.生成条形码和打印pdf功能. 首先在项 ...

  9. HYSBZ2565最长双回文串 Manacher

    顺序和逆序读起来完全一样的串叫做回文串.比如 acbca 是回文串,而 abc 不是( abc 的顺序为 “abc” ,逆序为 “cba” ,不相同). 输入长度为 n 的串 S ,求 S 的最长双回 ...

  10. electron 使用 node-ffi 调用 C++ 动态链接库(DLL)

    一.为什么需要使用DLL 需要使用系统 API 操作或扩展应用程序: 需要调用第三方的接口API,特别是与硬件设备进行通信,而这些接口 API 基本上都是通过 C++ 动态链接库(DLL)实现的: 需 ...