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"的队列
    @Bean
    public Queue directQueue() {
        return new Queue("direct_queue");
    }

    // 创建一个名为"direct-exchange"的直连交换机,设置为持久化,不发布消息到交换器
    @Bean
    public DirectExchange directExchange() {
        return new DirectExchange("direct_exchange", true, false);
    }

    // 将队列绑定到直连交换机,并指定路由键为"direct_routing_key"
    @Bean
    public 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 {

    @RabbitHandler
    public 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
     */
    @Bean
    public Queue Topicqueue() {
        return new Queue("topic-queue", true);
    }

    /**
     * 定义主题交换机
     * @return
     */
    @Bean
    public TopicExchange topicExchange() {
        return new TopicExchange("topic-exchange", true, false);
    }

    /**
     * 将队列与交换机进行绑定,并设置路由键
     * @return
     */
    @Bean
    public 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方法,用于处理接收到的消息
    @RabbitHandler
    public 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对象,用于发送消息
    @Autowired
    private 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的队列,用于接收消息
    @Bean
    public Queue queueX() {
        return new Queue("queue-x");
    }

    // 定义一个名为queueY的队列,用于接收消息
    @Bean
    public Queue queueY() {
        return new Queue("queue-y");
    }

    // 定义一个名为queueZ的队列,用于接收消息
    @Bean
    public Queue queueZ() {
        return new Queue("queue-z");
    }

    /**
     * 定义扇形交换机,与路由键无关
     * @return
     */
    @Bean
    public FanoutExchange fanoutExchange() {
        return new FanoutExchange("fanout-exchange", true, false);
    }

    // 将queueX绑定到fanoutExchange上
    @Bean
    public Binding bindingX() {
        return BindingBuilder.bind(queueX())
                .to(fanoutExchange());
    }

    // 将queueY绑定到fanoutExchange上
    @Bean
    public Binding bindingY() {
        return BindingBuilder.bind(queueY())
                .to(fanoutExchange());
    }

    // 将queueZ绑定到fanoutExchange上
    @Bean
    public 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"})
    @RabbitHandler
    public void handlerY(Map<String,Object> json){
        System.out.println("已接受到队列queue-x传递过来的消息:"+json);
    }

    // 监听队列queue-y的消息,当接收到消息时,调用handlerX方法处理
    @RabbitListener(queues = {"queue-y"})
    @RabbitHandler
    public void handlerX(Map<String,Object> json){
        System.out.println("已接受到队列queue-y传递过来的消息:"+json);
    }

    // 监听队列queue-z的消息,当接收到消息时,调用handlerZ方法处理
    @RabbitListener(queues = {"queue-z"})
    @RabbitHandler
    public 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对象
    @Autowired
    private 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.mfbz.cn/a/344259.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

揭秘亚信安慧AntDB15年平稳运行的升级改造经验

亚信安慧AntDB是一款备受认可的国产化数据库系统&#xff0c;它在国内市场中积累了丰富的升级改造经验。光是大的版本升级就已经实现了8次&#xff0c;让AntDB持续保持了15年的平稳运行。本文将深入探索AntDB的升级改造之路&#xff0c;揭示背后的细节。 AntDB作为一款自主研发…

k8s图形化管理工具rancher

Rancher和K8s的关系&#xff0c;Rancher和K8s区别对比。简单来说&#xff0c;K8s&#xff08;Kubernetes&#xff09;为企业提供了一种一致的方式来管理任何计算基础架构&#xff0c;Rancher则是用于管理位于任何位置的Kubernetes集群的完整平台。如果用户是自己手动部署K8s集群…

java web mvc-08-Grails 入门介绍

拓展阅读 Spring Web MVC-00-重学 mvc mvc-01-Model-View-Controller 概览 web mvc-03-JFinal web mvc-04-Apache Wicket web mvc-05-JSF JavaServer Faces web mvc-06-play framework intro web mvc-07-Vaadin web mvc-08-Grails 开源 The jdbc pool for java.(java …

2024年,AIGC赛道专利文献和软著大全

一、周红伟-深度学习国际发明专利 深度学习国际发明专利 基于深度学习的图像检索方法及装置&#xff0c;专利公开公告号&#xff1a;CN107368614A。专利类型&#xff1a;发明公布。发明人&#xff1a;周红伟;李凯;任伟;李庆;郭奇杰;周杨;刘川郁 二、机器学习算法发表文献 Simul…

多窗口大小和Ticker分组的Pandas滚动平均值

最近一个学弟在在进行数据分析时&#xff0c;经常需要计算不同时间窗口的滚动平均线。当数据是多维度的&#xff0c;比如包含多个股票或商品的每日价格时&#xff0c;我们可能需要为每个维度计算滚动平均线。然而&#xff0c;如果我们使用传统的groupby和apply方法&#xff0c;…

Pycharm运行提示(运行‘Python测试(00.py内)‘(u)

为什么有时候我在pycharm中运行代码会出现图片中的问题&#xff1f; 我们该如何改过来&#xff1f; 很简单 点击文件-设置 点击Python集成工具&#xff0c;在默认测试运行程序里修改为Unittest即可 再次运行代码就会显示正常的运行 你的pycharm可能是英文 如何英文变中文&…

第二证券:A股将迎“更加有力有效措施”

2024年开年以来&#xff0c;A股商场接连弱势格局&#xff0c;上证指数接连将2900点、2800点整数关口击穿。就在出资者缺少决心之际&#xff0c;商场总算迎来方针暖意。1月22日举行的国务院常务会议提出&#xff0c;要采纳愈加有力有用办法&#xff0c;促进本钱商场平稳健康开展…

MySQL JSON数据类型全解析(JSON datatype and functions)

JSON&#xff08;JavaScript Object Notation&#xff09;是一种常见的信息交换格式&#xff0c;其简单易读且非常适合程序处理。MySQL从5.7版本开始支持JSON数据类型&#xff0c;本文对MySQL中JSON数据类型的使用进行一个总结。 目录 一、MySQL中的JSON 1.1 JSON数据格式 1.2 …

Codeforces Round 812 (Div. 2) ---- C. Build Permutation --- 题解

目录 C. Build Permutation 题目描述&#xff1a; ​编辑 思路解析&#xff1a; 代码实现&#xff1a; C. Build Permutation 题目描述&#xff1a; 思路解析&#xff1a; 先证明在任何情况下答案均存在。 假设我们所求的为 m m1 m2.....n 的排列&#xff0c;我们称不小于n…

做跨境电商,为什么要建独立站,2024年的机会在哪里?一次性讲清楚...

近年来&#xff0c;跨境电商的商家们面临越来越大的平台政策压力&#xff0c;商家们纷纷把眼光聚焦到搭建独立站上&#xff0c;眼下独立站已经成为出海卖家的标配。那什么是“独立站”&#xff1f;对比平台电商&#xff0c;独立站又有什么优势&#xff1f;以及新手该如何入门独…

git的使用(idea中)

文章目录 Git分布式版本控制工具1、目标2、概述2.1、开发中的实际场景2.2、版本控制器的方式2.3、SVM2.4、Git2.5、Git工作流程 3、Git安装与常用命令3.1、Git环境配置3.1.1 下载与安装3.1.2基本配置3.1.3为常用指令配置别名(可选)3.1.4解决GitBash乱码问题 3.2、获取本地仓库3…

[足式机器人]Part2 Dr. CAN学习笔记- 最优控制Optimal Control Ch07

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记 - 最优控制Optimal Control Ch07-1最优控制问题与性能指标 1. 最优控制问题与性能指标2. 动态规划 Dynamic Programming2.1 基本概念2.2 代码详解2.3 简单一维案例 3. 线性二次型调节器&#xff…

notepad++: 插件fingertext 来创建代码块

下载 最新版可以软件里下&#xff0c;或者官网下 https://sourceforge.net/projects/fingertext/ 下了之后&#xff0c;解压压缩包&#xff0c;得到一个 .all 类型的文件&#xff0c;放在notepad 这个文件夹里&#xff1a; 使用 这样输入mod&#xff0c;再tab键&#xff0c;…

使用Unity创建VisionPro应用

1、下载特定Unity版本 Unity账号需要是Pro账号,普通账号不行,目前只支持这1个Unity版本,不要下载任何其它版本:unityhub://2022.3.11f1/d00248457e15) 其它条件:使用Mac电脑M系列芯片,XCode15 Beta2及以上 参考资料: 苹果官网:苹果官网 Unity官网:Unity官网 官方教程…

一览2023 Web3 风云录

撰文&#xff1a;JIN&#xff0c;Techub News 相关推荐&#xff1a;2024年Web3.0数字资产六大趋势&#xff08;完整版&#xff09; 2023 年的加密货币市场充满了波折和挑战。年初&#xff0c;全球最大的加密货币风投机构 DCG 深陷债务危机&#xff1b;年末又见证了比特币一路…

LeetCode.2865. 美丽塔 I

题目 题目链接 分析 闲谈&#xff1a;每次读 LeetCode 的题目描述都要费老大劲&#xff0c;o(╥﹏╥)o 题意&#xff1a;这个其实意思就是以数组的每一位作为最高点&#xff0c;这个点&#xff08;数字&#xff09;左右两边的数字都不能大于这个数字(可以等于)&#xff0c;…

什么是电源纹波?如何测量电源纹波?

一、电源纹波概念 1.1 什么是纹波 电源纹波是指叠加在直流电源输出的电压或电流中的交流成分&#xff0c;是一种周期性的波动信号。好比平静的湖面有一阵风吹过&#xff0c;带起阵阵水波。这就是纹波的概念。 如下图示&#xff0c;使用示波器测量纹波时&#xff0c;上面的尖锐…

听神经瘤的听力学表现

听神经瘤的听力学诊断 听神经瘤的听力学表型多样&#xff0c;听力正常者不能排除听神经瘤&#xff1b;听力损失程度不能预判肿瘤大小&#xff1b;纯音测听与言语识别率不一致应警惕蜗后病变&#xff1b;听性脑干诱发电位诊断听神经瘤敏感度随肿瘤增大而增加。 一&#xff0e;纯…

19.云原生CICD之ArgoCD入门CD过程实战

云原生专栏大纲 文章目录 ArgoCDArgoCD 简介GitOps介绍Argo CD 的工作流程argocd和jinkens对比kustomize介绍ArgoCD和kustomize关系 安装argocdargocd控制台介绍首页应用创建表单SYNC OPTIONS&#xff08;同步选项&#xff09;SYNC POLICY&#xff08;同步策略&#xff09; 应…

Linux中文件属性的获取(stat、chmod、Istat、fstat函数的使用)

修改文件权限 函数如下&#xff1a; chmod/fchmod函数用来修改文件的访问权限: #include <sys/stat.h> int chmod(const char *path, mode_t mode); int fchmod(int fd, mode_t mode); 成功时返回0&#xff1b;出错时返回EOF 注意&#xff1a;在vmware和windows共享的文…
最新文章