RabbitMQ进阶篇【理解➕应用】

🥳🥳Welcome 的Huihui's Code World ! !🥳🥳

接下来看看由辉辉所写的关于RabbitMQ的相关操作吧

目录

🥳🥳Welcome 的Huihui's Code World ! !🥳🥳

 

一.什么是交换机

1.概念释义 

2.例子理解

3.例子分析

二.交换机有哪些类型

1.扇形交换机 Fanout  Exchange

2.直连交换机 Direct Exchange

3.主题交换机 Topic Exchange

4.首部交换机 Headers Exchange

5.默认交换机 Default  Exchange

6.死信交换机 Dead Letter Exchange

三.为什么要使用交换机

四.怎么使用交换机【demo演示】

1.直连交换机

生产者

消费者

测试

效果

2.主题交换机

生产者

消费者

测试

效果

3.扇形交换机

生产者

消费者

测试

效果


一.什么是交换机

1.概念释义 

        RabbitMQ交换机是RabbitMQ消息队列中间件的一部分,它负责接收生产者发送的消息并将其路由到相应的队列中,以便消费者可以消费这些消息。

        交换机通过绑定键(Binding Key)将自身与一个或多个队列关联起来,并根据消息的路由键(Routing Key)将消息发送到匹配的队列中。它起到了消息路由的作用,类似于邮局中的分拣员,根据信件的地址将信件分发到正确的邮箱中。

⭐⭐言简意赅的总结一下:交换机就是作为一个中间过渡的角色,通过绑定键和队列产生关联,然后再通过路由键与具体匹配到的队列进行信息传递


2.例子理解

        我们知道,邮局是一个信件传递的中介,它负责将寄信人发送的信件分发到收信人的邮箱中。

但是,如果邮局没有分拣员的话,就无法将信件准确地分发到相应的邮箱中,这时候,很可能会出现信件丢失或者送错邮箱的情况。

那么,在邮局中,分拣员的作用就是将寄信人发送的信件按照地址、邮编等信息进行分类和筛选,然后将信件分发到相应的邮箱中。这样,每个收信人就可以收到自己的信件了。


3.例子分析

在RabbitMQ中,交换机的作用就类似于邮局中的分拣员。它接收生产者(寄信人)发送的消息(信件),并根据消息的路由键(地址、邮编等信息)将消息分发到相应的队列(邮箱)中,以便消费者(收信人)可以消费这些消息。

二.交换机有哪些类型

1.扇形交换机 Fanout  Exchange

        扇形交换机是最基本的交换机类型,它所能做的事情非常简单———广播消息。扇形交换机会把能接收到的消息全部发送给绑定在自己身上的队列。因为广播不需要“思考”,所以扇形交换机处理消息的速度也是所有的交换机类型里面最快的。【就相当于我们群发祝福消息给他人一样】

2.直连交换机 Direct Exchange

直连交换机是最简单的交换机类型,它的算法超级简单,将消息中的 Routing Key 匹配队列中的Binding Key。如果没有匹配的队列,消息将会被丢弃。

比如下面的这张图,如果消息的路由键是orange,就会将消息给到Q1队列处理,如果路由键是blank或者green,就会将消息给到Q2队列处理。

        而且同一个绑定键可以绑定多个不同的队列,当绑定了多个队列时,消息也会被发送到多个队列中,就像下面这张图一样,如果现在有一个消息的路由键时black,那么这个消息将会同时被推送到Q1和Q2这两个队列中。【有点像扇形交换机了】

        ⭐⭐虽然说这样能够实现出像扇形交换机那样的群发效果,但是如果我们真的在实际开发中用直连交换机来完成群发的功能,那么我们就需要在这个交换机上面绑定非常多的路由键,如果每个交换机上面都绑定了一堆的路由键,那么到了消息管理的这趴就会变的很困难...

3.主题交换机 Topic Exchange

        主题交换机(Topic Exchange)是一种灵活而强大的交换机类型。它通过将消息的

路由键与绑定的队列的主题模式进行匹配来确定消息应该发送到哪些队列中。主题模式是一个字符串,可以包含通配符 "*" 和 "#"。它使用类似于正则表达式的主题匹配规则来将消息路由到一个或多个队列中。

  • "" 用于匹配一个单词,例如 "topic." 可以匹配 "topic.a"、"topic.b",但不匹配 "topic.a.b"。
  • "#" 用于匹配零个或多个单词,例如 "topic.#" 可以匹配 "topic.a"、"topic.a.b"、"topic.a.b.c" 等。

为了有画面感一点,好理解一点,这里也使用文字+图片的方式举个例子

  •  RoutingKey:wh.orange.xw------Q1
  •  RoutingKey:wh.orange.rabbit------Q1,Q2
  •  RoutingKey:wh.bb.rabbit------Q2
  •  RoutingKey:lazy.wh------Q2
  •  RoutingKey:lazy.wh.rabbit------Q2
  •  RoutingKey:lazy.orange.wh------Q1,Q2
  •  RoutingKey:lazy.orange.rabbit------Q1,Q2

⭐⭐上面说到了主题交换机是使用类似于正则表达式的主题匹配规则来将消息路由到一个或多个队列中,但是其中也有一些特殊的极限情况👇👇

  1. 当一个队列的绑定键是#,它将会接收所有的消息,而不再考虑所接收消息的路由键
  2. 当一个队列的绑定键没有用到#和*时,它就像直连交换机一样工作

4.首部交换机 Headers Exchange

        首部交换机和扇形交换机都不需要路由键,交换机时通过Headers头部来将消息映射到队列的,有点像HTTP的Headers.

        Hash结构中要求携带一个键"x-match",这个键的value可以是any或者all

  • all:在发布消息时携带的所有Entry必须和绑定在队列上的所有Entry完全匹配
  • any:只要发布消息时携带的有一对键值对headers满足队列定义的多个参数arguments的其中一个就能匹配上,注意这里是键值对的完全匹配,只要匹配到键,值却是不一样的

5.默认交换机 Default  Exchange

        实际上默认交换机是一个由RabbitMQ预先声明好的名字为空字符串的直连交换机(direct exchange)。它有一个特殊的属性使得它对于简单应用特别有用处:那就是每个新建队列(queue)都会自动绑定到默认交换机上,绑定的路由键(routing key)名称与队列名称相同。

       类似amq.*的名称的交换机:这些是RabbitMQ默认创建的交换机。这些队列名称被预留做RabbitMQ内部使用,不能被应用使用,否则抛出403 (ACCESS_REFUSED)错误 


例如当你声明了一个名为”hello”的队列,RabbitMQ会自动将其绑定到默认交换机上,绑定的路由键名称也是为”hello”。因此,当携带着名为”hello”的路由键的消息被发送到默认交换机的时候,此消息会被默认交换机路由至名为”hello”的队列中。

6.死信交换机 Dead Letter Exchange

        在默认情况,如果消息在投递到交换机时,交换机发现此消息没有匹配的队列,则这个消息将被悄悄丢弃。为了解决这个问题,RabbitMQ中有一种交换机叫死信交换机。当消费者不能处理接收到的消息时,将这个消息重新发布到另外一个队列中,等待重试或者人工干预。这个过程中的exchange和queue就是所谓的”Dead Letter Exchange 和 Queue

        通常以下这样的消息会变成死信消息

  • 消息被拒绝,并且设置 requeue 参数为 false
  • 消息过期(默认情況下 Rabbit 中的消息不过期,但是可以设置队列的过期时间和消息的过期时间以达到消息过期的效果)
  • 队列达到最大长度(一般当设置了最大队列长度或大小并达到最大值时)


例如下图:生产者生产一条1分钟后超时的订单消息到正常交换机exchange-a中,消息匹配到队列queue-a,但一分钟后仍未消费。 此时消息就会被投递到死信交换机dlxy-exchange中,并发送到死信队列中, 死信队列dlx-queue的消费者拿到消息后,根据消息去查询订单的状态,如果仍然是未支付状态,就将订单状态更新为超时状态。

三.为什么要使用交换机

使用交换机的主要目的是实现消息的路由和分发,确保消息能够准确地传递到目标队列中。

  1. 路由功能:交换机可以根据消息的路由键将消息发送到相应的队列中。这样,生产者就可以根据消息的属性或标签来指定消息要发送到哪个队列,从而实现灵活的消息路由和过滤。

  2. 解耦合:交换机可以将生产者和消费者解耦合。生产者只需要将消息发送到交换机,而不需要关注具体的队列。消费者只需要从队列中接收消息,而不需要知道消息是如何被发送到队列的。这样,生产者和消费者之间可以独立地进行开发和扩展,提高系统的可维护性和可扩展性。

  3. 多播和广播:使用交换机可以实现消息的多播和广播。多播是指将一条消息发送到多个队列,而广播是指将一条消息发送到所有绑定了交换机的队列。这样,在某些场景下,可以方便地实现消息的复制、分发和通知。

  4. 灵活性和可扩展性:通过使用交换机,可以轻松地增加、删除和修改队列之间的消息路由规则。这样,系统可以根据实际需求进行动态调整,而不需要修改生产者和消费者的代码。

四.怎么使用交换机【demo演示】

1.直连交换机

生产者

package com.example.publisher;import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@SuppressWarnings("all")
public class RabbitExchange {// 创建一个名为"direct-queue"的队列@Beanpublic Queue directQueue() {return new Queue("direct_queue");}// 创建一个名为"direct-exchange"的直连交换机,设置为持久化,不发布消息到交换器@Beanpublic DirectExchange directExchange() {return new DirectExchange("direct_exchange", true, false);}// 将队列绑定到直连交换机,并指定路由键为"direct_routing_key"@Beanpublic Binding binding() {return BindingBuilder.bind(directQueue()).to(directExchange()).with("direct_routing_key");}}

消费者

package com.example.consumer;import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;import java.util.Map;@Component 
@RabbitListener(queues = {"direct-queue"}) // 监听名为"direct-queue"的队列
public class DirectReceiver {@RabbitHandlerpublic void handler(Map<String, Object> json) { // 参数为接收到的消息,类型为Map<String, Object>System.out.println(json); // 打印接收到的消息}
}

测试

package com.example.publisher.controller;import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;@RestController // 声明这是一个Spring控制器
public class Direct {@Autowired // 自动注入AmqpTemplate实例private AmqpTemplate rabbitTemplate;// 定义一个请求映射,当访问"/direct"路径时,调用sendData方法@RequestMapping("/direct")public String sendData() {// 创建一个Map对象,用于存储要发送的消息数据Map<String, Object> data = new HashMap<>();data.put("msg", "直连交换机"); // 将消息内容放入Map中// 使用rabbitTemplate的convertAndSend方法发送消息,指定交换机名称、路由键和消息数据rabbitTemplate.convertAndSend("direct_exchange", "direct_routing_key", data);// 返回一个字符串表示消息已发送return "😙😙";}
}

效果

访问测试的方法

2.主题交换机

生产者

package com.example.publisher;import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@SuppressWarnings("all")
public class RabbitExchange {// 定义路由规则public static String A_KEY = "*.orange.*";public static String B_KEY = "*.* rabbit";public static String C_KEY = "lazy.#";/*** 定义队列* @return*/@Beanpublic Queue Topicqueue() {return new Queue("topic-queue", true);}/*** 定义主题交换机* @return*/@Beanpublic TopicExchange topicExchange() {return new TopicExchange("topic-exchange", true, false);}/*** 将队列与交换机进行绑定,并设置路由键* @return*/@Beanpublic Binding bindingA() {return BindingBuilder.bind(Topicqueue()).to(topicExchange()).with(A_KEY);}}

消费者

package com.example.consumer.exchange;import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;import java.util.Map;// 定义一个名为TopicReceiver的类,用于接收RabbitMQ消息
@Component
@RabbitListener(queues = {"topic-queue"})
public class TopicReceiver {// 使用@RabbitHandler注解标记handler方法,用于处理接收到的消息@RabbitHandlerpublic void handler(Map<String,Object> json){// 打印接收到的消息System.out.println(json);}}

测试

package com.example.publisher.controller;import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;// 定义一个名为Sender的类,用于发送消息到RabbitMQ
@RestController
public class Topic {// 自动注入AmqpTemplate对象,用于发送消息@Autowiredprivate AmqpTemplate rabbitTemplate;// 定义一个名为sendTopic的方法,用于发送主题消息@RequestMapping("/sendTopic")public String sendTopic() {// 创建一个Map对象,用于存储消息内容Map<String,Object> data=new HashMap<>();data.put("msg","主题交换机");// 使用rabbitTemplate的convertAndSend方法发送消息,指定交换机名称、路由键和消息内容rabbitTemplate.convertAndSend("topic-exchange","aa.orange.bb", data);// 返回一个字符串表示发送成功return "😙😙";}
}

效果

3.扇形交换机

生产者

package com.example.publisher;import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@SuppressWarnings("all")
public class RabbitExchange {// 定义一个名为queueX的队列,用于接收消息@Beanpublic Queue queueX() {return new Queue("queue-x");}// 定义一个名为queueY的队列,用于接收消息@Beanpublic Queue queueY() {return new Queue("queue-y");}// 定义一个名为queueZ的队列,用于接收消息@Beanpublic Queue queueZ() {return new Queue("queue-z");}/*** 定义扇形交换机,与路由键无关* @return*/@Beanpublic FanoutExchange fanoutExchange() {return new FanoutExchange("fanout-exchange", true, false);}// 将queueX绑定到fanoutExchange上@Beanpublic Binding bindingX() {return BindingBuilder.bind(queueX()).to(fanoutExchange());}// 将queueY绑定到fanoutExchange上@Beanpublic Binding bindingY() {return BindingBuilder.bind(queueY()).to(fanoutExchange());}// 将queueZ绑定到fanoutExchange上@Beanpublic Binding bindingZ() {return BindingBuilder.bind(queueZ()).to(fanoutExchange());}}

消费者

package com.example.consumer.exchange;import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;import java.util.Map;@Component
public class FanoutReceiver {// 监听队列queue-x的消息,当接收到消息时,调用handlerY方法处理@RabbitListener(queues = {"queue-x"})@RabbitHandlerpublic void handlerY(Map<String,Object> json){System.out.println("已接受到队列queue-x传递过来的消息:"+json);}// 监听队列queue-y的消息,当接收到消息时,调用handlerX方法处理@RabbitListener(queues = {"queue-y"})@RabbitHandlerpublic void handlerX(Map<String,Object> json){System.out.println("已接受到队列queue-y传递过来的消息:"+json);}// 监听队列queue-z的消息,当接收到消息时,调用handlerZ方法处理@RabbitListener(queues = {"queue-z"})@RabbitHandlerpublic void handlerZ(Map<String,Object> json){System.out.println("已接受到队列queue-z传递过来的消息:"+json);}
}

测试

package com.example.publisher.controller;import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;@RestController
public class Fanout {// 自动注入AmqpTemplate对象@Autowiredprivate AmqpTemplate rabbitTemplate;// 定义发送扇形交换机消息的方法@RequestMapping("/sendFanout")public String sendFanout() {// 创建一个Map对象,用于存储消息数据Map<String,Object> data=new HashMap<>();data.put("msg","扇形交换机");// 使用rabbitTemplate的convertAndSend方法发送消息,指定交换机名称和路由键(这里为null,表示不指定路由键)rabbitTemplate.convertAndSend("fanout-exchange",null, data);// 返回一个字符串,表示发送成功return "😙😙;";}
}

效果

好啦,今天的分享就到这了,希望能够帮到你呢!😊😊  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/247072.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web前端-------伪类和伪元素

但是&#xff0c;网页中一些特殊的样式&#xff0c;需要用到特殊的CSS选择器来设置。&#xfeff;在CSS中&#xff0c;我们把这类选择器称为伪选择器。 伪选择器&#xff0c;分为伪类选择&#xfeff;器和伪元素选择器两个大类。 伪类选择器&#xff0c;简称伪类&#xff1b;…

【贪吃蛇:C语言实现】

文章目录 前言1.了解Win32API相关知识1.1什么是Win32API1.2设置控制台的大小、名称1.3控制台上的光标1.4 GetStdHandle&#xff08;获得控制台信息&#xff09;1.5 SetConsoleCursorPosition&#xff08;设置光标位置&#xff09;1.6 GetConsoleCursorInfo&#xff08;获得光标…

【DeepLearning-8】MobileViT模块配置

完整代码&#xff1a; import torch import torch.nn as nn from einops import rearrange def conv_1x1_bn(inp, oup):return nn.Sequential(nn.Conv2d(inp, oup, 1, 1, 0, biasFalse),nn.BatchNorm2d(oup),nn.SiLU()) def conv_nxn_bn(inp, oup, kernal_size3, stride1):re…

接口测试入门,如何划分接口文档

1.首先最主要的就是要分析接口测试文档&#xff0c;每一个公司的测试文档都是不一样的。具体的就要根据自己公司的接口而定&#xff0c;里面缺少的内容自己需要与开发进行确认。 我认为一针对于测试而言的主要的接口测试文档应该包含的内容分为以下几个方面。 a.具体的一个业…

一文深度解读多模态大模型视频检索技术的实现与使用

当视频检索叠上大模型Buff。 万乐乐&#xff5c;技术作者 视频检索&#xff0c;俗称“找片儿”&#xff0c;即通过输入一段文本&#xff0c;找出最符合该文本描述的视频。 随着视频社会化趋势以及各类视频平台的快速兴起与发展&#xff0c;「视频检索」越来越成为用户和视频平…

JVM/GC复习

JVM/GC JVM(java虚拟机)MATjstack(将正在运行的JVM的线程进行快照并且打印出来)死锁VisualVM工具(监控线程内存使用情况)JMX分析堆日志什么情况下可能需要JVM调优补充JVM内部结构JVM 调优策略(补充) GC垃圾回收算法1.引用计数法2.标记清除发3.标记压缩算法4.复制算法5.分代算法…

NQA测试机制—UDP Jitter测试

概念 UDP Jitter是以UDP报文为承载&#xff0c;通过记录在报文中的时间戳信息来统计时延、抖动、丢包的一种测试方法。Jitter&#xff08;抖动时间&#xff09;是指相邻两个报文的接收时间间隔减去这两个报文的发送时间间隔。 UDP Jitter测试的过程如下&#xff1a; 1. 源端&a…

ORA-12528: TNS: 监听程序: 所有适用例程都无法建立新连

用了网上的办法&#xff1a; 1、修改listener.ora的参数,把动态的参数设置为静态的参数,红色标注部分 位置D:\oracle\product\10.2.0\db_1\NETWORK\ADMIN SID_LIST_LISTENER (SID_LIST (SID_DESC (SID_NAME PLSExtProc) (ORACLE_HOME D:\oracle\produ…

day34WEB 攻防-通用漏洞文件上传黑白盒审计逻辑中间件外部引用

目录 一&#xff0c;白盒审计-Finecms-代码常规-处理逻辑 黑盒思路&#xff1a;寻找上传点抓包修改突破获取状态码及地址 审计流程&#xff1a;功能点-代码文件-代码块-抓包调试-验证测试 二&#xff0c;白盒审计-CuppaCms-中间件-.htaccess 三&#xff0c;白盒审计-Metin…

3个精美的wordpress律师网站模板

暗红色WordPress律师事务所网站模板 演示 https://www.zhanyes.com/qiye/23.html 暗橙色WordPress律师网站模板 演示 https://www.zhanyes.com/qiye/18.html 红色WordPress律所网站模板 演示 https://www.zhanyes.com/qiye/22.html

机器学习第一个项目-----鸢尾花数据集加载及报错解决

项目步骤 如刚开始做&#xff0c;从 “项目开始” 看&#xff1b; 如遇到问题从 “问题” 开始看&#xff1b; 问题 报错如下 ModuleNotFoundError: No module named sklearn解决过程 查看官网&#xff0c;感觉可能是python版本和skilearn版本不匹配&#xff0c;更新一下p…

JVM-字节码文件的组成

Java虚拟机的组成 Java虚拟机主要分为以下几个组成部分&#xff1a; 类加载子系统&#xff1a;核心组件类加载器&#xff0c;负责将字节码文件中的内容加载到内存中。 运行时数据区&#xff1a;JVM管理的内存&#xff0c;创建出来的对象、类的信息等等内容都会放在这块区域中。…

静态代理IP该如何助力Facebook多账号注册运营?

在Facebook运营中&#xff0c;充分利用静态代理IP是多账号运营的关键一环。通过合理运用静态代理IP&#xff0c;不仅可以提高账号安全性&#xff0c;还能有效应对Facebook的算法和限制。以下是这些关键点&#xff0c;可以帮助你了解如何运用静态代理IP进行Facebook多账号运营&a…

Linux下的进程操作

进程概念 ps -elf&#xff1a;查看操作系统的所有进程&#xff08;Linux命令&#xff09; ctrl z&#xff1a;把进程切换到后台 crtl c&#xff1a;结束进程 fg&#xff1a;把进程切换到前台 获取进程进程号和父进程号 函数原型&#xff1a; pid_t getpid(void); //pid_t…

Java服务端使用freemarker+wkhtmltoimage生成Echart图片

目录 1.通过 freemarker 将ftl转成html 1.1 freemarker 手册: 1.2 添加freemarker maven依赖 1.3 添加 echart-test.ftl 模版文件 1.4 添加 FreemarkerTool 工具类 1.5 添加测试main方法 1.6 运行,生成echart-test-时间戳.html 文件 2. 通过wkhtmltoimage将html 转为p…

Java项目实战--瑞吉外卖DAY03

目录 P22新增员工_编写全局异常处理器 P23新增员工_完善全局异常处理器并测试 p24新增员工_小结 P27员工分页查询_代码开发1 P28员工分页查询_代码开发2 P22新增员工_编写全局异常处理器 在COMMON新增全局异常捕获的类&#xff0c;其实就是代理我们这些controlle。通过aop把…

TikTok直播对网络环境的要求是怎么样的

TikTok直播作为一种互动性强、实时性要求高的社交媒体形式&#xff0c;对网络环境有着一系列特定的需求。了解并满足这些需求&#xff0c;对于确保用户体验、提高直播质量至关重要。本文将深入探讨TikTok直播对网络环境的要求以及如何优化网络设置以满足这些要求。 TikTok直播的…

docker环境搭建及其安装常用软件

centos安装docker Install Docker Engine on CentOS | Docker Docs 下载docker sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install -y docker-ce docker-ce-cli containerd.io…

x-cmd pkg | go - Google 开发的开源编程语言

目录 简介首次用户技术特点竞品分析编译型语言解释型语言JavaWebAssebmly 进一步阅读 简介 Go 语言&#xff08;或 Golang&#xff09;是 Google 开发的开源编程语言&#xff0c;诞生于 2006 年。其设计目标是“兼具 Python 等动态语言的开发速度和 C/C 等编译型语言的性能与安…

万字图解 | 深入揭秘HTTP工作原理

大家好&#xff0c;我是「云舒编程」&#xff0c;今天我们来聊聊计算机网络面试之-(应用层HTTP)工作原理。 文章首发于微信公众号&#xff1a;云舒编程 关注公众号获取&#xff1a; 1、大厂项目分享 2、各种技术原理分享 3、部门内推 前言 想必不少同学在面试过程中&#xff0…