美文网首页
消息中间件RabbitMQ

消息中间件RabbitMQ

作者: 過眼云烟 | 来源:发表于2019-06-09 18:12 被阅读0次
RabbitMQ安装与启动(windows)

(1)下载并安装 Eralng
配套软件中已提供otp_win64_20.2.exe (以管理员身份运行安装)
(2)下载并安装rabbitmq
配套软件中已提供rabbitmq-server-3.7.4.exe。双击安装,注意不要安装在包含中文和
空格的目录下!安装后window服务中就存在rabbitMQ了,并且是启动状态。
(3)安装管理界面(插件)
进入rabbitMQ安装目录的sbin目录,输入命令

rabbitmq‐plugins enable rabbitmq_management

(4)重新启动服务
(5)打开浏览器,地址栏输入http://127.0.0.1:15672 ,即可看到管理界面的登陆页
输入用户名和密码,都为guest 进入主界面:
最上侧的导航以此是:概览、连接、信道、交换器、队列、用户管理

docker环境下的安装

(1)下载镜像:(此步省略)

docker pull rabbitmq:management
(2)创建容器,rabbitmq需要有映射以下端口: 5671 5672 4369 15671 15672
25672
15672 (if management plugin is enabled)
15671 management监听端口
5672, 5671 (AMQP 0-9-1 without and with TLS)
4369 (epmd) epmd 代表 Erlang 端口映射守护进程
25672 (Erlang distribution)
docker run ‐di ‐‐name=tensquare_rabbitmq ‐p 5671:5617 ‐p 5672:5672 ‐p
4369:4369 ‐p 15671:15671 ‐p 15672:15672 ‐p 25672:25672 rabbitmq:management
浏览器访问 http://192.168.184.134:15672/#/
直接模式(Direct)

将消息发给唯一一个节点时使用这种模式,这是最简单的一种形式.
任何发送到Direct Exchange的消息都会被转发到RouteKey中指定的Queue。
1.一般情况可以使用rabbitMQ自带的Exchange:”"(该Exchange的名字为空文称其为default Exchange)。
2.这种模式下不需要将Exchange进行任何绑定(binding)操作
3.消息传递时需要一个“RouteKey”,可以简单的理解为要发送到的队列名字4.如果vhost中不存在RouteKey中指定的队列名,则该消息会被抛弃。

创建队列

做下面的例子前,我们先建立一个叫itcast的队列。

1,Add new queue
2,name:输入itcast
3,Add queue

Durability:是否做持久化 Durable(持久) transient(临时)
Auto delete : 是否自动删除

代码实现-消息生产者

(1)创建工程rabbitmq_demo,引入amqp起步依赖 ,pom.xml如下:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐amqp</artifactId>
</dependency>

(2)编写配置文件application.yml

spring:
rabbitmq:
host: 192.168.184.134

(3) 编写测试类 用于生产队列

@RunWith(SpringRunner.class)
@SpringBootTest(classes=Application.class)
public class MqTest {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void testSend(){
rabbitTemplate.convertAndSend("itcast","我要红包");
}
}

代码实现-消息消费者

@Component
@RabbitListener(queues="itcast" )
public class Customer1 {
@RabbitHandler
public void showMessage(String message){
System.out.println("itcast接收到消息:"+message);
}
}

分列模式(Fanout)需要将消息一次发给多个队列时,需要使用这种模式。

任何发送到Fanout Exchange的消息都会被转发到与该Exchange绑定(Binding)的所有
Queue上。
1.可以理解为路由表的模式
2.这种模式不需要RouteKey
3.这种模式需要提前将Exchange与Queue进行绑定,一个Exchange可以绑定多个
Queue,一个Queue可以同多个Exchange进行绑定。
4.如果接受到消息的Exchange没有与任何Queue绑定,则消息会被抛弃。

交换器绑定队列

(1)在queue中添加队列itheima 和kudingyu
(2)新建交换器chuanzhi

Add a new exchange
name:chuanzhi
type:fanout
Add exchange

(3)将itcast 和itheima两个队列绑定到交换器chuanzhi
点击chuanzhi进入交换器管理界面
点击Bindings添加绑定 itheima和kudingyu

代码实现-消息生产者
@Test
public void testSendFanout(){
rabbitTemplate.convertAndSend("chuanzhi","", "分列模式走起");
}
代码实现-消息消费者

创建消息监听类,用于监听itheima的消息

@Component
@RabbitListener(queues="itheima" )
public class Customer2 {
@RabbitHandler
public void showMessage(String message){
System.out.println("itheima接收到消息:"+message);
}
}
创建消息监听类,用于监听kudingyu的消息
@Component
@RabbitListener(queues="kudingyu" )
public class Customer3 {
@RabbitHandler
public void showMessage(String message){
System.out.println("kudingyu接收到消息:"+message);
}
}
主题模式

任何发送到Topic Exchange的消息都会被转发到所有关心RouteKey中指定话题的Queue

1.这种模式较为复杂,简单来说,就是每个队列都有其关心的主题,所有的消息都带有一
个“标题”(RouteKey),Exchange会将消息转发到所有关注主题能与RouteKey模糊匹配的
队列。
2.这种模式需要RouteKey,也许要提前绑定Exchange与Queue。
3.在进行绑定时,要提供一个该队列关心的主题,如“#.log.#”表示该队列关心所有涉及
log的消息(一个RouteKey为”MQ.log.error”的消息会被转发到该队列)。
4.“#”表示0个或若干个关键字,“”表示一个关键字。如“log.”能与“log.warn”匹配,无法
与“log.warn.timeout”匹配;但是“log.#”能与上述两者匹配。
5.同样,如果Exchange没有发现能够与RouteKey匹配的Queue,则会抛弃此消息

创建队列与绑定

(1)新建一个交换器 ,类型选择topic
Add a new exchange
Name:topictest
Type:topic
Durability:Durable
Add exchange
(2)点击新建的交换器topictest
Add binding from this topictest
To queue : itcast
Routing key: goods.#
Bind(绑定)
添加匹配规则,添加列表后如下:
This exchange
To Routing key
itcast goods.#
itheima #.log
kudingyu goods.log

代码实现

编写测试类方法

@Test
public void testSendTopic1(){
rabbitTemplate.convertAndSend("topictest","goods.aaa","主题模式");
}

输出结果:itcast接收到消息:主题模式

@Test
public void testSendTopic2(){
rabbitTemplate.convertAndSend("topictest","article.content.log","主题模
式");
}

输出结果:itheima接收到消息:主题模式

@Test
public void testSendTopic3(){
rabbitTemplate.convertAndSend("topictest","goods.log","主题模式");
}

输出结果:
itheima接收到消息:主题模式
itcast接收到消息:主题模式
kudingyu接收到消息:主题模式

用户微服务-用户注册

(1)因为要用到缓存和消息队列,所以在用户微服务(tensquare_user)引入依赖
redis和amqp的起步依赖。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐data‐redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐amqp</artifactId>
</dependency>

(2)修改application.yml ,在spring 节点下添加配置

redis:
host: 192.168.184.134
rabbitmq:
host: 192.168.184.134

代码实现

(1)在UserService中新增方法,用于发送短信验证码

@Autowired
private RedisTemplate redisTemplate;
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* 发送短信验证码
* @param mobile 手机号
*/
public void sendSms(String mobile){
//1.生成6位短信验证码
//Random random=new Random();
//int max=999999;//最大数
//int min=100000;//最小数
//int code = random.nextInt(max);//随机生成
 //生成6位数字随机数  commons-lang3里的方法
        String checkcode = RandomStringUtils.randomNumeric(6);
if(code<min){
code=code+min;
}
System.out.println(mobile+"收到验证码是:"+code);
//2.将验证码放入redis
redisTemplate.opsForValue().set("smscode_"+mobile, code+"" ,5,
TimeUnit.MINUTES );//五分钟过期
//3.将验证码和手机号发动到rabbitMQ中
Map<String,String> map=new HashMap();
map.put("mobile",mobile);
map.put("code",code+"");
rabbitTemplate.convertAndSend("sms",map);
}
``
(2)UserController新增方法

/**

  • 发送短信验证码
  • @param mobile
    */
    @RequestMapping(value="/sendsms/{mobile}",method=RequestMethod.POST)
    public Result sendsms(@PathVariable String mobile ){
    userService.sendSms(mobile);
    return new Result(true,StatusCode.OK,"发送成功");
    }
(3)启动微服务,在rabbitMQ中创建名为sms的队列,测试API
##### 用户注册
(1)UserService增加方法






相关文章

网友评论

      本文标题:消息中间件RabbitMQ

      本文链接:https://www.haomeiwen.com/subject/tfoixctx.html