当前位置: 首页 > news >正文

一键抓取的网站怎么做/友情链接联盟

一键抓取的网站怎么做,友情链接联盟,163企业邮箱app下载,网页图片怎么居中🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是平顶山大师,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《Message queue 消息队列--RabbitMQ 【基础入门…

                            🎉🎉欢迎来到我的CSDN主页!🎉🎉

                    🏅我是平顶山大师,一个在CSDN分享笔记的博主。📚📚

    🌟推荐给大家我的博客专栏《Message queue 消息队列--RabbitMQ 【基础入门】》。🎯🎯

                    🎁如果感觉还不错的话请给我关注加三连吧!🎁🎁

目录

一,Message queue介绍:

二,RabbitMQ介绍:

2.1什么是RabbitMQ?

2.2RabbitMQ组成?

2.3RabbitMQ工作原理

2.4RabbitMQ在企业项目中使用场景:

2.5Docker安装部署RabbitMQ

2.6创建springboot项目嵌套RabbitMQ

传递字符串类型

传递实体类型

访问测试:


一,Message queue介绍:

1.1使用消息队列的优点:

服务之间最常见的通信方式是直接调用彼此来通信,消息从一端发出后立即就可以达到另一端,称为即时消息通讯(同步通信) 消息从某一端发出后,首先进入一个容器进行临时存储,当达到某种条件后,再由这个容器发送给另一端,称为延迟消息通讯(异步通信)

如下:如果我们不使用MQ的话由订单直接调用其他的方法就会有几个问题:

1.过度耦合:如果后面创建订单时,需要触发新的动作,那就得去改代码,在原有的创建订单函数末尾,再追加一行代码

2.缺少缓冲:如果创建订单时,会员系统恰好处于非常忙碌或者宕机的状态,那这时更新会员信息就会失败,我们需要一个地方,来暂时存放无法被消费的消息

解决:需要一个消息中间件,来实现解耦和缓冲的功能.

二,RabbitMQ介绍:

2.1什么是RabbitMQ?

RabbitMQ是一个功能强大的消息队列中间件,被广泛应用于分布式系统、微服务架构和异步任务处理等场景。它提供了丰富的特性和灵活的配置选项,能够满足各种不同的需求。同时也有其他的MQ,RabbitMQ只是消息队列的一种。

2.2RabbitMQ组成?
  1. 消息队列:消息队列是一种在应用程序之间进行异步通信的方式。发送方将消息发送到队列,接收方从队列中接收消息并进行处理。这种方式能够解耦发送方和接收方,提高系统的可靠性和可扩展性。

  2. AMQP协议:RabbitMQ使用AMQP(Advanced Message Queuing Protocol)作为消息传递的协议。AMQP是一个标准化的消息传递协议,支持多种编程语言和操作系统。

  3. 生产者和消费者:RabbitMQ中的消息发送方称为生产者,消息接收方称为消费者。生产者将消息发送到队列中,而消费者则从队列中接收并处理消息。

  4. 队列:队列是RabbitMQ中存储消息的地方。消息会被顺序写入队列,并按照先进先出的原则进行处理。

  5. 交换机:交换机是RabbitMQ中消息的路由器,它决定了消息应该发送到哪个队列。根据不同的路由策略,交换机可以将消息发送到一个或多个队列。

  6. 绑定:绑定是将交换机和队列关联起来的过程。绑定可以指定特定的路由规则,从而让交换机将消息发送到指定的队列。

  7. 路由策略:RabbitMQ支持多种路由策略,包括直接路由、主题路由和扇形路由等。不同的路由策略适用于不同的场景,可以实现灵活的消息路由。

  8. 可靠性:RabbitMQ提供了多种机制来确保消息的可靠传递,包括持久化、确认机制和发布者确认等。这些机制可以防止消息丢失或重复消费。

2.3RabbitMQ工作原理

RabbitMQ的工作原理主要基于生产者-消费者模型和消息队列。以下是其基本的工作流程:

生产者:生产者是创建消息的应用程序。它创建消息并发送到RabbitMQ。

队列:队列是RabbitMQ的内部结构,用于存储消息。多个生产者可以发送消息到一个队列,多个消费者可以从一个队列中获取消息。

交换器:生产者发送消息到交换器(Exchange),然后交换器根据一定的规则(路由键)将消息路由到一个或多个队列。RabbitMQ提供了几种类型的交换器,如直接交换器、主题交换器、头交换器和扇出交换器。

消费者:消费者是接收消息的应用程序。消费者连接到RabbitMQ并订阅一个队列,当新的消息到达队列时,RabbitMQ会将消息推送给消费者,或者消费者可以主动从队列中拉取消息。

消息确认:当消费者处理完一个消息后,它需要向RabbitMQ发送一个确认,告诉RabbitMQ这个消息已经被处理,可以从队列中删除。如果消费者处理消息时发生错误,它可以发送一个拒绝,告诉RabbitMQ这个消息没有被正确处理。

持久化:为了防止消息丢失,RabbitMQ提供了消息持久化的功能。生产者在发送消息时可以设置消息为持久化,RabbitMQ会将这些消息存储到磁盘,即使RabbitMQ服务器重启,这些消息也不会丢失。

通过这种方式,RabbitMQ可以在分布式系统中实现消息的可靠传递。 

RabbitMQ是一个实现了AMQP(Advanced Message Queuing Protocol)高级消息队列协议的消息队列服务,用Erlang语言.

Server(Broker):接收客户端连接,实现AMQP协议的消息队列和路由功能的进程.
Virtual Host:虚拟主机的概念,类似权限控制组,一个Virtual Host里可以有多个Exchange和Queue.
Exchange:交换机,接收生产者发送的消息,并根据Routing Key将消息路由到服务器中的队列Queue.
ExchangeType:交换机类型决定了路由消息行为,
RabbitMQ中有三种类型Exchange,分别是fanout、direct、topic.
Message Queue:消息队列,用于存储还未被消费者消费的消息. Message:由Header和body组成,Header是由生产者添加的各种属性的集合,包括Message是否被持久化、优先级是多少、由哪个Message Queue接收等.body是真正需要发送的数据内 容.
BindingKey:绑定关键字,将一个特定的Exchange和一个特定的Queue绑定起来.

2.4RabbitMQ在企业项目中使用场景:

有一个商城项目,可以使用RabbitMQ来实现以下场景:

  1. 异步订单处理:当用户下单后,可以将订单信息封装成消息发送到订单队列中。然后由消费者异步地进行订单处理,例如库存扣减、物流跟踪等。这样可以提高系统的响应速度和可靠性。

  2. 库存同步:在商城项目中,库存是一个重要的资源。可以使用RabbitMQ来实现库存同步,例如将库存变更的消息发送到库存队列中,然后由消费者将库存信息同步到数据库中。

  3. 商品推荐:在商城项目中,推荐系统是一个重要的组件。可以使用RabbitMQ来实现商品推荐的场景,例如将用户浏览历史封装成消息发送到推荐队列中,然后由推荐引擎进行商品推荐。

  4. 优惠券发放:在商城项目中,优惠券是一种常见的促销方式。可以使用RabbitMQ来实现优惠券的发放,例如将优惠券信息封装成消息发送到优惠券队列中,然后由消费者将优惠券发放给符合条件的用户。

  5. 日志收集:商城项目通常需要进行大量的日志记录和统计。可以使用RabbitMQ来实现日志收集,例如将日志信息封装成消息发送到日志队列中,然后由消费者对日志进行分类、统计和分析。

2.5Docker安装部署RabbitMQ

下载镜像:

docker pull rabbitmq:management
docker run -d --name my-rabbitmq -p 5672:5672 -p 15672:15672 -v /home/rabbitmq:/var/lib/rabbitmq --hostname my-rabbitmq-host -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin --restart=always rabbitmq:management

--hostname:主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名)

-p:这里有两个端口

-e:指定环境变量: RABBITMQ_DEFAULT_VHOST:默认虚拟机名 RABBITMQ_DEFAULT_USER:默认的用户名

RABBITMQ_DEFAULT_PASS:默认用户名的密码

执行流程:用于在Docker中运行RabbitMQ的命令。它会创建一个名为"my-rabbitmq"的容器,并映射5672和15672端口到主机上,分别用于AMQP和管理界面访问。容器的数据存储在主机的"/home/rabbitmq"目录下,RabbitMQ的默认虚拟主机为"my_vhost",默认用户名和密码为"admin"。容器会在Docker启动时自动重启。

查看my-rabbitmq是否在运行:

docker logs my-rabbitmq

2.6创建springboot项目嵌套RabbitMQ

创建两级父子项目,父项目为maven项目mq1,子项目为springboot项目有两个provider,consumer

修改application的配置

consumer.application

server:port: 9999
spring:application:name: xxrabbitmq:host: 192.168.124.131username: springbootpassword: 123456port: 5672virtual-host: my_vhost

provider.application

server:port: 8888
spring:application:name: xxrabbitmq:host: 192.168.124.131username: springbootpassword: 123456port: 5672virtual-host: my_vhost

这是一个创建MQ的方法

@Configuration
@SuppressWarnings("all")
public class RabbitConfig {
@Bean
public Queue firstQueue() {
return new Queue("firstQueue");
}
}
Queue("firstQueue");是内置方法

firstQueue是消息队列的名字。

导入指定的包:

AmqpTemplate pom文件中引入了

    @Autowiredprivate AmqpTemplate rabbitTemplate;@RequestMapping("/sender")@ResponseBodypublic String sendFirst() {rabbitTemplate.convertAndSend("firstQueue", "Hello World");return "zhu";}
传递字符串类型

访问:localhost:8888/sender

报错:Connection refused: connect

解决添加连接的账号密码:

检查:

继续访问:localhost:8888/sender

成功:

构建消费者 Consumer

传递实体类型

使用了@Autowired注解来自动注入AmqpTemplate和ObjectMapper对象。AmqpTemplate是Spring提供的一个操作RabbitMQ的工具,可以用来发送和接收消息。ObjectMapper是Jackson库提供的一个工具,可以用来将对象转换为JSON字符串,或者将JSON字符串转换为对象。
sender02方法创建了一个User对象,然后使用ObjectMapper将这个对象转换为JSON字符串,然后发送这个JSON字符串到名为secondQueue的队列中。消费者会接收指定的队列消息使用了log.warn来打印接收到的消息从而消费。

    @RequestMapping("/sender2")@ResponseBodypublic String sender2() {com.example.provide.User user = new com.example.provide.User("1", "1");rabbitTemplate.convertAndSend("secondQueue", user);return "zhu2";}

package com.example.consumer;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@SuppressWarnings("all")
@Component
@Slf4j
@RabbitListener(queues = "firstQueue")
public class SecondReceiver {@RabbitHandlerpublic void send(User user) {log.warn("接收到:" + user);}}

这里显示不能够这样传递:

原因是

 SimpleMessageConverter 这个类时,接收到了不支持的消息类型。SimpleMessageConverter 只支持 String、byte[] 和 Serializable 类型的消息内容

根据异常信息,你传递给它的消息内容是 com.example.provide.User 类型,因此引发了这个异常。你需要将消息内容转换为 SimpleMessageConverter 支持的类型。

生产者:

    @RequestMapping("/sender2")@ResponseBodypublic String sender2() throws JsonProcessingException {User user = new User("1", "1");// 序列化对象转换为JSON字符串String json = objectMapper.writeValueAsString(user);rabbitTemplate.convertAndSend("secondQueue", json);return "zhu2";}

实体:注意实现Serializable

package com.example.provide;import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import lombok.NoArgsConstructor;import java.io.Serializable;@SuppressWarnings("all")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
private String username;
private String userpwd;
}

访问响应:

    @RequestMapping("/sender2")@ResponseBodypublic String sender2() throws JsonProcessingException {User user = new User("1", "1");// 序列化对象转换为JSON字符串String json = objectMapper.writeValueAsString(user);rabbitTemplate.convertAndSend("secondQueue", json);return "zhu2";}

消费者:

@Component
@Slf4j
@RabbitListener(queues = "secondQueue")
public class SecondReceiver {@Autowiredprivate ObjectMapper objectMapper;@RabbitHandlerpublic void send(String json) throws JsonProcessingException {User user = objectMapper.readValue(json, User.class);// 处理user对象log.warn("接收到:" + user.toString());}

实体:注意实现Serializable

package com.example.consumer;import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;import java.io.Serializable;@SuppressWarnings("all")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
private String username;
private String userpwd;
}

@Component
@Slf4j
@RabbitListener(queues = "secondQueue")
public class SecondReceiver {@Autowiredprivate ObjectMapper objectMapper;@RabbitHandlerpublic void send(String json) throws JsonProcessingException {User user = objectMapper.readValue(json, User.class);// 处理user对象log.warn("接收到:" + user.toString());}

访问测试:

总结:

为什么使用消息队列?

答:1.业务解耦,2实现异步,3.流量削峰填谷(时间换空间)

消息队列:同步与异步差异
    同步:
        优点:时效性强,立即得到结果
        缺点:1.耦合度高(加业务导致改代码困难)
、                2.性能:每次执行调用需要等待上一个进程走完之后才进行
                    3.cpu资源浪费,等待需要执行后再执行
                    4.练级失败,一个服务或者进程甭溃,会导致集体阵亡

    异步:
         优点:1.降低耦合度,2.cpu资源运用合理,3.流量削峰填谷(时间换空间)
         缺点:效率没有同步高

                认真写博客的人,见一个少一个🤩🤩🤩🤩🤩🤩🤩🤩🤩

                           👍 点赞支持,⭐️ 收藏学习,❤️ 关注不迷路~
                                            💬 如有错漏请不吝指正~

平顶山大师-CSDN博客
https://blog.csdn.net/m0_73647713?spm=1011.2266.3001.5343

相关文章:

Message queue 消息队列--RabbitMQ 【基础入门】

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是平顶山大师,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《Message queue 消息队列--RabbitMQ 【基础入门…...

【汇编】 13.3 对int iret和栈的深入理解

书中示例 assume cs:codecode segment start:mov ax,csmov ds,axmov si,offset lpmov ax,0mov es,axmov di,200hmov cx,offset end0-offset lpcldrep movsb ;lp到end0的指令传送到0:200处mov ax,0mov es,axmov word ptr es:[7ch*4],200hmov word ptr es:[7ch*42],0 ;设置7c表项…...

Git提交大文件报错“remote: Please remove the file from history and try again. ”

如在使用Git过程中不小心将较大的二进制文件加入仓库,那么仓库大小很快就会超过规定的配额,在Push的时候会报下面的错误: remote: Powered by GITEE.COM [GNK-6.4] remote: error: File: c91e5de4f55bedd0669db01036fc131ea8e516ce 130.66 MB…...

接口测试 03 -- 接口自动化思维 Requests库应用

1. 接口自动化思维梳理 1.1接口自动化的优点 接口测试自动化,简单来讲就是功能测试用例脚本化然后执行脚本,产生一份可视化测试报告。不管什么样的测试方式,都是为了验证功能与发现 BUG。那为什么要做接口测试自动化呢?一句话概括…...

SpringBoot:Bean生命周期自定义初始化和销毁

🏡浩泽学编程:个人主页 🔥 推荐专栏:《深入浅出SpringBoot》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 🛸学无止境,不骄不躁,知行合一 文章目录 前言一、Bean注解指…...

Git--基本操作介绍(2)

Git 常用的是以下 6 个命令:git clone、git push、git add 、git commit、git checkout、git pull. 说明: workspace:工作区staging area:暂存区/缓存区local repository:版本库或本地仓库remote repository&#xf…...

第08章_面向对象编程(高级)(static,单例设计模式,理解mian方法,代码块,final,抽象类与抽象方法,接口,内部类,枚举类,注解,包装类)

文章目录 第08章_面向对象编程(高级)本章专题与脉络1. 关键字:static1.1 类属性、类方法的设计思想1.2 static关键字1.3 静态变量1.3.1 语法格式1.3.2 静态变量的特点1.3.3 举例1.3.4 内存解析 1.4 静态方法1.4.1 语法格式1.4.2 静态方法的特点1.4.3 举例 1.5 练习 …...

Java中Map接口常用的方法

java.util.Map接口中常用的方法: 1.Map和Collection没有继承关系 2.Map集合以key和value的方式存储数据:键值对 key和value都是引用数据类型 key和value都是存储对象的内存地址 key起到主导的地位,value是key的一个附属品 3.Map接口中常用的方…...

Linux软件包管理器yum

文章目录 前言概述Linux下载软件的三种方式源代码安装rpm安装yum安装 关于yum的相关操作查看软件包软件安装卸载软件 yum源问题 前言 在Windows系统中,如果我们要去下载软件,我们可以在该软件的官网中进行下载,或者在微软的额软件商店进行下…...

Linux中NFS服务器的搭建和安装

1.介绍: 网络文件系统即将本地系统放在网络上某一个位置的系统,基于UDP/IP使用nfs能够在不同计算机之间通过网络进行文件共享,能使使用者访问网络上其他计算机中的文件就像在访问自己的计算机一样,也就是说放在一个开发板上&#…...

c递归算法模型

使用递归算法模型可以较为自然地解决许多问题,尤其是对于那些数据结构层次比较清晰的问题,递归算法模型往往能够提供一种简单清晰的解法。 递归算法模型的核心思想是将一个大问题通过递归的方式拆分为若干个较小的问题,并不断递归下去直到问…...

力扣740. 删除并获得点数

动态规划 思路: 选择元素 x,获得其点数,删除 x 1 和 x - 1,则其他的 x 的点数也会被获得;可以将数组转换成一个有序 map,key 为 x, value 为对应所有 x 的和;则问题转换成了不能同…...

spring和springboot的区别

在当今的软件开发领域,Spring和Spring Boot无疑是Java开发者最常用的框架之一。尽管它们都源于Spring项目,但它们在设计和使用上有很大的不同。本文将深入探讨Spring和Spring Boot之间的主要区别,以及为什么有时候选择其中一个而不是另一个是…...

imgaug库图像增强指南(35):【iaa.Fog】——轻松创建自然雾气场景

引言 在深度学习和计算机视觉的世界里,数据是模型训练的基石,其质量与数量直接影响着模型的性能。然而,获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此,数据增强技术应运而生,成为了解决这一问题的…...

网络安全--防御保护02

第二天重要的一个点是区域这个概念 防火墙的主要职责在于控制和防护---安全策略---防火墙可以根据安全策略来抓取流量之后做出对应的动作 防火墙的分类: 单一主机防火墙:专门有设备作为防火墙 路由集成:核心设备,可流量转发 分…...

UE5 C++学习笔记 常用宏的再次理解

1.随意创建一个类,他都有UCLASS()。GENERATED_BODY()这样的默认的宏。 UCLASS() 告知虚幻引擎生成类的反射数据。类必须派生自UObject. (告诉引擎我是从远古大帝UObject中,继承而来,我们是一家人,只是我进化了其他功能…...

SpringBoot整合SSE

目录 1.SseController2. SseServiceSseServiceSseServiceImpl 3.SendMessageTask4.将定时任务加入启动类5.参考资料 1.SseController Slf4j RestController RequestMapping("sse") public class SseController {Autowiredprivate SseService sseService;RequestMappi…...

mysql-进阶篇

文章目录 存储引擎MySQL体系结构相关操作 存储引擎特点InnoDBInnoDB 逻辑存储结构 MyISAMMemory三个存储引擎之间的区别存储引擎的选择 索引1. 索引结构B-TreeB-Tree (多路平衡查找树)B-Tree演变过程 BTree与 B-Tree 的区别BTree演变过程 Hash 2.索引分类3.索引语法演示 4.SQL性…...

Js中的构造函数

在JavaScript中,构造函数是一种特殊类型的方法,用于创建并初始化一个新的对象。它通常使用 new 关键字来调用,并且通常以大写字母开头,以与其他非构造函数区分开来。 一个简单的构造函数示例: function Person(name,…...

[小程序]页面事件

一、下拉刷新 1.开启和配置 小程序中开启下拉刷新的方式有两种: ①全局开启下来刷新 在app.json的window节点中,设置enablePullDownRefresh设为ture。 ②局部开启下来刷新 在页面对应的json文件的的window节点中,设置enablePullDownRefresh设…...

vue echarts地图

下载地图文件: DataV.GeoAtlas地理小工具系列 范围选择器右侧行政区划范围中输入需要选择的省份或地市,选择自己想要的数据格式,这里选择了geojson格式,点右侧的蓝色按钮复制到浏览器地址栏中,打开的geojson文件内容…...

v38.Switch语句

1.Switch语句可以替代if-else语句 2.具体使用 Switch(expression) { case label:...... } ①将x与case后的label 进行比较; ②注意后面有冒号; ③从上往下开始检查case; ④如果…...

如何进行产品的人机交互设计?

产品的人机交互设计是指通过用户界面和用户体验设计来优化产品与用户之间的交互过程,从而提高产品的易用性、可用性和用户满意度。人机交互设计需要考虑用户的需求、行为模式、心理感受以及技术实现,下面我将介绍如何进行产品的人机交互设计。 首先&…...

【ARMv8M Cortex-M33 系列 7.3 -- EXC_RETURN 与 LR 及 PC 的关系详细介绍】

请阅读【嵌入式开发学习必备专栏 之 ARM Cortex-Mx专栏】 文章目录 背景EXC_RETURN 与 LR 及 PCcortex-m33 从异常返回后 各个寄存器出战顺序ARM 栈增长方式 背景 接着上篇文章:【ARMv8M Cortex-M33 系列 7.2 – HardFault 问题定位 1】,后面定位到是在…...

Linux之权限(内容详细,细节满满)

个人主页:点我进入主页 专栏分类:C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 Linux 欢迎大家点赞,评论,收藏。 一起努力 目录 一.前言 二.权限修改的两种方法 …...

了解云工作负载保护:技术和最佳实践

云工作负载是指云环境中的应用程序或存储元素,无论是公共云、私有云还是混合云。每个云工作负载都使用云的资源,包括计算、网络和存储。 云工作负载可以多种多样,例如运行应用程序、数据库或托管网站。它们可以是静态的或动态的,…...

【Godot4自学手册】第三节设置主人公的动画

继续,今天是第三节,我们主要实现主人公的动画效果,共有两种方法实现动画效果 一、通过AnimationPlayer节点实现动画效果 我们首先在player场景下,player节点下添加AnimationPlayer节点,添加方法是,在play…...

excel学习1

直接ctrl cctrl v会报错位移选择粘贴时用123那个数字粘贴而不是ctrl V 只要结果不要公式 上面复制的为数值这里是复制的公式他们两个不一样 这个方法太麻烦了直接用格式刷,选择一个区域一个单元格,不要选择多个一刷就出来了 第一个计算后向下拖就行了&…...

裁员致谷歌中国籍程序员身亡,技术变革下裁员对程序员的影响有多大

裁员,这是一个令无数人心悸的词汇。在瞬息万变的科技时代,裁员仿佛成了不少公司应对困境的“救命稻草”。然而,在这背后,每一名员工,每一个程序员,他们所承担的代价,又有多少人能够深切地理解&a…...

MybatisPlus的主键ID生成策略和公共字段自动填充的使用及注意事项

主键策略(ID自动生成) 以下是MyBatis-Plus中常见的几种主键生成策略及其对应的枚举值(3.3.0之前的版本): 主键生成策略枚举值数据库自增IdType.AUTO用户输入IdType.INPUT分布式全局唯一IDIdType.ID_WORKER分布式全局…...