锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. 深入Spring Boot与RabbitMQ:构建可靠的微服务通信

深入Spring Boot与RabbitMQ:构建可靠的微服务通信

0
  • 软件开发
  • 发布于 2024-08-05
  • 0 次阅读
黄健
黄健

原文链接:https://blog.csdn.net/weixin_68020300/article/details/140626969

SpringBoot 集成 RabbitMQ

在当今的微服务生态系统中,消息队列作为促进异步交互与解除服务间耦合的核心机制,扮演着至关重要的角色。RabbitMQ,凭借其卓越的可靠性和丰富的特性,已经成为众多企业级项目中不可或缺的消息中间件。本文将带您深入挖掘 RabbitMQ 的高级功能,通过实例演示如何在 Spring Boot 应用中巧妙地整合 RabbitMQ,从而实现更高效、更灵活的微服务通信架构。

RabbitMQ 的高级特性

消息确认(Message Acknowledgment)

消息确认(Message Acknowledgment),通常简称为“acks”,是在使用消息队列如RabbitMQ时的一个关键概念。它确保了消息从队列到消费者的过程中不会丢失,特别是在处理过程中如果发生错误或异常的情况下。

在RabbitMQ中,当一个消息被发送到队列,并且一个消费者开始处理这个消息时,该消息会被标记为“未确认”状态。一旦消费者成功处理完消息,它会向RabbitMQ发送一个确认信号(acknowledgment)。只有在收到这个确认后,RabbitMQ才会从队列中移除这条消息。

如果没有收到确认,或者消费者与RabbitMQ的连接断开,RabbitMQ会认为消息没有被正确处理,并可能将该消息重新分发给另一个消费者,或者将其保留在队列中直到问题解决。

spring:

  rabbitmq:

    host: localhost

    port: 5672

    username: user

    password: password

    listener:

      simple:

        acknowledge-mode: manual #将消息确认模式设置为手动
import org.springframework.amqp.rabbit.annotation.RabbitListener;

import org.springframework.amqp.support.AmqpHeaders;

import org.springframework.messaging.handler.annotation.Header;

import org.springframework.stereotype.Service;

@Service

public class MessageConsumer {

    @RabbitListener(queues = "example.queue")

    public void receiveMessage(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) {

        try {

            // 处理消息

            System.out.println("Received message: " + message);

            // 手动确认消息

            channel.basicAck(deliveryTag, false);

        } catch (Exception e) {

            // 处理异常,拒绝消息

            channel.basicNack(deliveryTag, false, true);

        }

    }

}

消息确认有几种模式:

自动确认(Automatic Acknowledgment):这是默认的行为,即一旦消息被发送到消费者,RabbitMQ就假设它已经被处理并且会立即从队列中删除消息。然而,这种模式下如果消费者在处理消息过程中遇到问题或意外中断,消息可能会丢失。

手动确认(Manual Acknowledgment):消费者显式地向RabbitMQ发送确认消息已被成功处理的信号。这通常通过编程接口中的一个方法来完成。这种方式提供了更高级别的可靠性,因为消费者可以确保在消息真正被处理完毕之后再发出确认信号。

批量确认(Batch Acknowledgment):在某些情况下,消费者可以确认多个消息,而不是每次处理完一个消息就确认一次。这样可以减少网络往返次数,提高性能。

拒绝确认(Nacknowledgment):消费者也可以选择拒绝确认消息,这意味着RabbitMQ会将消息重新入队,以便稍后重试或由其他消费者处理。

消息持久化(Message Durability)

消息持久化(Message Durability)是消息队列系统,比如RabbitMQ,中的一个重要概念,用于保证即使在服务器崩溃或重启的情况下,消息也不会丢失。在许多场景下,特别是那些对数据完整性要求较高的应用环境中,确保消息的持久性是十分必要的。

@Bean

public Queue durableQueue() {

    return new Queue("durable.queue", true);

}

public void sendMessage(String message) {

    rabbitTemplate.convertAndSend("durable.queue", message, msg -> {

        msg.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);

        return msg;

    });

}

在RabbitMQ中,消息持久化的实现主要涉及以下几个方面:

持久化队列(Durable Queues):

当你声明一个队列时,可以通过设置durable参数为true来创建一个持久化队列。持久化队列意味着即使RabbitMQ服务重启,队列本身的信息也会被保存下来,不会消失。

持久化消息(Persistent Messages):

每当发布一条消息到RabbitMQ时,你可以设置delivery_mode = 2来使消息成为持久化消息。持久化消息会在磁盘上进行存储,即使在RabbitMQ重启后,这些消息仍然存在队列中,等待被消费。需要注意的是,持久化消息会比非持久化消息带来更高的延迟,因为它们需要写入磁盘。

消息优先级(Message Priority)

消息优先级(Message Priority)是RabbitMQ等消息队列系统中的一项功能,允许用户根据消息的重要程度为其分配不同的优先级。这一特性特别适用于那些需要区分消息紧急程度或重要性的场景,例如实时交易、警报通知、任务调度等。

@Bean

public Queue priorityQueue() {

    Map<String, Object> args = new HashMap<>();

    args.put("x-max-priority", 10);

    return new Queue("priority.queue", true, false, false, args);

}

public void sendMessage(String message, int priority) {

    rabbitTemplate.convertAndSend("priority.queue", message, msg -> {

        msg.getMessageProperties().setPriority(priority);

        return msg;

    });

}

在RabbitMQ中,消息优先级是通过以下步骤来实现的:

创建具有优先级特性的队列:

当你声明队列时,可以通过设置x-max-priority参数来指定队列的最大优先级级别。例如,x-max-priority=10表示队列支持1至10的优先级范围,其中10是最高的优先级。

设置消息的优先级:

发布消息时,可以通过basic.publish方法中的properties字段来设置消息的优先级。优先级值必须在这个队列所定义的优先级范围内,否则消息将无法被发布。

消费消息:

当消费者从队列中获取消息时,RabbitMQ会优先返回优先级最高的消息。如果最高优先级的消息已经全部被消费,那么它会继续按照优先级递减的顺序返回消息,直到队列为空。

值得注意的是,优先级的实现依赖于队列的内部机制,RabbitMQ使用优先级队列算法来管理消息的排序。在高并发和多消费者的情况下,优先级的实现可能受到一定的限制,因为RabbitMQ并不能保证所有消费者都会按照严格优先级顺序处理消息,尤其是在多个消费者同时从队列中拉取消息的情况下。

另外,尽管优先级队列可以优化消息的处理顺序,但它并不替代消息确认或持久化机制。也就是说,优先级高的消息同样需要被确认,而且如果希望在系统重启后依然保持消息的优先级,那么还需要将队列和消息设置为持久化。

死信队列(Dead Letter Exchange)

死信队列(Dead Letter Queue,简称DLQ)和死信交换器(Dead Letter Exchange,有时也被称为DLX)是RabbitMQ中用于处理无法被正常消费的消息的机制。在RabbitMQ中,当消息因某种原因不能被正常的队列消费者处理时,这些消息就会被路由到一个特定的队列,即死信队列,以便进行后续的处理或分析。

死信队列的产生情况主要有以下几种:

消息TTL(Time To Live)到期:当消息在队列中停留的时间超过了预设的TTL时,消息将被视为死信。

队列达到最大长度:如果队列设置了消息的最大数量或大小限制,而新的消息到达时队列已满,则新消息将被视为死信。

消费者拒绝消息:当消费者使用basic.reject或basic.nack命令拒绝消息,且requeue参数设置为false时,消息不会被重新入队,而是被标记为死信。

@Bean

public Queue dlxQueue() {

    Map<String, Object> args = new HashMap<>();

    args.put("x-dead-letter-exchange", "dlx.exchange");

    return new Queue("dlx.queue", true, false, false, args);

}

@Bean

public Exchange dlxExchange() {

    return new DirectExchange("dlx.exchange");

}

@Bean

public Binding dlxBinding() {

    return BindingBuilder.bind(dlxQueue()).to(dlxExchange()).with("dlx.routingkey").noargs();

}

为了建立死信队列和死信交换器,你需要遵循以下步骤:

创建死信交换器:

首先,需要创建一个交换器,并将其类型设置为适合你的应用场景的类型(如direct、fanout、topic等)。

声明死信队列:

创建一个队列,并将其绑定到死信交换器上。这意味着所有被标记为死信的消息都将被发送到这个队列。

配置常规队列的死信属性:

当你创建一个普通的队列时,需要设置以下两个属性:

x-dead-letter-exchange:设置为上述创建的死信交换器的名称。

x-dead-letter-routing-key:设置一个路由键,用于确定消息被发送到哪个具体的死信队列。

通过这样的配置,当消息在常规队列中成为死信时,它将被重新发布到死信交换器,并根据路由键被路由到相应的死信队列中。这使得开发者可以对这些消息进行额外的处理,例如记录日志、重新尝试处理、发送警报、人工审核等。

消息 TTL(Time to Live)

消息TTL(Time to Live)是RabbitMQ中一项非常实用的功能,它允许消息在队列中存在的时间被限定在一个特定的时间段内。一旦消息在队列中的停留时间超过了这个设定的期限,该消息就会被认为是过期的,或者说是“死信”,并触发相应的死信处理机制。

在RabbitMQ中,消息TTL可以通过两种方式来设置:

全局队列TTL:

当声明一个队列时,可以在队列参数中设置x-message-ttl属性,这将对整个队列中的所有消息生效。这意味着无论何时消息进入该队列,它们都将在一定时间后自动过期。然而,这种方法的缺点是队列中的所有消息将共享相同的TTL,可能不适合那些消息生命周期需求各异的场景。

单条消息TTL:

更加灵活的方式是在发布每条消息时动态地设置TTL。这可以通过在消息的属性中设置expiration字段来实现。该字段的值是以毫秒为单位的时间,表示消息在队列中存活的时间。这种方式允许每个消息都有独立的过期时间,从而更好地适应不同业务逻辑的需求。

当消息过期时,如果队列配置了死信交换器(Dead Letter Exchange,DLX),则该消息会被路由到DLX所绑定的死信队列(Dead Letter Queue,DLQ)中,从而触发进一步的处理流程,比如日志记录、重新排队、发送警告等。

@Bean

public Queue ttlQueue() {

    Map<String, Object> args = new HashMap<>();

    args.put("x-message-ttl", 60000); // 60秒

    return new Queue("ttl.queue", true, false, false, args);

}

消息TTL的使用场景包括但不限于:

资源管理:限制消息的存储时间,避免不必要的资源消耗。

错误恢复:在消息处理长时间未完成时,自动重试或转为故障处理路径。

工作流管理:确保任务在规定时间内得到处理,超时则采取备选方案。

消息优先级调整:通过设置较短的TTL,可以使某些消息在超时后被重新放入队列,从而获得更高的处理优先级。

正确配置和使用消息TTL可以显著提升RabbitMQ消息处理的效率和系统的整体健壮性。

发布确认(Publisher Confirms)

发布确认(Publisher Confirms)是RabbitMQ中一项重要的功能,它为生产者(publisher)提供了消息是否成功到达RabbitMQ服务器的反馈机制。在默认情况下,RabbitMQ并不会告知生产者消息是否已经被接收并存储。启用发布确认后,RabbitMQ会回传一个确认给生产者,指示消息是否已被持久化到磁盘或内存中,这有助于确保消息的可靠传递。

@Bean

public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {

    RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);

    rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {

        @Override

        public void confirm(CorrelationData correlationData, boolean ack, String cause) {

            if (ack) {

                System.out.println("Message successfully delivered.");

            } else {

                System.out.println("Failed to deliver message: " + cause);

            }

        }

    });

    return rabbitTemplate;

}

发布确认有两种模式:

同步确认(Synchronous Confirms):

生产者在发送每条消息后,会等待RabbitMQ的确认响应。只有在收到确认后,生产者才会继续发送下一条消息。这种模式提供了高可靠性,但可能影响性能,因为它增加了网络延迟。

异步确认(Asynchronous Confirms):

生产者可以连续发送多条消息而不等待确认,然后RabbitMQ会异步地发送确认或拒绝的响应。这种模式在大多数情况下提供了更好的吞吐量,但需要生产者能够处理确认的异步响应。

高级消息模式

发布/订阅(Publish/Subscribe)

发布/订阅(Publish/Subscribe,简称Pub/Sub)是一种消息传递模式,广泛应用于分布式系统中,包括消息队列如RabbitMQ。在Pub/Sub模式下,消息的发送方(发布者,Publisher)和接收方(订阅者,Subscriber)不需要彼此直接通信。相反,发布者将消息发送到一个主题或频道,而订阅者则订阅感兴趣的频道来接收这些消息。

@Bean

public Queue queue1() {

  return new Queue("queue1", true, false, false);

}

@Bean

public Queue queue2() {

  return new Queue("queue2", true, false, false);

}

@Bean

public FanoutExchange fanoutExchange() {

    return new FanoutExchange("fanout.exchange");

}

@Bean

public Binding bindingFanout1() {

    return BindingBuilder.bind(queue1()).to(fanoutExchange());

}

@Bean

public Binding bindingFanout2() {

    return BindingBuilder.bind(queue2()).to(fanoutExchange());

}

扇形交换机的工作原理

扇形交换机 (Fanout Exchange) 是 RabbitMQ 提供的一种交换机类型,它会将收到的所有消息广播到与其绑定的所有队列。

不管消息的路由键是什么,所有绑定的队列都会收到相同的消息。

路由(Routing)

在消息队列系统中,如RabbitMQ,路由(Routing)是一种核心机制,用于决定消息如何从生产者传递到消费者。RabbitMQ通过使用交换器(Exchanges)和路由键(Routing Keys)来实现消息的精确路由,确保消息被发送到正确的队列,进而被合适的消费者处理。

在RabbitMQ中,生产者将消息发送到交换器,而不是直接发送到队列。交换器根据其类型和绑定的规则决定消息的去向。消费者通过订阅特定队列来接收消息,而队列则通过绑定到交换器来接收相应路由键或模式的消息。

@Bean

public DirectExchange directExchange() {

    return new DirectExchange("direct.exchange");

}

@Bean

public Binding bindingDirect() {

    return BindingBuilder.bind(queue()).to(directExchange()).with("routing.key");

}

直连交换机:

直连交换机 (Direct Exchange) 是一种 RabbitMQ 交换机类型,它根据消息的路由键路由消息。

消息会附带特定的路由键发送到交换机。

然后交换机尝试找到一个与其绑定的队列,并具有匹配的路由键。

如果找到匹配的队列,则消息将被投递到该队列。

主题(Topics)

在RabbitMQ中,主题(Topics)是一种特殊的路由机制,它允许消息根据主题模式被路由到多个队列。这种机制是通过使用Topic Exchange来实现的,它支持基于模式匹配的路由,使得消息可以根据其包含的主题关键词被精确地分发到多个订阅者。

@Bean

public TopicExchange topicExchange() {

    return new TopicExchange("topic.exchange");

}

@Bean

public Binding bindingTopic() {

    return BindingBuilder.bind(queue()).to(topicExchange()).with("topic.#");

}

主题交换机的工作原理

主题交换机 (Topic Exchange) 是 RabbitMQ 提供的一种交换机类型,它根据消息的路由键和绑定的路由模式进行消息路由。

路由键可以包含点 (.) 和星号 (*) 通配符。

点 (.) 匹配消息中的一个单词。

星号 (*) 匹配消息中的零个或多个单词。

队列可以绑定一个特定的路由模式,例如"topic.news.#" 或 "topic.stock.*"。

当消息的路由键与绑定的路由模式匹配时,消息就会被路由到绑定的队列。

RPC(Remote Procedure Call)

远程过程调用(Remote Procedure Call,简称RPC)是一种通信协议,允许一个程序调用另一个运行在不同地址空间(通常是另一台计算机)上的程序,而无需程序员明确编写底层网络细节。RPC的设计目标是让远程过程调用看起来就像在本地调用一样简单,隐藏了网络通信的复杂性。

RPC可以使用多种协议和技术来实现,常见的有gRPC、XML-RPC、JSON-RPC、SOAP等。在微服务架构中,RPC常用于服务间通信,提供了一种透明的方式来跨越网络边界调用其他服务的方法,简化了服务间的交互。

@RabbitListener(queues = "rpc.requests")

public String handleRpcMessage(String message) {

    // 处理RPC请求

    return "Response to " + message;

}

public String sendRpcMessage(String message) {

    return (String) rabbitTemplate.convertSendAndReceive("rpc.requests", message);

}

handleRpcMessage 方法作为一个消息监听器,监听 "rpc.requests" 队列中的消息,并处理这些 RPC 请求消息。

sendRpcMessage 方法用于发送 RPC 请求消息到 "rpc.requests" 队列,并等待来自监听器的响应消息。

高级配置和优化

消息队列和交换机的高级配置

高级配置包括队列和交换机的参数调优,以满足特定业务需求。

@Bean

public Queue advancedQueue() {

    Map<String, Object> args = new HashMap<>();

    args.put("x-max-length", 1000);

    args.put("x-overflow", "reject-publish");

    return new Queue("advanced.queue", true, false, false, args);

}

@Bean

public Exchange advancedExchange() {

    return new TopicExchange("advanced.exchange", true, false);

}

args.put("x-max-length", 1000);

键为 x-max-length:这是一个 RabbitMQ 的扩展属性,用于设置队列的最大长度。

值为 1000:表示队列的最大长度为 1000 条消息。超过此限制的消息将会被丢弃。

args.put("x-overflow", "reject-publish");

键为 x-overflow:这也是 RabbitMQ 的扩展属性,用于设置队列满时如何处理新消息的发布。

值为 reject-publish:表示当队列达到最大长度时,尝试发布新消息将被拒绝。

性能调优和最佳实践

性能调优包括高并发处理、消息压缩和流量控制。

高并发处理

@Bean

public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {

    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();

    factory.setConnectionFactory(connectionFactory);

    factory.setConcurrentConsumers(10);

    factory.setMaxConcurrentConsumers(20);

    return factory;

}

消息压缩

public void sendCompressedMessage(String message) {

    byte[] compressedMessage = compress(message);

    rabbitTemplate.convertAndSend("queue", compressedMessage);

}

private byte[] compress(String message) {

    // 压缩逻辑

    return compressedData;

}

流量控制

@Bean

public SimpleRabbitListenerContainerFactory prefetchContainerFactory(ConnectionFactory connectionFactory) {

    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();

    factory.setConnectionFactory(connectionFactory);

    factory.setPrefetchCount(50);

    return factory;

}

RabbitMQ 的管理和监控工具

RabbitMQ 提供了丰富的管理和监控工具,如RabbitMQ Management Plugin和Prometheus。

management:

  endpoints:

    web:

      exposure:

        include: "*"

  metrics:

    export:

      prometheus:

        enabled: true

RabbitMQ 与 Spring Boot集成

具体集成步骤可以参考我之前发布的一篇文章:

《【实战指南】Spring Boot项目:一键式RabbitMQ集成与可靠性配置》

本篇文章详细讲解了 Springboot项目中快速引入Rabbit MQ通用做法

高级使用场景

消息重试机制

配置消息重试机制,确保消息在失败后重新尝试消费。

@Bean

public SimpleRabbitListenerContainerFactory retryContainerFactory(ConnectionFactory connectionFactory) {

    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();

    factory.setConnectionFactory(connectionFactory);

    factory.setAdviceChain(new RetryInterceptorBuilderStateless()

        .maxAttempts(5)

        .backOffOptions(1000, 2.0, 10000)

        .build());

    return factory;

}

这段代码生成了一个用于消息监听器容器的工厂,并配置了重试拦截器。这意味着当消息处理失败时,监听器会尝试在达到最大重试次数之前按照设定的间隔进行重试。

.maxAttempts(5): 设置最大重试次数为 5 次。

.backOffOptions(1000, 2.0, 10000): 设置重试间隔策略。

第一个参数 (1000): 初始重试间隔时间为 1 秒 (1000 毫秒)。

第二个参数 (2.0): 重试间隔每次乘以 2 (指数退避)。

第三个参数 (10000): 最大重试间隔时间为 10 秒 (10000 毫秒)。

延时队列

通过配置 TTL 和死信队列,实现延时队列功能。实现延时队列(Delayed Message Queue)需要安装RabbitMQ的延时消息插件(RabbitMQ Delayed Message Plugin)。这个插件允许你设置消息的延迟时间,到期后消息才会被路由到目标队列。

@Bean

public Queue delayQueue() {

    Map<String, Object> args = new HashMap<>();

    args.put("x-message-ttl", 60000); // 60秒

    args.put("x-dead-letter-exchange", "dlx.exchange");

    args.put("x-dead-letter-routing-key", "dlx.routingkey");

    return new Queue("delay.queue", true, false, false, args);

}

常见问题与解决方案

常见错误和异常处理

消息无法消费:检查队列和交换机绑定是否正确。

消息重复消费:检查消费者的消息确认机制是否正确配置。

性能瓶颈和优化建议

增加消费者并发数,提升消息处理能力。

使用消息压缩,减少网络传输开销。

配置合理的消息 TTL,避免消息积压。

安全性问题和解决方案

使用 SSL 加密,确保消息传输安全。

配置 RabbitMQ 的访问控制,确保只有授权用户能访问。

结语

本文详细探讨了 RabbitMQ 的高级应用,包括消息确认、持久化、优先级、死信队列、消息 TTL 和发布确认等高级特性,以及高级消息模式、高级配置和性能优化等内容。通过 Spring Boot 与 RabbitMQ 的整合示例,展示了如何在实际项目中高效利用 RabbitMQ,提升系统的可靠性和性能。本文演示代码只是一个简单的示例,具体实现逻辑需要大家根据自己的业务需求进行开发。

标签: #软件开发 1171
相关文章

万字:支付“核心系统”详解 2024-11-02 15:33

专栏作者:隐墨星辰 \| 主编:陈天宇宙 这篇文章也尝试化繁为简,探寻支付系统的本质,讲清楚在线支付系统最核心的一些概念和设计理念。 虽然支付行业已经过了风头最劲的时光,但跨境支付仍然在蓬勃发展,每年依然有很多新人进入这个行业,这篇文章尝试为这些刚入行的新人提供一点帮助。 文章只介绍一些支付行业十几

资深支付架构师视角:实战从问题定义到代码落地的完整套路 2024-11-02 15:33

前言 今天从一个实际案例入手,介绍站在架构师的角度,如何识别并定义问题,提炼需求,技术方案选型,再到详细设计,最后利用AI的能力协助写出核心的代码,验证与调优。 解决问题存在一定的模式,也可以称之为框架,总结出自己的思考和解题框架,以后再碰到同类型的问题就可以如庖丁解牛一样容易。 很多年前,我写代码

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

设计模式第16讲——迭代器模式(Iterator) 2024-10-08 11:24

一、什么是迭代器模式 迭代器模式是一种行为型设计模式,它提供了一种统一的方式来访问集合对象中的元素,而不是暴露集合内部的表示方式。简单地说,就是将遍历集合的责任封装到一个单独的对象中,我们可以按照特定的方式访问集合中的元素。 二、角色组成 抽象迭代器(Iterator):定义了遍历聚合对象所需的方法

vue2路由和vue3路由区别及原理 2024-10-08 11:24

一、Vue2 与 Vue3 路由的区别 1. 创建路由实例方式的不同 Vue 2 中,通过 Vue.use() 注册路由插件,并通过 new VueRouter() 来创建路由实例。 import Vue from 'vue';import VueRouter from 'vue-router';i

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.