尚硅谷rabbitmq2024 第15-18节 springboot整合与可靠性答疑
在spring boot项目中,只引入了一个amqp的starter,为什么在写listener的时候能看到rabbitmq相关的类,比如@RabbitListener(
public void processMessage(String dataString, Message message, channel channel){
这里的Message就是rabbitmq下面的类
在 Spring Boot 项目中使用 `spring-boot-starter-amqp` 时,实际上你引入了 Spring AMQP 项目,这个项目包含了对 RabbitMQ 的支持。Spring AMQP 提供了一个抽象层,简化了与 RabbitMQ 的交互,并且包含了许多方便的注解和类,比如 `@RabbitListener`。
### Spring Boot Starter AMQP
`spring-boot-starter-amqp` 是一个 Spring Boot 的启动器,它包含了所有与 AMQP(高级消息队列协议)相关的依赖和配置。这个启动器默认使用 RabbitMQ 作为消息代理,因此它包含了 RabbitMQ 客户端库和 Spring AMQP 的相关类。
### 依赖关系
当你在 `pom.xml` 中添加 `spring-boot-starter-amqp` 依赖时,它会自动引入以下依赖:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
```
这个依赖会引入 Spring AMQP 和 RabbitMQ 客户端库:
- `spring-amqp`: Spring 的 AMQP 抽象层。
- `spring-rabbit`: 针对 RabbitMQ 的 Spring AMQP 实现。
- `amqp-client`: RabbitMQ 的 Java 客户端库。
### `@RabbitListener` 注解
`@RabbitListener` 注解是 Spring AMQP 提供的,用于标记一个方法为 RabbitMQ 消息监听器。它会自动配置消息监听容器,并将消息传递给标记的方法。
### `Message` 类
在 `@RabbitListener` 注解的方法中,可以使用 RabbitMQ 特定的类,例如 `org.springframework.amqp.core.Message` 和 `com.rabbitmq.client.Channel`。这些类是由 Spring AMQP 和 RabbitMQ 客户端库提供的。
- `org.springframework.amqp.core.Message`: 代表一个 AMQP 消息,包含消息体和消息属性。
- `com.rabbitmq.client.Channel`: 代表一个 RabbitMQ 信道,用于执行 AMQP 操作。
### 示例代码
以下是一个完整的 Spring Boot 示例,展示如何使用 `@RabbitListener` 注解和 RabbitMQ 特定的类:
#### pom.xml
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
```
#### RabbitMQConfig.java
```java
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
@Bean
public Queue myQueue() {
return new Queue("myQueue", true);
}
}
```
#### RabbitMQListener.java
```java
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import com.rabbitmq.client.Channel;
@Component
public class RabbitMQListener {
@RabbitListener(queues = "myQueue")
public void processMessage(String dataString, Message message, Channel channel) {
System.out.println("Received message: " + dataString);
System.out.println("Message properties: " + message.getMessageProperties());
// 可以在这里使用 channel 进行确认或其他操作
}
}
```
#### RabbitMQProducer.java
```java
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/send")
public class RabbitMQProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
@GetMapping("/message")
public String sendMessage() {
String message = "Hello, RabbitMQ!";
rabbitTemplate.convertAndSend("myQueue", message);
return "Sent: " + message;
}
}
```
### 总结
- `spring-boot-starter-amqp` 包含了 Spring AMQP 和 RabbitMQ 客户端库。
- `@RabbitListener` 注解用于标记一个方法为 RabbitMQ 消息监听器。
- 在监听器方法中,可以使用 RabbitMQ 特定的类,如 `Message` 和 `Channel`。
- Spring AMQP 提供了一个抽象层,简化了与 RabbitMQ 的交互。
通过这些配置和代码,你可以轻松地在 Spring Boot 项目中使用 RabbitMQ 进行消息传递和处理。
=============@Rabbitlistener(bindings = @QueveBinding(value = @Queue(value =QUEUE_NAME, durable = "true")exchange =@Exchange(value =EXCHANGE DIRECT),key = {ROUTING_KEY} 为什么注解里面还能嵌套注解?
在 Java 中,注解可以嵌套注解,这是因为注解本质上是一种特殊的接口。注解可以包含其他注解作为其属性,这使得它们非常灵活和强大,能够表达复杂的配置。
### 注解嵌套的原理
注解是一种特殊的接口,可以包含基本类型、枚举、字符串、类和其他注解作为属性。通过这种方式,注解可以嵌套,从而表达更复杂的配置。
### 示例解释
在 Spring AMQP 中,`@RabbitListener` 注解用于定义一个 RabbitMQ 消息监听器。为了配置队列、交换机和绑定关系,Spring AMQP 提供了嵌套注解,例如 `@QueueBinding`、`@Queue` 和 `@Exchange`。通过这种嵌套注解的方式,可以在一个地方集中配置所有相关的 RabbitMQ 配置。
### 示例代码
以下是一个完整的示例,展示如何使用嵌套注解配置 RabbitMQ 队列、交换机和绑定关系:
#### RabbitMQConfig.java
首先,定义一些常量:
```java
public class RabbitMQConfig {
public static final String QUEUE_NAME = "myQueue";
public static final String EXCHANGE_NAME = "myExchange";
public static final String ROUTING_KEY = "myRoutingKey";
}
```
#### RabbitMQListener.java
使用嵌套注解配置队列、交换机和绑定关系:
```java
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
@Component
public class RabbitMQListener {
@RabbitListener(
bindings = @QueueBinding(
value = @Queue(value = RabbitMQConfig.QUEUE_NAME, durable = "true"),
exchange = @Exchange(value = RabbitMQConfig.EXCHANGE_NAME, type = "direct"),
key = RabbitMQConfig.ROUTING_KEY
)
)
public void processMessage(String dataString, Message message, Channel channel) {
System.out.println("Received message: " + dataString);
System.out.println("Message properties: " + message.getMessageProperties());
// 可以在这里使用 channel 进行确认或其他操作
}
}
```
### 注解解析
- `@RabbitListener`:标记一个方法为 RabbitMQ 消息监听器。
- `@QueueBinding`:定义队列、交换机和路由键的绑定关系。
- `value = @Queue(...)`:定义队列的属性。
- `exchange = @Exchange(...)`:定义交换机的属性。
- `key`:定义路由键。
### 为什么使用嵌套注解
1. **简化配置**:通过嵌套注解,可以在一个地方集中配置所有相关的 RabbitMQ 配置,简化了配置过程。
2. **增强可读性**:嵌套注解使得配置更加直观和易读,开发者可以一目了然地看到队列、交换机和绑定关系的配置。
3. **减少错误**:将相关配置集中在一个地方,可以减少由于分散配置导致的错误。
### 总结
- Java 注解可以嵌套,这是因为注解本质上是一种特殊的接口,可以包含其他注解作为属性。
- 嵌套注解使得配置更加简洁、直观和易读,有助于减少错误。
- 在
=====
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
这个包里面包含rabbitmq的类?难道amqp协议的实现者只有rabbitmq吗?
是的,`spring-boot-starter-amqp` 这个包确实包含了与 RabbitMQ 相关的类。Spring AMQP 是 Spring 框架的一个项目,它提供了对 AMQP 协议的支持,而 RabbitMQ 是 AMQP 协议的一个常见实现者。
不过,AMQP 协议不仅仅只能由 RabbitMQ 实现。AMQP(Advanced Message Queuing Protocol)是一种开放标准的应用层协议,它的设计初衷是为了支持消息的中间件。除了 RabbitMQ 之外,还有其他一些消息队列系统也实现了 AMQP 协议,比如 Apache Qpid 和 Red Hat AMQ。
但是在 Spring Boot 环境中,`spring-boot-starter-amqp` 默认是针对 RabbitMQ 进行优化和配置的。如果你使用其他 AMQP 实现者,可能需要进行额外的配置和调整。
============
publisher-confirm-type:CORRELATED#交换机的确认publisher-returns:true #队列的确认
这两个是干嘛的,有什么区别
这两个参数都是用于RabbitMQ消息发布确认机制的,但它们的作用和使用场景有所不同。
1. **publisher-confirm-type: CORRELATED#交换机的确认**
这个参数用于启用发布确认(Publisher Confirms)机制。发布确认机制是RabbitMQ提供的一种可靠性保障,确保消息从生产者成功发布到交换机。具体来说,当生产者发送消息到交换机时,RabbitMQ会返回一个确认(ack)给生产者,表示消息已成功到达交换机。如果消息未能到达交换机,RabbitMQ会返回一个否定确认(nack)。
- **CORRELATED**:这个选项表示在确认和否定确认中包含相关信息(如消息ID),以便生产者能够识别是哪条消息被确认或否定确认。
2. **publisher-returns: true #队列的确认**
这个参数用于启用消息返回(Returns)机制。当消息从交换机路由到队列失败时(例如,交换机无法找到匹配的队列),RabbitMQ会将消息返回给生产者。这种机制通常与“mandatory”标志一起使用,当生产者发送消息时,如果设置了“mandatory”标志且消息无法路由到队列,RabbitMQ会触发返回机制。
- **true**:启用消息返回机制,确保生产者在消息无法路由到队列时能收到通知。
### 区别
- **发布确认(Publisher Confirms)**:确保消息成功到达交换机,适用于需要确保消息至少到达交换机的场景。
- **消息返回(Returns)**:确保消息成功路由到队列,适用于需要确保消息至少到达某个队列的场景。
这两种机制可以结合使用,以确保消息从生产者成功发布到交换机并路由到目标队列,提供更高的可靠性保障。
========
publisher-confirm-type: CORRELATED,如果返回了nack会重发吗?publisher-returns: true 如果没路由到队列会怎么样
好的,关于你的问题,下面是详细的解释:
### 1. `publisher-confirm-type: CORRELATED` 如果返回了 `nack` 会重发吗?
当启用了发布确认(Publisher Confirms)机制并设置了 `CORRELATED` 选项时,如果RabbitMQ返回了一个否定确认(nack),生产者需要自己决定是否重发消息。RabbitMQ本身不会自动重发消息。生产者通常会在接收到 `nack` 后,根据业务逻辑选择重发消息或采取其他措施。
**步骤如下:**
- 生产者发送消息到交换机。
- RabbitMQ返回 `ack` 或 `nack`。
- 如果返回 `ack`,表示消息成功到达交换机。
- 如果返回 `nack`,表示消息未能到达交换机,生产者可以选择重发该消息。
### 2. `publisher-returns: true` 如果没路由到队列会怎么样?
当启用了消息返回(Returns)机制并设置了 `publisher-returns: true` 时,如果消息无法路由到任何队列,RabbitMQ会将消息返回给生产者。生产者可以在返回的消息中查看原因(如没有匹配的队列)并进行相应处理。
**步骤如下:**
- 生产者发送消息到交换机,并设置 `mandatory` 标志。
- 如果消息无法路由到任何队列:
- RabbitMQ会触发返回机制,将消息返回给生产者。
- 生产者接收到返回的消息后,可以根据返回的原因进行处理(如重发消息、记录日志或其他业务逻辑)。
### 总结
- **发布确认(Publisher Confirms)**:`nack` 需要生产者自己决定是否重发,RabbitMQ不会自动重发。
- **消息返回(Returns)**:如果消息无法路由到队列,RabbitMQ会返回消息给生产者,生产者需要处理返回的消息。
希望这些解释对你有帮助!如果还有其他问题,随时问我。
20===========
在spring里如果用@component替换@Configuration会怎么样
在Spring中,`@Component` 和 `@Configuration` 都是用于定义Spring管理的bean的注解,但它们有不同的用途和行为。
### `@Component`
- **用途**:用于标记一个普通的Spring组件类,表示这个类将被Spring容器自动检测和注册为bean。
- **作用**:Spring会扫描带有`@Component`注解的类,并将其实例化、配置并加入到Spring上下文中。
- **适用场景**:通常用于服务类、DAO类或其他通用的bean。
### `@Configuration`
- **用途**:用于定义配置类,表示这个类包含了一个或多个`@Bean`方法,这些方法会被Spring容器调用并注册为bean。
- **作用**:除了将类标记为Spring bean之外,`@Configuration`还启用了CGLIB代理,以确保`@Bean`方法之间的依赖关系能够正确处理。
- **适用场景**:通常用于定义Spring的配置类,包含bean定义和依赖注入的逻辑。
### 区别
1. **代理机制**:
- `@Configuration`:使用CGLIB代理来确保`@Bean`方法返回的bean是单例的,即使在同一个配置类中调用这些方法多次,返回的也是同一个实例。
- `@Component`:不会使用CGLIB代理,直接调用`@Bean`方法会创建新的实例。
2. **使用场景**:
- `@Configuration`:适用于定义配置类,包含多个`@Bean`方法。
- `@Component`:适用于定义普通的Spring组件类,不包含`@Bean`方法。
### 如果用`@Component`替换`@Configuration`会怎么样?
假设你有一个配置类如下:
```java
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyService();
}
@Bean
public MyRepository myRepository() {
return new MyRepository();
}
}
```
如果你将`@Configuration`替换为`@Component`:
```java
@Component
public class AppConfig {
@Bean
public MyService myService() {
return new MyService();
}
@Bean
public MyRepository myRepository() {
return new MyRepository();
}
}
```
### 影响
1. **Bean的管理**:
- 使用`@Configuration`时,`@Bean`方法返回的bean是单例的,Spring会管理这些bean的生命周期。
- 使用`@Component`时,`@Bean`方法每次调用都会创建一个新的实例,无法保证单例性。
2. **依赖注入**:
- 使用`@Configuration`时,Spring会确保`@Bean`方法之间的依赖关系能够正确处理。
- 使用`@Component`时,`@Bean`方法之间的依赖关系可能无法正确处理,因为每次调用都会创建新的实例。
### 示例
```java
@Component
public class AppConfig {
@Bean
public MyService myService() {
return new MyService(myRepository());
}
@Bean
public MyRepository myRepository() {
return new MyRepository();
}
}
```
在上述例子中,如果使用`@Component`,每次调用`myService()`时都会创建一个新的`MyRepository`实例,而不是使用单例的`MyRepository`实例。这可能会导致意外的行为和性能问题。
### 总结
- `@Configuration`:用于定义配置类,保证`@Bean`方法返回的bean是单例的,适用于配置Spring上下文。
- `@Component`:用于定义普通的Spring组件类,不包含`@Bean`方法,适用于通用的bean。
因此,在配置类中,应该使用`@Configuration`而不是`@Component`,以确保bean的单例性和依赖关系的正确处理。
相关文章:
尚硅谷rabbitmq2024 第15-18节 springboot整合与可靠性答疑
在spring boot项目中,只引入了一个amqp的starter,为什么在写listener的时候能看到rabbitmq相关的类,比如RabbitListener( public void processMessage(String dataString, Message message, channel channel){ 这里的Message就是rabbitmq下面…...

ctfshow-web 萌新题
给她 pyload: 1.dirsearch扫描,发现git 2. GitHack工具得到.git文件 <?php $passsprintf("and pass%s",addslashes($_GET[pass])); $sqlsprintf("select * from user where name%s $pass",addslashes($_GET[name])); ?>addslashes函…...

基于RPA+AI的网页自动填写机器人 | OPENAIGC开发者大赛高校组优秀作品
在第二届拯救者杯OPENAIGC开发者大赛中,涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到,我们特意开设了优秀作品报道专栏,旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者,希望能带给…...
Tmux常用操作--云GPU版
Tmux是什么,作用? Tmux是一个终端复用器(terminal multiplexer),属于常用的开发工具。 作用 使用Tmux创建守护进程,可以使得关闭PyCharm或者其他终端的情况下,远程服务器(云GPU&a…...

股市入门常见术语介绍
鉴于最近行情讨论火热,我也想借此平台,结合我大学时期身边同学老师的投资经历,写一篇交易入门术语简介。内容不多但是足以达到科普之用。 希望大家能谨慎对待投资,始终保持谦虚学习的态度。不要迷失在瞬息万变的金融市场&…...
专栏十九:单细胞大数据时代使用scvi和scanpy整合数据
慢更ing,主要是记录自己在分析中的一些困惑 一、基础知识和解惑 放在最前面,是因为scvi整合不像harmony,傻瓜式操作,很多地方还是要注意一下的。 1.如何正确的寻找HVGs 一般我们使用的函数就是scanpy.pp.highly_variable_genes,里面的参数较为复杂。 Q:输入数据的格…...
C语言编程必备知识
C语言是编程领域中基础且广泛使用的语言之一,掌握C语言编程需要一些核心知识,涵盖基本语法、内存管理、数据结构等方面。以下是C语言编程中的一些必备知识点: 1. **基础语法** - **变量声明**:所有变量都需要在使用前声明&…...
k8s 1.28 集群部署
文章目录 环境配置安装docker安装cri-dockerd(Docker与Kubernetes通信的中间程序): 部署kubernetes 环境配置 关闭Selinux #永久 sed -i s/enforcing/disabled/ /etc/selinux/config #临时 setenforce 0 关闭Swap #临时 swapoff-a #永久 sed -ri s/.*swap.*/#&a…...
python入门教程
Python 是一种非常流行的编程语言,因其简单易学的语法和广泛的应用领域(如数据分析、人工智能、Web 开发等)而备受欢迎。以下是一个入门级 Python 教程,适合初学者快速掌握 Python 的基础知识。 1. 安装 Python 你可以从 Python…...

bat(批处理脚本学习)
输出banner echo off echo () echo JL echo ^|^| echo LJ echo _,--"""""""---. echo , …...

【JAVA毕业设计】基于Vue和SpringBoot的渔具租赁系统
本文项目编号 T 005 ,文末自助获取源码 \color{red}{T005,文末自助获取源码} T005,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 渔…...
Maven和Gradle的对比
Maven和Gradle都是Java项目构建工具,它们在帮助开发者管理项目依赖、编译、打包等方面发挥着重要作用。 Maven和Gradle的区别 1、语法与配置文件 Maven使用XML作为配置文件(如pom.xml)的语言,XML结构清晰但相对冗长。Gradle则使…...
Windows安装Ollama环境
在Windows环境下,可以安装Ollama,然后在其上面下载相应的大语言模式,下面是目前支持的LLM及相应的命令等信息: Model Parameters Size Download Llama 38B4.7GBollama run llama3Llama 370B40GBollama run llama3:70bPhi-33.8B2.3GBollama run phi3Mistral7B4.1GBollama ru…...
Java入门:11.抽象类,接口,instanceof,类关系,克隆
1 JDK中的包 JDK JRE 开发工具集(javac.exe) JRE JVM java类库 JVM java 虚拟机 jdk中自带了许多的包(类) , 常用的有 java.lang 该包中的类,不需要引用,可以直接使用。 例如࿱…...

【软件部署安装】OpenOffice转换PDF字体乱码
现象与原因分析 执行fc-list查看系统字体 经分析发现,linux默认不带中文字体,因此打开我们本地的windows系统的TTF、TTC字体安装到centos机器上。 安装字体 将Windows的路径: C:\Windows\Fonts 的中文字体,如扩展名为 TTC 与TT…...

工程师 - 开源硬件公司Adafruit介绍
https://www.adafruit.com/ https://github.com/adafruit 开源硬件公司 Adafruit 的发展历程 如果你是一名创客(Maker),那么你肯定听过 Adafruit;如果你在项目中使用过 Arduino,那么你应该也会知道 Adafruit。假如你没…...
PostgreSQL学习笔记五:数据库基本操作
在 PostgreSQL 中,您可以执行一系列基础操作来管理数据库、备份和恢复数据。以下是一些常用的命令和步骤: 创建数据库 使用以下命令创建新数据库: CREATE DATABASE database_name;您也可以在创建时指定数据库所有者和其他参数:…...

住房公积金 计算器-java方法
计算了一下房贷压力,以全额公积金贷款为例,贷款四十万,等额本金方式还款,房贷利率为2.85%,基本情况就是如下: 还款总额达到 提前还款的好处 按三十年计算,如果第一年借用亲朋好友的钱&#x…...
Spring-Smart-DI
参考文章 作用 用注解的方式动态切换实现类实现方式。 比如我们有多个消息中间件或多个短信服务商,需要动态切换的时候,无需自己写判断逻辑来进行服务商的切换。只用一套注解就可以解决问题 开始使用 引入依赖 <dependency><groupId>io…...
Python 在树莓派上实现WIFI连接
开发语言:Python 硬件环境:树莓派 4B 运行环境:Raspberry Pi OS 64-bit 连接WIFI还是比较简单的,用了好几个Python 库都效果不怎么理想,最后还是使用命令的方式是最自在的 先断开当前的连接 wlan0 可以替换成你当前…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...