当前快讯:Rabbitmq 介绍 、安装、基于Queue实现生产者消费者模型、基本使用、消息安全之ack、durable持久化、利用闲置消费、发布订阅、发布订阅高级之Royting(按关键字匹配)、Topic关键字模糊匹配、基于rabbitmq实现rpc
师承老刘llnb
一、消息队列介绍
1.1介绍
消息队列就是基础数据结构中的“先进先出”的一种数据机构。想一下,生活中买东西,需要排队,先排的人先买消费,就是典型的“先进先出”
(相关资料图)
1.2MQ解决什么问题
MQ是一直存在,不过随着微服务架构的流行,成了解决微服务之间问题的常用工具。应用解耦以电商应用为例,应用中有订单系统、库存系统、物流系统、支付系统。用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障,都会造成下单操作异常。
当转变成基于消息队列的方式后,系统间调用的问题会减少很多,比如物流系统因为发生故障,需要几分钟来修复。在这几分钟的时间里,物流系统要处理的内存被缓存在消息队列中,用户的下单操作可以正常完成。当物流系统恢复后,继续处理订单信息即可,中单用户感受不到物流系统的故障。提升系统的可用性流量削峰举个栗子,如果订单系统最多能处理一万次订单,这个处理能力应付正常时段的下单时绰绰有余,正常时段我们下单一秒后就能返回结果。但是在高峰期,如果有两万次下单操作系统是处理不了的,只能限制订单超过一万后不允许用户下单。
使用消息队列做缓冲,我们可以取消这个限制,把一秒内下的订单分散成一段时间来处理,这事有些用户可能在下单十几秒后才能收到下单成功的操作,但是比不能下单的体验要好。消息分发多个服务队数据感兴趣,只需要监听同一类消息即可处理。例如A产生数据,B对数据感兴趣。如果没有消息的队列A每次处理完需要调用一下B服务。过了一段时间C对数据也感性,A就需要改代码,调用B服务,调用C服务。只要有服务需要,A服务都要改动代码。很不方便。有了消息队列后,A只管发送一次消息,B对消息感兴趣,只需要监听消息。C感兴趣,C也去监听消息。A服务作为基础服务完全不需要有改动异步消息有些服务间调用是异步的,例如A调用B,B需要花费很长时间执行,但是A需要知道B什么时候可以执行完,以前一般有两种方式,A过一段时间去调用B的查询api查询。或者A提供一个callback api,B执行完之后调用api通知A服务。这两种方式都不是很优雅使用消息总线,可以很方便解决这个问题,A调用B服务后,只需要监听B处理完成的消息,当B处理完成后,会发送一条消息给MQ,MQ会将此消息转发给A服务。
这样A服务既不用循环调用B的查询api,也不用提供callback api。同样B服务也不用做这些操作。A服务还能及时的得到异步处理成功的消息
1.3 常见消息队列及比较
结论:
Kafka在于分布式架构,RabbitMQ基于AMQP协议来实现,RocketMQ/思路来源于kafka,改成了主从结构,在事务性可靠性方面做了优化。广泛来说,电商、金融等对事务性要求很高的,可以考虑RabbitMQ和RocketMQ,对性能要求高的可考虑Kafka
二 Rabbitmq安装
官网:https://www.rabbitmq.com/getstarted.html
2.1 服务端原生安装
# 安装配置epel源# 安装erlangyum -y install erlang# 安装RabbitMQyum -y install rabbitmq-server
2.2服务端Docker安装
docker pull rabbitmq:managementdocker run -di --name Myrabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 rabbitmq:managemen
2.3客户端安装
pip3 install pika
2.4 设置用户和密码
rabbitmqctl add_user lqz 123# 设置用户为administrator角色rabbitmqctl set_user_tags lqz administrator# 设置权限rabbitmqctl set_permissions -p "/" root ".*" ".*" ".*"# 然后重启rabbiMQ服务systemctl reatart rabbitmq-server # 然后可以使用刚才的用户远程连接rabbitmq server了。
三 基于Queue实现生产者消费者模型
import Queueimport threadingmessage = Queue.Queue(10)def producer(i): while True: message.put(i)def consumer(i): while True: msg = message.get()for i in range(12): t = threading.Thread(target=producer, args=(i,)) t.start()for i in range(10): t = threading.Thread(target=consumer, args=(i,)) t.start()
四 基本使用(生产者消费者模型)
对于RabbitMQ来说,生产和消费不再针对内存里的一个Queue对象,而是某台服务器上的RabbitMQ Server实现的消息队列。生产者
import pika# 无密码# connection = pika.BlockingConnection(pika.ConnectionParameters("127.0.0.1"))# 有密码credentials = pika.PlainCredentials("admin","admin")connection = pika.BlockingConnection(pika.ConnectionParameters("10.0.0.200",credentials=credentials))channel = connection.channel()# 声明一个队列(创建一个队列)channel.queue_declare(queue="lqz")channel.basic_publish(exchange="", routing_key="lqz", # 消息队列名称 body="hello world")connection.close()
消费者
import pikacredentials = pika.PlainCredentials("admin","admin")connection = pika.BlockingConnection(pika.ConnectionParameters("10.0.0.200",credentials=credentials))channel = connection.channel()# 声明一个队列(创建一个队列)channel.queue_declare(queue="lqz")def callback(ch, method, properties, body): print("消费者接受到了任务: %r" % body)channel.basic_consume(queue="lqz",on_message_callback=callback,auto_ack=True)channel.start_consuming()
五 消息安全之ack
生产者
import pika# 无密码# connection = pika.BlockingConnection(pika.ConnectionParameters("127.0.0.1"))# 有密码credentials = pika.PlainCredentials("admin","admin")connection = pika.BlockingConnection(pika.ConnectionParameters("10.0.0.200",credentials=credentials))channel = connection.channel()# 声明一个队列(创建一个队列)channel.queue_declare(queue="lqz")channel.basic_publish(exchange="", routing_key="lqz", # 消息队列名称 body="hello world")connection.close()
消费者
import pikacredentials = pika.PlainCredentials("admin","admin")connection = pika.BlockingConnection(pika.ConnectionParameters("10.0.0.200",credentials=credentials))channel = connection.channel()# 声明一个队列(创建一个队列)channel.queue_declare(queue="lqz")def callback(ch, method, properties, body): print("消费者接受到了任务: %r" % body) # 通知服务端,消息取走了,如果auto_ack=False,不加下面,消息会一直存在 # ch.basic_ack(delivery_tag=method.delivery_tag)channel.basic_consume(queue="lqz",on_message_callback=callback,auto_ack=False)channel.start_consuming()
六 消息安全之durable持久化
生产者
import pika# 无密码# connection = pika.BlockingConnection(pika.ConnectionParameters("127.0.0.1"))# 有密码credentials = pika.PlainCredentials("admin","admin")connection = pika.BlockingConnection(pika.ConnectionParameters("10.0.0.200",credentials=credentials))channel = connection.channel()# 声明一个队列(创建一个队列),durable=True支持持久化,队列必须是新的才可以channel.queue_declare(queue="lqz1",durable=True)channel.basic_publish(exchange="", routing_key="lqz1", # 消息队列名称 body="111", properties=pika.BasicProperties( delivery_mode=2, # make message persistent,消息也持久化 ) )connection.close()
消费者
import pikacredentials = pika.PlainCredentials("admin","admin")connection = pika.BlockingConnection(pika.ConnectionParameters("10.0.0.200",credentials=credentials))channel = connection.channel()# 声明一个队列(创建一个队列)channel.queue_declare(queue="lqz1")def callback(ch, method, properties, body): print("消费者接受到了任务: %r" % body) # 通知服务端,消息取走了,如果auto_ack=False,不加下面,消息会一直存在 # ch.basic_ack(delivery_tag=method.delivery_tag)channel.basic_consume(queue="lqz1",on_message_callback=callback,auto_ack=False)channel.start_consuming()
七 闲置消费
正常情况如果有多个消费者,是按照顺序第一个消息给第一个消费者,第二个消息给第二个消费者
但是可能第一个消息的消费者处理消息很耗时,一直没结束,就可以让第二个消费者优先获得闲置的消息生产者
import pika# 无密码# connection = pika.BlockingConnection(pika.ConnectionParameters("127.0.0.1"))# 有密码credentials = pika.PlainCredentials("admin","admin")connection = pika.BlockingConnection(pika.ConnectionParameters("10.0.0.200",credentials=credentials))channel = connection.channel()# 声明一个队列(创建一个队列),durable=True支持持久化,队列必须是新的才可以channel.queue_declare(queue="lqz123",durable=True)channel.basic_publish(exchange="", routing_key="lqz123", # 消息队列名称 body="111", properties=pika.BasicProperties( delivery_mode=2, # make message persistent,消息也持久化 ) )connection.close()
消费者
import pikacredentials = pika.PlainCredentials("admin","admin")connection = pika.BlockingConnection(pika.ConnectionParameters("10.0.0.200",credentials=credentials))channel = connection.channel()# 声明一个队列(创建一个队列)# channel.queue_declare(queue="lqz123")def callback(ch, method, properties, body): print("消费者接受到了任务: %r" % body) # 通知服务端,消息取走了,如果auto_ack=False,不加下面,消息会一直存在 ch.basic_ack(delivery_tag=method.delivery_tag)channel.basic_qos(prefetch_count=1) #####就只有这一句话 谁闲置谁获取,没必要按照顺序一个一个来channel.basic_consume(queue="lqz123",on_message_callback=callback,auto_ack=False)channel.start_consuming()
八 发布订阅
发布者
import pikacredentials = pika.PlainCredentials("admin","admin")connection = pika.BlockingConnection(pika.ConnectionParameters("10.0.0.200",credentials=credentials))channel = connection.channel()channel.exchange_declare(exchange="m1",exchange_type="fanout")channel.basic_publish(exchange="m1", routing_key="", body="lqz nb")connection.close()
订阅者(启动几次订阅者会生成几个队列)
import pikacredentials = pika.PlainCredentials("admin","admin")connection = pika.BlockingConnection(pika.ConnectionParameters("10.0.0.200",credentials=credentials))channel = connection.channel()# exchange="m1",exchange(秘书)的名称# exchange_type="fanout" , 秘书工作方式将消息发送给所有的队列channel.exchange_declare(exchange="m1",exchange_type="fanout")# 随机生成一个队列result = channel.queue_declare(queue="",exclusive=True)queue_name = result.method.queueprint(queue_name)# 让exchange和queque进行绑定.channel.queue_bind(exchange="m1",queue=queue_name)def callback(ch, method, properties, body): print("消费者接受到了任务: %r" % body)channel.basic_consume(queue=queue_name,on_message_callback=callback,auto_ack=True)channel.start_consuming()
九 发布订阅高级之Routing(按关键字匹配)
发布者
import pikacredentials = pika.PlainCredentials("admin","admin")connection = pika.BlockingConnection(pika.ConnectionParameters("10.0.0.200",credentials=credentials))channel = connection.channel()channel.exchange_declare(exchange="m2",exchange_type="direct")channel.basic_publish(exchange="m2", routing_key="bnb", # 多个关键字,指定routing_key body="lqz nb")connection.close()
订阅者1
import pikacredentials = pika.PlainCredentials("admin","admin")connection = pika.BlockingConnection(pika.ConnectionParameters("10.0.0.200",credentials=credentials))channel = connection.channel()# exchange="m1",exchange(秘书)的名称# exchange_type="direct" , 秘书工作方式将消息发送给不同的关键字channel.exchange_declare(exchange="m2",exchange_type="direct")# 随机生成一个队列result = channel.queue_declare(queue="",exclusive=True)queue_name = result.method.queueprint(queue_name)# 让exchange和queque进行绑定.channel.queue_bind(exchange="m2",queue=queue_name,routing_key="nb")channel.queue_bind(exchange="m2",queue=queue_name,routing_key="bnb")def callback(ch, method, properties, body): print("消费者接受到了任务: %r" % body)channel.basic_consume(queue=queue_name,on_message_callback=callback,auto_ack=True)channel.start_consuming()
订阅者2
import pikacredentials = pika.PlainCredentials("admin","admin")connection = pika.BlockingConnection(pika.ConnectionParameters("10.0.0.200",credentials=credentials))channel = connection.channel()# exchange="m1",exchange(秘书)的名称# exchange_type="direct" , 秘书工作方式将消息发送给不同的关键字channel.exchange_declare(exchange="m2",exchange_type="direct")# 随机生成一个队列result = channel.queue_declare(queue="",exclusive=True)queue_name = result.method.queueprint(queue_name)# 让exchange和queque进行绑定.channel.queue_bind(exchange="m2",queue=queue_name,routing_key="nb")def callback(ch, method, properties, body): print("消费者接受到了任务: %r" % body)channel.basic_consume(queue=queue_name,on_message_callback=callback,auto_ack=True)channel.start_consuming()
9.1发布订阅高级之Topic(按关键字模糊匹配)
发布者
import pikacredentials = pika.PlainCredentials("admin","admin")connection = pika.BlockingConnection(pika.ConnectionParameters("10.0.0.200",credentials=credentials))channel = connection.channel()channel.exchange_declare(exchange="m3",exchange_type="topic")channel.basic_publish(exchange="m3", # routing_key="lqz.handsome", #都能收到 routing_key="lqz.handsome.xx", #只有lqz.#能收到 body="lqz nb")connection.close()
订阅者1只能加一个单词
可以加任意单词字符
import pikacredentials = pika.PlainCredentials("admin","admin")connection = pika.BlockingConnection(pika.ConnectionParameters("10.0.0.200",credentials=credentials))channel = connection.channel()# exchange="m1",exchange(秘书)的名称# exchange_type="direct" , 秘书工作方式将消息发送给不同的关键字channel.exchange_declare(exchange="m3",exchange_type="topic")# 随机生成一个队列result = channel.queue_declare(queue="",exclusive=True)queue_name = result.method.queueprint(queue_name)# 让exchange和queque进行绑定.channel.queue_bind(exchange="m3",queue=queue_name,routing_key="lqz.#")def callback(ch, method, properties, body): print("消费者接受到了任务: %r" % body)channel.basic_consume(queue=queue_name,on_message_callback=callback,auto_ack=True)channel.start_consuming()
订阅者2
import pikacredentials = pika.PlainCredentials("admin","admin")connection = pika.BlockingConnection(pika.ConnectionParameters("10.0.0.200",credentials=credentials))channel = connection.channel()# exchange="m1",exchange(秘书)的名称# exchange_type="topic" , 模糊匹配channel.exchange_declare(exchange="m3",exchange_type="topic")# 随机生成一个队列result = channel.queue_declare(queue="",exclusive=True)queue_name = result.method.queueprint(queue_name)# 让exchange和queque进行绑定.channel.queue_bind(exchange="m3",queue=queue_name,routing_key="lqz.*")def callback(ch, method, properties, body): queue_name = result.method.queue # 发送的routing_key是什么 print("消费者接受到了任务: %r" % body)channel.basic_consume(queue=queue_name,on_message_callback=callback,auto_ack=True)channel.start_consuming()
十 基于rabbitmq实现rpc
服务端
import pikacredentials = pika.PlainCredentials("admin","admin")connection = pika.BlockingConnection(pika.ConnectionParameters("10.0.0.200",credentials=credentials))channel = connection.channel()# 起翰监听任务队列channel.queue_declare(queue="rpc_queue")def on_request(ch, method, props, body): n = int(body) response = n + 100 # props.reply_to 要放结果的队列. # props.correlation_id 任务 ch.basic_publish(exchange="", routing_key=props.reply_to, properties=pika.BasicProperties(correlation_id= props.correlation_id), body=str(response)) ch.basic_ack(delivery_tag=method.delivery_tag)channel.basic_qos(prefetch_count=1)channel.basic_consume( queue="rpc_queue",on_message_callback=on_request,)channel.start_consuming()
客户端
import pikaimport uuidclass FibonacciRpcClient(object): def __init__(self): credentials = pika.PlainCredentials("admin", "admin") self.connection = pika.BlockingConnection(pika.ConnectionParameters("10.0.0.200", credentials=credentials)) self.channel = self.connection.channel() # 随机生成一个消息队列(用于接收结果) result = self.channel.queue_declare(queue="",exclusive=True) self.callback_queue = result.method.queue # 监听消息队列中是否有值返回,如果有值则执行 on_response 函数(一旦有结果,则执行on_response) self.channel.basic_consume(queue=self.callback_queue,on_message_callback=self.on_response, auto_ack=True) def on_response(self, ch, method, props, body): if self.corr_id == props.correlation_id: self.response = body def call(self, n): self.response = None self.corr_id = str(uuid.uuid4()) # 客户端 给 服务端 发送一个任务: 任务id = corr_id / 任务内容 = "30" / 用于接收结果的队列名称 self.channel.basic_publish(exchange="", routing_key="rpc_queue", # 服务端接收任务的队列名称 properties=pika.BasicProperties( reply_to = self.callback_queue, # 用于接收结果的队列 correlation_id = self.corr_id, # 任务ID ), body=str(n)) while self.response is None: self.connection.process_data_events() return self.responsefibonacci_rpc = FibonacciRpcClient()response = fibonacci_rpc.call(50)print("返回结果:",response)
标签:
- 黄山提升政府采购透明度 助力实体经济持续健康稳定发展
- 1-2月黄山新签“双招双引”项目103个 总投资额139.7亿元
- 池州海关共签发RCEP原产地证书22份 签证金额92.7万美元
- 宿州泗县深入推进文旅融合发展 擦亮城市品牌
- 河北工业生产平稳开局 固定资产投资较快增长
- 昆明西山区深入实施人才强区战略 建立健全招商招才引资并轨新模式
- 2月唐山新建商品住宅销售价格与上月持平 同比下降0.8%
- 去年河北电子信息产业实现主营业务收入2367.7亿元 同比增长22.4%
- 绥化望奎以工业化思维为引领 推动肉类加工制造产业腾飞
- 绥化市监局推出多项举措 大力促进有机产品产业发展
- 半路出家无心插柳 杭州西湖区“菌菇宝宝”变废为宝
- 温州鹿城区藤桥主打藤桥熏鸡 近两年销售额年均增长20%以上
- 1-2月安徽限额以上消费品零售额1030.4亿元 同比增长10.4%
- 2021年合肥市茶园面积13.6万亩 产值176350万元
- 淡季不忘引流 京郊民宿市场将很快迎来回暖
- 郴州安仁文旅项目集中开工 总投资1000万元
- 江苏服务业继续保持发展强劲势头 为高质量发展提供有力支撑
- 黄山休宁经开区摸排基础设施项目17个 计划总投资29709万元
- 前两个月宣城出口31亿元 增长34.4%
- 滁州凤阳2021年共接待游客225万人次 旅游综合收入20.25亿元
- 1-2月宿州市民间投资同比增长19.2% 居全省第3位
- 宿州严格审核把关 抢抓发行地方政府专项债券政策机遇
- 1-2月亳州市进出口总值5.5亿元 同比下降17.4%
- 合肥:弘扬茶文化 初步形成一条生态发展之路
- 合肥:建成“数字中国”领先城市 推进城市数字化转型
- 甘肃再续“艾黎情”:探职业教育德技并修
- 【城市守望者】致敬抗“疫”一线的“拆弹专家”
- 浙江绍兴越城区核酸检测结果公布 除1例阳性外其余均为阴性
- 内地首例奥密克戎变异株感染者身体状况如何?来自哪里?专家解读→
- 对变异病毒已有准备!关于中国新冠药物,钟南山发声→
- 江苏睢宁小网格大担当 织就乡村振兴“幸福网”
- 改造老旧小区 共享幸福生活
- 天津静海:群众在哪里,文明实践就延伸到哪里
- 齐齐哈尔:初步判断疫情感染来源为接触新冠病毒污染环境和物品
- 重庆大竹林派出所副所长因对群众态度简单粗暴被停职
- 黑龙江讷河病例感染源初步判断为新冠病毒污染的环境和物品
- 致敬2021
- 浙江瑞安民警捐献造血干细胞:14年前的心愿终将如愿
- “考研房”涨价离谱 律师:借机宰客有违市场伦理
- 广州白云机场:14天内有东莞旅居史的旅客须凭48小时核酸阴性证明乘机
- 浙江绍兴本轮疫情已报告确诊病例145例 无症状感染者1例
- 福建龙岩一男子和前妻斗气 扛着126斤硬币到法院“还钱”
- 重庆这座立交酷似“悟空” 走红 设计师揭秘(图)
- 青海警方破获特大电诈案 涉案流水高达1.7亿
- 云南新增境外输入确诊病例3例
- 黑龙江讷河市5名核酸阳性人员流调溯源:接触被新冠病毒污染的环境和物品
- 男子爱上女主播 假扮女主播闺蜜教其他男粉丝刷单
- 广西三市警方联手破获毒品案 全链条摧毁跨境贩毒团伙
- 广东东莞发现2例无症状感染者,部分镇今起全员筛查
- 从百二秦关到闻道凯旋 一个殉职医生最后的朋友圈
- 浙江发补充说明:三地铁路出行政策随风险等级同步调整
- 内蒙古新增本土确诊病例5例 均在呼伦贝尔满洲里市
- 陕西新增本土确诊病例1例 系隔离酒店工作人员
- 31省份新增新冠肺炎确诊病例76例 其中本土51例
- 浙江新增新冠肺炎确诊病例45例 其中本土44例
- 技能就是财富 技工也是人才
- 黑龙江新增本土确诊病例1例、本土无症状感染者4例
- 冷空气“调休”!我国大部陆续迎回暖 中东部雨雪稀少
- 华北黄淮等地大气扩散条件转差 冷空气将影响中东部
- 别误读了野猪或将不再是“三有”动物
- 您的ETC已到期?当心这个诈骗短信!
- 对回家的“宝贝”少一些关注,也是一种帮助
- 升温!北京今日阳光在线 最高气温将升至8℃
- 那年今日 | 一张漫画涨知识之12月14日
- 40岁男子一觉醒来突然听不见了 原因是……
- 本年度星空压轴大赏上演 双子座流星雨观赏地图来了
- 广东东莞大朗镇报告2例新冠肺炎无症状感染者
- 商丘4885份被盗出生证去哪了?10年“悬案”引关注
- 浙江海宁警方通报国家公祭日女子穿和服逛街
- 厨艺不精调料凑?懒人调料:年轻人的“下厨神器”
- “您的ETC已到期?”警方提醒:当心这个诈骗短信
- “网红”局长的热度 自述:走红后我就没有周末了
- 寻回被拐10年的儿子后又送走 儿子:害我没家了
- 小城里的三张面孔和警号301137
- 倡导“就地过年”,需因地制宜科学防疫
- 别用“入乡随俗”为星巴克找借口
- 北京地铁14号线年底全线贯通运营
- 天津市从入境人员中检出奥密克戎变异株
- “外滩活地图”黄俊:一个不想出圈的段子手交警
- 寻找一双儿女的25年
- 无锡市场监管部门责成星巴克涉事门店停业整改
- 海岛警事:为了一座岛和2900平方公里的海
- 北京民警宏福苑抗疫26天:“今夜我和雪花一起出发”
- 星巴克的“金标准”缘何败给了“潜规则”
- 患者被低价药“惊呆”的场面应该更多些
- 影视剧“超前点评”不止是“低级错误”
- “南昌鹦鹉案”下发不起诉决定书 网店上架费氏牡丹鹦鹉被拒
- 河南商丘4885份出生医学证明被盗始末追踪
- 绍兴市病例62-109活动轨迹公布
- 12月7日以来,杭州累计报告新冠肺炎确诊病例19例
- 浙江绍兴新增确诊病例37例 上虞区占36例
- 河南高院对张成功案作出死刑判决
- 四川一滑雪场停电游客被困索道 官方回应
- 浙江绍兴越城区新增1例新冠肺炎确诊病例 当地对防控区域划分进行调整
- 中国内地首次检出新冠病毒奥密克戎变异株
- 知网除了涉及著作权纠纷,是否涉嫌违反《反垄断法》?
- 浙江绍兴越城区新增1例新冠肺炎确诊病例
- 四川眉山千箱柑橘送往呼和浩特市抗疫一线
- 两名青年男女探险三亚落笔洞遗址被困沼泽 消防成功救援
- 中国地理学大会在福州发布《中国地理学界碳中和科技行动福州宣言》
广告
广告
- 当前快讯:Rabbitmq 介绍 、安装、基于Queue实现生产者消费者模型、基本使用、消息安全之ack、durable持久化、利用闲置消费、发布订阅、发布订阅高级之Royting(按关键字匹配)、Topic关键字模糊匹配、基于rabbitmq实现rpc
- 美国“反恐战争”结束20年后军事行动照旧 美专家批“不负责任”
- 日本石川县地震已造成1人死亡21人受伤
- 中国紫檀博物馆开放时间是几点? 环球时快讯
- 环球焦点!美国一大学5天内发生3起持刀伤人事件:致2死1伤 引发学生恐慌
- 英文缩写在线翻译器_英文缩写在线翻译
- “路边摊”解禁折射城市治理思路转变 当前视点
- 每日热点:比科斯2022年亏损1408.06万同比由盈转亏光学薄膜业务减少
- 世界今热点:FAO:粮农组织食品价格指数2023年4月环比上涨0.8点(0.6%)
- 蚌埠五河:一水两用一地多收 稻虾共作蹚出致富路|环球快看点
- 如何编辑pdf文件 pdf格式转word格式的转换软件有什么
- 山东省制造业创新能力提升三年行动计划:强化产业基础技术攻关,培育千家专精特新“小巨人”企业
- 豌豆思维_豌豆思维怎么样|每日短讯
- 公募基金周报丨A股行情走弱,除上证指数和上证50外整体小幅下跌 环球微资讯
- 钱江摩托股东户数下降2.18%,户均持股57.31万元
- 一张单子卖10万元,谁在交易长江砂石“身份证”? 天天报资讯
- 灵汇股份2022年净利338.57万同比下滑69.03% 本期合同受疫情影响下降 天天新消息
- 当前热讯:陌陌被苹果下架 官方回应:技术问题正解决 老用户不影响
- 世界最新:九强生物(300406):九强生物2022年度投资者交流会记录表
- 宝马i5最新预告图 配备发光格栅