【java、微服务】MQ

news/2024/5/14 1:49:21

MQ(MessageQueue),中文是消息队列,字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。

同步通讯

优点

时效性较强,可以立即得到结果

问题

微服务间基于Feign的调用就属于同步方式,存在一些问题。

  1. 耦合度高。每次加入新的需求,都要修改原来的代码
  2. 资源浪费。调用链中的每个服务在等待响应过程中,不能释放请求占用的资源,高并发场景下会极度浪费系统资源。
  3. 级联失败。调用者需要等待服务提供者响应,如果调用链过长则响应时间等于每次调用的时间之和
  4. 性能下降。如果服务提供者出现问题所有调用方都会跟着出问题,如同多米诺骨牌一样,迅速导致整个微服务群故障

异步通讯

异步调用常见实现就是事件驱动模式

优点:

  1. 耦合度低
  2. 吞吐量提升
  3. 故障隔
  4. 流量削峰

缺点:

  1. 依赖于Broker的可靠性、安全性、吞吐能力
  2. 架构复杂了,业务没有明显的流程线,不好追踪管理

rabbitMQ

依赖

 <dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.14.0</version></dependency>

下载

docker pull rabbitmq:3-management

运行

sudo systemctl start docker
docker stop mq
docker rm mq
docker run -e RABBITMQ_DEFAULT_USER=hzy -e RABBITMQ_DEFAULT_PASS=123456 --name mq --hostname mq1 -p 15672:15672 -p 5672:5672 -d rabbitmq:3-management

控制台 

运行原理和结构 

channel: 操作MQ的工具

exchange:路由消息到队列中

queue:缓存消息

virtual host:虚拟主机,是对queue、exchange等资源的逻辑分组,用来隔离和管理多租户环境 

消息模型

基本消息队列(BasicQueue)

创建连接

 ConnectionFactory factory = new ConnectionFactory();
//        设置连接参数factory.setHost("127.0.0.1");factory.setPort(5672);factory.setVirtualHost("/");factory.setUsername("admin");factory.setPassword("admin");Connection connection=factory.newConnection();Channel channel=connection.createChannel();String queueName="test001";channel.queueDeclare(queueName,false,false,false,null);

生产者

//    发送信息String message="hello,rabbitmq";channel.basicPublish("", queueName, null, message.getBytes());System.out.println("send message is:"+message);
//        关闭资源channel.close();connection.close();

消费者

channel.basicConsume(queueName,true,new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException{String message=new String(body,"UTF-8");System.out.println("收到消息:"+message);}});

工作消息队列(WorkQueue)

发布订阅(Publish、Subscribe),又根据交换机类型不同分为三种:

是基于最基础的消息队列模型来实现的,只包括三个角色:

publisher:消息发布者,将消息发送到队列queue

queue:消息队列,负责接受并缓存消息

consumer:订阅队列,处理队列中的消息

Fanout Exchange:广播,Publish/Subscribe

Direct Exchange:路由,Routing

Topic Exchange:主题,Topics

SpringAMQP

AMQP(Advanced Message Queuing Protocol) 或之间传递业务消息的开放标准。该协议与语言和平台无关,更符合微服务中独立性的要求。
Spring AMQP是基于AMQP协议定义的一套API规范,提供了模板来发送和接收消息。包含两部分,其中spring-amqp是基础抽象,spring-rabbit是底层的默认实现。

特征

  • 侦听器容器,用于异步处理入站消息
  • 用于发送和接收消息的RabbitTemplate
  • RabbitAdmin用于自动声明队列,交换和绑定

依赖

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

application.yml

spring:rabbitmq:host:192.168.150.101#主机名port: 5672 # 端口virtual-host:/ #虚拟主机username: itcast # 用户名password: 123321 # 密码

 publisher

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringAMQOTest {@Autowiredprivate RabbitTemplate rabbitTemplate;@Testpublic void testSimpleQueue() {String queueName = "simple.queue";String message = "hello, spring amqp!";rabbitTemplate.convertAndSend(queueName, message);}
}

consumer

@Component
public class SpringRabbitListener{@RabbitListener(queues = "simple.queue")public void listenSimpleQueueMessage(String msg) throws InterruptedException {System.out.println("spring 消费者接收到消息 :【" + msg + "】");}
}

 

Kafka

ActiveMQ

RocketMQ


http://www.mrgr.cn/p/15234476

相关文章

中科院笔试考试结束

2024-04-28 22:03:11 星期日 周四的下午三点五十,我收到了中科院的笔试通知,但是考试时间是本周日,也就是说我只有三天时间复习早就忘掉的数分高代,备考压力绝不亚于从零开始七天准备高考\(\ldots\)三天几乎泡在图书馆挑着重点过一遍知识,级数、重积分、反常积分等等连翻都…

Transition

内置组件Transition官网详细文档:https://cn.vuejs.org/v2/guide/transitions.html时机 Transition组件会监控slot中唯一根元素的出现和消失,并会在其出现和消失时应用过渡效果 具体的监听内容是:它会对新旧两个虚拟节点进行对比,如果旧节点被销毁,则应用消失效果,如果新…

TechTool Pro for mac中文激活版:硬件监测和系统维护工具

TechTool Pro mac帮助用户实现系统硬件监测&#xff08;CPU、内存、硬盘、网络、USB等&#xff09;、内存测试、S.M.A.R.T检测、磁盘宗卷扫描、宗卷重建和优化、数据恢复和粉碎等等&#xff0c;定期使用&#xff0c;可以确保您的Mac保持优化和无故障。 TechTool Pro for mac v1…

JavaEE初阶——多线程(六)——线程池

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享多线程的第六篇文章,关于线程池 如果有不足的或者错误的请您指出! 目录 3.线程池3.1标准库的线程池3.2 标准库自己提供的几个工厂类3.3自己实现一个线程池完成大体框架接下来完…

FPGA 以太网通信UDP通信环回

1 实验任务 上位机通过网口调试助手发送数据给 FPGA &#xff0c; FPGA 通过 PL 端以太网接口接收数据并将接收到的数据发送给上位机&#xff0c;完成以太网 UDP 数据的环回。 2 系统设计 系统时钟经过PLL时钟模块后&#xff0c;生成了两种不同频率和相位的时钟信号&#…

实验三—软件测试

一、实验题目 :软件测试 二、实验目的 1、熟悉开发环境下的自动化测试工具; 1、利用自动化测试工具进行自动化单元测试。 三、实验内容 1、选择开发环境,IDEA或PYCHARM任选其一; 2、基于所选择的开发环境实现对输入的n个整数进行排序的代码; 3、对所编写代码设计测试用例;…

知网怎么查重 知网查重的详细步骤

知网查重八个步骤&#xff1a;1. 访问官网&#xff0c;注册账号。2. 上传待查文档。3. 选择查重规则。4. 选择相似来源库。5. 提交查重任务。6. 等待查重结果。7. 获取查重报告。8. 下载查重报告。 知网查重的详细步骤 第一步&#xff1a;进入知网查重系统 打开浏览器&#x…

生命周期

创建vue实例和创建组件的流程基本一致首先做一些初始化的操作,主要是设置一些私有属性到实例中运行生命周期钩子函数****beforeCreate进入注入流程:处理属性、computed、methods、data、provide、inject,最后使用代理模式将它们挂载到实例中运行生命周期钩子函数****created…

diff

diff的时机 当组件创建时,以及依赖的属性或数据变化时,会运行一个函数,该函数会做两件事:运行_render生成一棵新的虚拟dom树(vnode tree) 运行_update,传入虚拟dom树的根节点,对新旧两棵树进行对比,最终完成对真实dom的更新核心代码如下:// vue构造函数 function Vue…

D - Grid and Magnet

D - Grid and Magnet https://atcoder.jp/contests/abc351/tasks/abc351_d思路 定义输入矩阵元素值s matrix each cell can have three possible values: 0 - emtpy and not magnet field 1 - magnet 2 - magnet field 输入的时候,只标记 0 1 然后遍历 所…

日志分析-redis应急响应

简介 服务器场景操作系统 Linux 服务器账号密码 root xjredis 任务环境说明 注:样本请勿在本地运行!!!样本请勿在本地运行!!!样本请勿在本地运行!!! 应急响应工程师小王某人收到安全设备告警服务器被植入恶意文件,请上机排查步骤#1通过本地 PC SSH到服务器并且分析黑…

日志分析-mysql应急响应

简介 mysql应急响应 ssh账号 root 密码 xjmysql ssh env.xj.edisec.net -p xxxxx 1.黑客第一次写入的shell flag{关键字符串} 2.黑客反弹shell的ip flag{ip} 3.黑客提权文件的完整路径 md5 flag{md5} 注 /xxx/xxx/xxx/xxx/xxx.xx 4.黑客获取的权限 flag步骤#1步骤#2 /var/log…

网工学习云计算HCIE感受如何?

作为一名网工&#xff0c;我经常会在各种网络论坛里查询搜索一些网络技术资料&#xff0c;以及跟论坛里的网友交流讨论平时在工作、学习中遇到的问题、故障&#xff0c;因此也经常能在论坛的首页看到誉天的宣传信息。机缘巧合之下关注了誉天的B站号&#xff0c;自从关注了誉天的…

SystemVerilog -- 6.4 Interface ~ Clocking Block Part II

SystemVerilog Clocking Block Part II 时钟模块允许在指定的时钟事件对输入进行采样并驱动输出。如果提到时钟模块的输入skew,则该模块中的所有输入信号都将在时钟事件之前以skew时间单位进行采样。如果提到时钟模块的输出skew,则该模块中的输出信号都将在相应的时钟事件之后…

IP定位技术助力网络安全保护

在当今数字化时代&#xff0c;网络安全成为各个组织和个人关注的焦点之一。随着网络攻击日益复杂和频繁&#xff0c;有效的网络安全保护措施变得至关重要。IP定位技术作为网络安全的重要组成部分&#xff0c;为识别、定位和防御网络攻击提供了关键支持。本文将探讨IP定位技术如…

企业OA管理|基于SprinBoot+vue的企业OA管理系统(源码+数据库+文档)

企业OA管理目录 基于SprinBootvue的企业OA管理系统 一、前言 二、系统设计 三、系统功能设计 1 管理员模块的实现 1.1 用户信息管理 1.2 公告信息管理 1.3 客户关系管理 1.4 通讯录管理 2 用户模块的实现 2.1 客户关系添加 2.2 通讯录添加 2.3 日程安排添加 四、…

experiment3

EX3 Task1 `#include <stdio.h> include <stdlib.h> include <time.h> include <windows.h> define N 80 void print_text(int line, int col, char text[]); // 函数声明 void print_spaces(int n); // 函数声明 void print_blank_lines(int n); // 函…

Prompt Engineering,提示工程

什么是提示工程&#xff1f; 提示工程也叫【指令工程】。 Prompt发送给大模型的指令。比如[讲个笑话]、[用Python编个贪吃蛇游戏]、[给男/女朋友写情书]等看起来简单&#xff0c;但上手简单精通难 [Propmpt]是AGI时代的[编程语言][Propmpt]是AGI时代的[软件工程][提示工程]是…

04-vue项目相关

# 1 工程化---》创建vue项目-要按vue要求的套路写代码--》写的都是vue的东西-最终上线--》要编译---》把vue的代码--》编译成 html,css,js-创建工程,编译需要使用:nodejs--》webpack# 2 安装node环境-官网下载一路下一步安装-两个命令npm---->pipnode--->python# 3 搭…

问题:“git”不是内部命令

问题:明明刚安装完git,在使用git命令时却显示不是内部命令 因为没有配环境变量 1、找到git里的bin路径,复制2、打开电脑里的计算机=》属性=》高级系统设置,我的是系统=》系统信息=》高级系统设置选择环境变量环境变量有两处需要改的,用户变量和系统变量,先改用户变量 选中…