springboot+cloud 学习(三)消息中间件 RibbitMQ+Stream
安装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包就可以使用其中的类:

消息提供者配置:
public interface MessageProviderSource {
// exchange名称
public static final String EXCHANGE_OUT = "exporttv_exchange_out";
// 绑定exchange
@Output(MessageProviderSource.EXCHANGE_OUT)
public MessageChannel messageOutput();
}
@EnableBinding(MessageProviderSource.class)
public class MessageProvider { @Autowired
private MessageProviderSource messageSource; public void sendApplicationLoadMessage(HashMap<String, Integer> map) {
// 创建并发送消息
messageSource.messageOutput().send(message(map));
} private static final <T> Message<T> message(T val) {
return MessageBuilder.withPayload(val).build();
}
}
消息消费者配置:
public interface MessageReceiveSource {
// exchange名称
public static final String EXCHANGE_IN = "exporttv_exchange_in";
// 绑定通道
@Input(MessageReceiveSource.EXCHANGE_IN)
public SubscribableChannel messageIutput();
}
@EnableBinding(MessageReceiveSource.class)
public class MessageReceive { @StreamListener(MessageReceiveSource.EXCHANGE_IN)
public void ApplicationLoadMessage(Message<HashMap<String,Integer>> message) { }
}
然后其他项目引入这个项目后,还要在yml中配置一下绑定:
消息提供者yml
spring:
cloud:
stream:
bindings: # 服务的整合处理
exporttv_exchange_out:
destination: exporttv_exchange # 绑定exchange
content-type: application/json # 设置消息类型
binder: exporttv-rabbitmq # 消息中间件
binders:
exporttv-rabbitmq:
type: rabbit
environment:
spring:
rabbitmq:
host: localhost
port:
username: guest
password: guest
virtual-host: /
消息消费者yml:
spring:
cloud:
stream:
bindings: # 服务的整合处理
exporttv_exchange_in:
destination: exporttv_exchange # 绑定exchange
content-type: application/json # 设置消息类型
group: exporttv-group # 进行操作的分组
binder: exporttv-rabbitmq # 消息中间件
binders:
exporttv-rabbitmq:
type: rabbit
environment:
spring:
rabbitmq:
host: localhost
port:
username: guest
password: guest
virtual-host: /
下面说说提供者和消费者怎么引用之前定义的类
消息提供者项目:

@Service
public class SendApplicationMessage { @Autowired
private MessageProvider messageProvider; public void SendApplicationLoadMessage() { try { // 业务功能省略 messageProvider.sendApplicationLoadMessage(); } catch (Exception e) {
// 打印错误日志
LogUtil.printLog(e, Exception.class);
// 抛出错误
throw new MyRuntimeException(ResultEnum.DBException);
}
} }
消息消费者子项目:

@Component
public class ReceiveApplicationMessage extends MessageReceive{ @Autowired
private ApplicationService applicationService; @Override
public void ApplicationLoadMessage(Message<HashMap<String,Integer>> message) { Integer toalYear = message.getPayload().get("year");
Integer toalMonth = message.getPayload().get("month");
Integer toalWeek = message.getPayload().get("week");
Integer toanId = message.getPayload().get("toanId"); applicationService.updateApplicationLoad(toalYear, toalMonth, toalWeek, toanId);
} }
个人觉得这样做不够好,后期再改进
springboot+cloud 学习(三)消息中间件 RibbitMQ+Stream的更多相关文章
- springboot+cloud 学习(五)统一配置中心 spring cloud config + cloud bus + WebHooks +RibbitMQ
前言 微服务要实现集中管理微服务配置.不同环境不同配置.运行期间也可动态调整.配置修改后可以自动更新的需求,Spring Cloud Config同时满足了以上要求.Spring Cloud Conf ...
- springboot+cloud 学习(四)Zuul整合Swagger2
前言 在微服务架构下,服务是分散的,怎么把所有服务接口整合到一起是我们需要关注的. 下面举例用zuul作为分布式系统的网关,同时使用swagger生成文档,想把整个系统的文档整合在同一个页面上来说明. ...
- springboot+cloud 学习(二)应用间通信Feign(伪RPC,实则HTTP)
在微服务中,使用什么协议来构建服务体系,一直是个热门话题. 争论的焦点集中在两个候选技术: RPC or Restful Restful架构是基于Http应用层协议的产物,RPC架构是基于TCP传输 ...
- springboot+cloud 学习(一)高可用服务注册中心(Eureka)
先说说Eureka Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的.SpringClo ...
- spring cloud学习(三)使用Ribbon实现客户端负载均衡
使用Ribbon实现客户端的负载均衡 * 个人博客空间 : https://zggdczfr.cn/ * Ribbon Spring Cloud Netflix Ribbon 是一个客户端负载均衡的组 ...
- springboot深入学习(三)-----docker
一.spring data思路 spring data使用统一的api来对各种数据库存储技术进行数据访问操作提供了支持,包括oracle.mysql.redis.mongoDB等等.主要是通过spri ...
- spring cloud学习(三) 断路器
在Spring Cloud中使用了Hystrix 来实现断路器的功能.Hystrix是Netflix开源的微服务框架套件之一,该框架目标在于通过控制那些访问远程系统.服务和第三方库的节点,从而对延迟和 ...
- Spring Cloud 学习 (三) Feign
新建 spring-cloud-eureka-feign-client Module pom <parent> <artifactId>spring-cloud-parent& ...
- springboot+cloud 学习(六)Docker
注:由于本人用的是window10系统,docker的版本是Docker Community Edition(Docker CE ). 什么是Docker 按官网的话说,Docker是一个世界领先的容 ...
随机推荐
- 让IE8支持html5中的video标签
这是一篇综合几个前辈的解决方案. 使用video的时候,要遇到的问题. ①不兼容ie9及其以下版本 在<head>里添加两行, 参考张鑫旭前辈的博客,但是在ie8中薄播放. <!-- ...
- 文件类File
文件类File继承结构: public class File extends Object implements Serializable, Comparable<File> 常用方法: ...
- 浅析软件工程中的UML建模技术
一.基本信息 标题:浅析软件工程中的UML建模技术 时间:2018 出版源:电子世界 领域分类:软件工程:UML建模技术:需求分析 二.研究背景 问题定义:软件工程中UML建模技术的研究 难点:明确软 ...
- Linux(以RHEL7为例)下添加工作区的方法|| The Way To Add Workspace On Linux
Linux(以RHEL7为例)下添加工作区的方法 The Way To Add Workspace On Linux 作者:钟凤山(子敬叔叔) 编写时间:2017年5月11日星期四 需求:有时候在使用 ...
- Codeforces828 B. Black Square
B. Black Square time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- 分享Pos函数(比FastPos还要快)
): Integer; ): Integer; 主要用途是搜索字符串中第n个Substr. 经过测试,这2个函数的速度比直接用Pos+Copy快好几倍(如果字符串够长,可能10几倍) 比Pos+Del ...
- maya2012卸载/安装失败/如何彻底卸载清除干净maya2012注册表和文件的方法
maya2012提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装maya2012失败提示maya2012安装未完成,某些产品无法安装,也有时候想重新安装maya ...
- 解决C#调用执行js报检索 COM 类工厂中 CLSID 为 {0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC} 组件失败
最近做了一个模拟请求的网站简化原网站的繁琐数据,提出有用的数据简单展示并完成post.由于原网站数据有js加密,所以我抓出原网站的js解密方法,由C#调用js得到解密后的数据. 整个抓包的框架是用的苏 ...
- 第二十四节:Java语言基础-讲解数组的综合应用
数组的综合应用 // 打印数组 public static void printArray(int[] arr) { for(int x=0;x<arr.length;x++) { if(x!= ...
- 前端自动化部署方案-实践(配合shell)
以下实例项目为vue项目,其他项目当然也雷同咯 在项目中建一个这个么脚本文件 不说了,上代码 #!/bin/sh handle=$1; env=$2; # 远程部署机 webhook # 如果用远程机 ...