告别拥堵:SpringBoot+消息队列打造你的专属交通指挥家!

news2024/11/19 16:26:33

随着5G和物联网技术的飞速发展,系统的智能化已成为不可逆转的趋势。带你一窥未来,探索如何通过SpringBoot和消息队列技术的结合,开启智能系统的新纪元。从事件驱动架构的实现,到异步消息处理的最佳实践,再到集成主流消息队列的步骤,本文将为你提供全面的指导和深刻的洞见。准备好迎接挑战,让我们一起构建能够自我调节、响应迅速的下一代智能系统!

文章目录

    • 1. 消息队列在系统架构中的作用
      • 1.1 引入消息队列的动机
      • 1.2 解耦应用组件
      • 1.3 提升系统可扩展性和灵活性
      • 1.4 保证数据最终一致性
      • 1.5 流量削峰与负载均衡
    • 2. SpringBoot 集成主流消息队列技术
      • 2.1 RabbitMQ 整合
        • 2.1.1 安装与配置
        • 2.1.2 SpringBoot集成RabbitMQ步骤
        • 2.1.3 示例:发布/订阅模式实现
      • 2.2 Kafka 集成
        • 2.2.1 Kafka简介与安装
        • 2.2.2 SpringBoot集成Kafka配置
        • 2.2.3 示例:生产者与消费者模型
      • 2.3 ActiveMQ 整合
        • 2.3.1 ActiveMQ介绍与配置
        • 2.3.2 SpringBoot集成ActiveMQ过程
        • 2.3.3 示例:点对点与发布/订阅模型
    • 3. 异步消息处理
      • 3.1 异步处理的优势
      • 3.2 SpringBoot中异步方法配置
      • 3.3 异步消息消费示例与最佳实践
    • 4. 事件驱动架构
      • 4.1 事件驱动架构原理
      • 4.2 在SpringBoot中实现事件驱动
      • 4.3 事件模型与消息队列的结合运用
    • 结论
      • 消息队列集成的业务价值
      • SpringBoot集成的便利性
      • 未来趋势与展望
    • 参考文献
      • [1] RabbitMQ官方文档
      • [2] Apache Kafka官方指南
      • [3] ActiveMQ官方教程
      • [4] Spring Boot Docs: Messaging
      • [5] "Event-Driven Architecture" by Martin Fowler

在这里插入图片描述

1. 消息队列在系统架构中的作用

1.1 引入消息队列的动机

想象一下,你是一个忙碌的餐厅老板,厨房和前台之间需要频繁地传递菜单和订单。如果没有一个有效的沟通机制,你的餐厅可能会陷入混乱,订单可能会丢失,顾客可能会因为等待时间过长而不满。这就是引入消息队列的动机——它就像是一个高效的服务员,确保信息在厨房和前台之间准确无误地传递。

1.2 解耦应用组件

回到我们的餐厅比喻,如果厨房和前台是两个独立的应用组件,它们各自忙碌,互不干扰。消息队列就像是一个中间人,让这两个组件可以独立工作,而不需要直接交流。这样,即使厨房很忙,前台也可以继续接收订单,而不会互相干扰。

1.3 提升系统可扩展性和灵活性

当餐厅生意越来越好,你可能需要增加更多的厨房或前台。消息队列在这里发挥了重要作用,它允许你轻松地扩展系统,而不需要对现有的架构进行大规模的改动。就像你可以在餐厅里增加更多的桌子和椅子,而不需要改变整个餐厅的布局。

1.4 保证数据最终一致性

在忙碌的餐厅中,确保每个订单都被正确处理是非常重要的。消息队列通过确保每个订单都被记录和处理,来帮助维持数据的一致性。即使在高峰时段,顾客也可以放心,因为他们知道他们的订单最终会被正确处理。

1.5 流量削峰与负载均衡

最后,消息队列可以帮助你管理餐厅的流量。在高峰时段,订单可能会突然激增,如果没有适当的管理,这可能会导致服务中断。消息队列可以平滑这些高峰,将订单分散到不同的时间段处理,就像在餐厅里安排顾客分散就座,以避免拥挤。

可以看到消息队列在系统架构中的重要性。它不仅提高了效率,还增强了系统的稳定性和可扩展性。在接下来的章节中,我们将深入探讨如何将这些强大的工具集成到SpringBoot中,以及它们如何帮助我们构建更加健壮和灵活的系统!

2. SpringBoot 集成主流消息队列技术

2.1 RabbitMQ 整合

2.1.1 安装与配置

想象一下,你是一位探险家,准备探索一片未知的森林。在出发前,你需要准备一些基本的工具和装备。同样,在开始使用RabbitMQ之前,我们也需要安装和配置它。RabbitMQ就像是一个高效的邮递员,它能够确保信息在系统中快速而准确地传递。

首先,你需要从RabbitMQ的官方网站下载并安装它。安装过程就像搭建帐篷一样简单,只需按照指示一步步来。安装完成后,你需要进行一些基本的配置,比如设置用户权限和虚拟主机,这就像是在森林中标记出你的营地和探索路线。

2.1.2 SpringBoot集成RabbitMQ步骤

现在,你的探险队已经准备好了,接下来就是如何将RabbitMQ集成到你的SpringBoot应用中。这个过程就像是在地图上标记出你要去的地方,并准备好相应的装备。

首先,你需要在SpringBoot项目的pom.xml文件中添加RabbitMQ的依赖。这就像是在你的背包中放入必需的装备。然后,你需要在你的应用中配置RabbitMQ的连接信息,包括主机名、端口、用户名和密码等,这就像是设置你的GPS导航。

2.1.3 示例:发布/订阅模式实现

接下来,让我们通过一个简单的例子来展示如何使用RabbitMQ实现发布/订阅模式。想象一下,你是一位新闻记者,需要将新闻发布给不同的订阅者。在RabbitMQ中,你可以创建一个交换机(Exchange),它就像是一个新闻中心,负责接收和分发新闻。

首先,你需要定义一个队列(Queue),这就像是订阅者的邮箱,用于接收新闻。然后,你需要将队列绑定到交换机上,这样当新闻发布时,交换机就会将新闻发送到正确的队列中。最后,你可以通过发送消息到交换机来发布新闻,这就像是将新闻稿发送到新闻中心。

2.2 Kafka 集成

2.2.1 Kafka简介与安装

Kafka是一个分布式流处理平台,它能够处理高吞吐量的数据流。想象一下,你是一位船长,需要管理一条繁忙的航道上的船只。Kafka就像是你的指挥塔,它能够确保每艘船都能够顺利进出港口。

首先,你需要从Apache Kafka的官方网站下载并安装它。安装过程就像是建造你的指挥塔,需要按照指示一步步来。安装完成后,你需要启动Kafka的ZooKeeper和Kafka服务器,这就像是启动你的指挥塔的雷达和通信系统。

2.2.2 SpringBoot集成Kafka配置

现在,你的指挥塔已经准备好了,接下来就是如何将Kafka集成到你的SpringBoot应用中。这个过程就像是在你的航海图上标记出你要去的地方,并准备好相应的导航设备。

首先,你需要在SpringBoot项目的pom.xml文件中添加Kafka的依赖。然后,你需要在你的应用中配置Kafka的连接信息,包括服务器地址、端口等。这就像是设置你的航海图和导航设备。

2.2.3 示例:生产者与消费者模型

接下来,让我们通过一个简单的例子来展示如何使用Kafka实现生产者与消费者模型。想象一下,你是一位农场主,需要将成熟的庄稼收获并运送到市场。在Kafka中,生产者就像是你的收割机,消费者就像是你的运输车队。

首先,你需要定义一个主题(Topic),这就像是你的庄稼田,用于存放庄稼。然后,生产者会将庄稼(消息)发送到主题中,这就像是收割庄稼。消费者会从主题中读取庄稼(消息),并将其运送到市场,这就像是将庄稼运送到市场。

2.3 ActiveMQ 整合

2.3.1 ActiveMQ介绍与配置

ActiveMQ是一个开源的消息代理,它支持多种消息协议。想象一下,你是一位邮局的局长,需要管理来自不同地区的邮件。ActiveMQ就像是你的邮局,它能够确保每封邮件都能够正确地分类和分发。

首先,你需要从ActiveMQ的官方网站下载并安装它。安装过程就像是建造你的邮局,需要按照指示一步步来。安装完成后,你需要启动ActiveMQ的服务器,这就像是启动你的邮局的分拣机和运输系统。

2.3.2 SpringBoot集成ActiveMQ过程

现在,你的邮局已经准备好了,接下来就是如何将ActiveMQ集成到你的SpringBoot应用中。这个过程就像是在你的邮件分拣系统中设置好分类规则和运输路线。

首先,你需要在SpringBoot项目的pom.xml文件中添加ActiveMQ的依赖。然后,你需要在你的应用中配置ActiveMQ的连接信息,包括服务器地址、端口等。这就像是设置你的邮件分拣系统和运输路线。

2.3.3 示例:点对点与发布/订阅模型

接下来,让我们通过一个简单的例子来展示如何使用ActiveMQ实现点对点和发布/订阅模型。想象一下,你是一位邮局局长,需要处理个人邮件和新闻通讯。

对于点对点模型,你可以创建一个队列,这就像是一个私人邮箱,用于接收特定的邮件。发送者将邮件发送到这个邮箱,而接收者可以从这个邮箱中取出邮件。这就像是发送者将邮件发送到私人邮箱,接收者从邮箱中取出邮件。

对于发布/订阅模型,你可以创建一个主题,这就像是一个公告板,用于发布新闻和公告。订阅者可以订阅这个主题,以接收发布的信息。这就像是在公告板上发布新闻,订阅者阅读公告板上的信息。

通过这些比喻和示例,我们可以看到如何将不同的主流消息队列技术集成到SpringBoot中,并利用它们来实现各种消息传递模式。在接下来的章节中,我们将探讨如何利用这些技术来实现异步消息处理和事件驱动架构。

在这里插入图片描述

3. 异步消息处理

3.1 异步处理的优势

想象一下,你是一个忙碌的咖啡店老板,顾客络绎不绝,点单的声音此起彼伏。如果你的服务员在每次点单后都要亲自制作咖啡,然后再送到顾客手中,那效率可想而知。但如果你有一个高效的系统,点单后立即响应顾客,然后让制作咖啡和送咖啡的过程异步进行,你的咖啡店就能服务更多的顾客,顾客也不必长时间等待。

在软件开发中,异步消息处理就像是你咖啡店里的高效系统。它允许你的应用快速响应用户请求,然后后台异步处理这些请求,从而提高效率和用户体验。

3.2 SpringBoot中异步方法配置

在SpringBoot中配置异步方法就像是为你的咖啡店设置一个高效的工作流程。首先,你需要在你的SpringBoot应用中启用异步操作。这可以通过在配置类上添加@EnableAsync注解来实现,就像是在你的咖啡店挂上一个“高效服务”的牌子。

接着,你需要使用@Async注解来标记那些需要异步执行的方法。这就像是告诉服务员,这些咖啡需要快速响应顾客后,再异步制作。

@EnableAsync
@Configuration
public class AsyncConfig {
}

@Service
public class CoffeeService {

    @Async
    public void makeCoffee() {
        // 模拟制作咖啡的过程
        System.out.println("咖啡正在制作中...");
        try {
            Thread.sleep(3000); // 假设制作咖啡需要3秒钟
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("咖啡制作完成!");
    }
}

3.3 异步消息消费示例与最佳实践

现在,让我们通过一个异步消息消费的例子来展示这个过程。假设你的咖啡店有一个在线点单系统,顾客可以通过系统点单,然后系统异步通知服务员制作咖啡。

@RestController
public class CoffeeController {

    @Autowired
    private CoffeeService coffeeService;

    @PostMapping("/order/coffee")
    public ResponseEntity<String> orderCoffee() {
        coffeeService.makeCoffee();
        return ResponseEntity.ok("您的咖啡已下单,正在制作中!");
    }
}

在这个例子中,当顾客通过/order/coffee端点下单时,CoffeeController中的orderCoffee方法会立即响应顾客,然后异步调用CoffeeServicemakeCoffee方法来制作咖啡。

最佳实践提示:

  • 错误处理:确保你的异步方法有适当的错误处理机制,以防咖啡“烤焦”了。
  • 线程池配置:合理配置线程池大小,避免“咖啡机”过载。
  • 幂等性:设计你的异步操作时,确保它们是幂等的,这样即使多次“点单”,也不会导致多次“制作咖啡”。
  • 日志记录:记录关键的日志信息,以便于追踪“订单”状态。

通过这种方式,你的应用可以更加高效地处理任务,同时提供更好的用户体验。在下一章中,我们将探讨如何将这些异步消息处理的概念应用到事件驱动架构中,进一步增强你的系统设计。

4. 事件驱动架构

4.1 事件驱动架构原理

想象一下,你是一个城市的交通控制中心,你的任务是确保交通信号灯在正确的时间显示正确的颜色。在传统的架构中,这就像是每个信号灯都有一个独立的计时器,它们各自独立工作,互不干扰。但在事件驱动架构中,这就像是有一个中央控制系统,当一个信号灯变绿时,它会发送一个“变绿”事件,其他相关的信号灯会根据这个事件来调整自己的状态。

事件驱动架构(EDA)是一种设计模式,它通过事件的生成、检测、消费和响应来实现系统的解耦和自动化。在这种架构中,事件是系统状态变化的载体,它们在系统中流动,触发各种操作。

4.2 在SpringBoot中实现事件驱动

在SpringBoot中实现事件驱动架构就像是为你的城市交通控制系统安装一个中央处理器。首先,你需要定义事件,这就像是定义交通信号灯的状态变化。

public class TrafficLightEvent {
    private String lightStatus;

    public TrafficLightEvent(String lightStatus) {
        this.lightStatus = lightStatus;
    }

    public String getLightStatus() {
        return lightStatus;
    }
}

接着,你需要创建事件监听器,它们会监听特定的事件,并在事件发生时执行相应的操作。

@Component
public class TrafficLightEventListener {

    @EventListener
    public void handleTrafficLightEvent(TrafficLightEvent event) {
        System.out.println("处理交通灯事件:" + event.getLightStatus());
        // 这里可以添加更多的逻辑,比如调整其他信号灯的状态
    }
}

最后,你需要一个事件发布者,它负责在系统中发布事件。

@Service
public class TrafficControlService {

    @Autowired
    private ApplicationEventPublisher publisher;

    public void changeLightStatus(String status) {
        System.out.println("交通灯状态变更为:" + status);
        publisher.publishEvent(new TrafficLightEvent(status));
    }
}

4.3 事件模型与消息队列的结合运用

将事件模型与消息队列结合,就像是为你的交通控制系统增加了一个高效的通信网络。在这个网络中,事件不仅仅是在本地处理,还可以通过网络发送到其他系统或服务中。

假设你想要将交通信号灯的状态变化发送到一个远程的监控系统。你可以使用消息队列来实现这一点。

@Service
public class TrafficControlServiceWithMessaging {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void changeLightStatusAndSendEvent(String status) {
        System.out.println("交通灯状态变更为:" + status);
        TrafficLightEvent event = new TrafficLightEvent(status);
        rabbitTemplate.convertAndSend("trafficEvents", event);
    }
}

在这个例子中,TrafficControlServiceWithMessaging服务在改变交通灯状态后,会将状态变更作为一个事件发送到名为trafficEvents的消息队列中。远程的监控系统可以订阅这个队列,并在事件发生时做出响应。

最佳实践提示:

  • 事件定义:清晰定义事件的类型和属性,确保事件的语义明确。
  • 事件发布:确保事件发布者能够可靠地发布事件,即使在系统故障时也不会丢失事件。
  • 事件消费:设计健壮的事件消费者,能够处理事件队列中的消息,即使在高负载情况下也能保持稳定。
  • 解耦合:通过事件驱动架构,尽量解耦系统组件,提高系统的灵活性和可扩展性。

通过将事件驱动架构与消息队列结合,你可以构建一个高度解耦、响应迅速且可扩展的系统。在下一章中,我们将总结这些技术如何为你的业务带来价值,并展望未来的发展趋势。

结论

消息队列集成的业务价值

经过前面的章节,我们像探险家一样,一步步探索了消息队列的神秘世界。现在,让我们回到起点,回顾一下我们所发现的宝藏。

消息队列的集成,就像是在你的业务系统中安装了一个高效的交通指挥系统。它不仅能够确保信息的快速传递,还能在高峰时段有效地分流,避免系统拥堵。就像城市交通因为有了信号灯和交通规则而变得井然有序,你的业务系统也会因为有了消息队列而运行得更加顺畅。

通过解耦应用组件,消息队列使得各个部分可以独立发展,互不干扰,这就像是城市中的各个区域,虽然各自独立,但又通过交通网络紧密相连。提升系统的可扩展性和灵活性,意味着你的业务可以像城市扩张一样,不断向外拓展,而不会受到原有架构的限制。

保证数据的最终一致性,就像是确保每辆车都能到达目的地,不管路途多么遥远或曲折。流量削峰与负载均衡,则像是在交通高峰期,通过合理的调度,确保交通依然顺畅,没有大规模的拥堵发生。

SpringBoot集成的便利性

SpringBoot作为一个现代化的Java框架,它的出现极大地简化了企业级应用的搭建和开发。将消息队列与SpringBoot集成,就像是给你的餐厅配备了一台全自动咖啡机,你只需要按下按钮,就能快速制作出美味的咖啡。

SpringBoot的自动配置、起步依赖和微服务支持,使得集成消息队列变得异常简单。你不再需要关心复杂的配置和部署,只需要关注业务逻辑的实现。这种便利性,就像是给你的餐厅提供了一个高效的管理系统,让你可以更专注于提供优质的服务和美食。

未来趋势与展望

展望未来,随着技术的不断进步,我们可以预见消息队列和事件驱动架构将在业务系统中扮演越来越重要的角色。随着微服务架构和云原生技术的普及,系统的解耦和可扩展性将成为设计的关键考虑因素。

未来的系统将更加注重实时性,消息队列和事件驱动架构将帮助系统实现更快的响应和更高的吞吐量。同时,随着人工智能和机器学习技术的融入,消息队列可能会变得更加智能,能够根据系统的运行状态自动调整消息的处理策略。

此外,随着5G和物联网技术的发展,我们将看到更多的设备和服务连接到互联网,消息队列将成为这些设备和服务之间通信的桥梁。这将为业务创新提供更多的可能性,也为消息队列技术带来新的挑战和机遇。

通过本篇文章的探索,我们不仅学习了如何集成和使用消息队列,还对如何构建高效、可扩展和现代化的业务系统有了更深的理解。随着技术的不断演进,我们有理由相信,消息队列和事件驱动架构将继续在软件开发领域发光发热。

在这里插入图片描述
咱们一步步揭开了消息队列的神秘面纱,同时也探索了SpringBoot集成消息队列的便利性和未来的发展趋势。希望这篇文章能够为你的业务系统带来启发,帮助你构建更加高效和强大的应用。如果你有任何问题或想法,欢迎继续探索和评论区留言讨论!

参考文献

[1] RabbitMQ官方文档

  • 链接:RabbitMQ Documentation
  • 简介:RabbitMQ是一个开源的消息代理,它支持多种消息协议。官方文档提供了关于安装、配置、管理和使用RabbitMQ的全面指南。

[2] Apache Kafka官方指南

  • 链接:Apache Kafka Documentation
  • 简介:Apache Kafka是一个分布式流处理平台,用于构建实时数据管道和流应用程序。官方指南详细介绍了Kafka的架构、核心概念、快速入门指南以及高级特性。

[3] ActiveMQ官方教程

  • 链接:ActiveMQ Documentation
  • 简介:ActiveMQ是一个强大的消息代理,它支持JMS 2.0规范和多种跨语言的协议。官方教程提供了如何开始使用ActiveMQ的步骤和示例。

[4] Spring Boot Docs: Messaging

  • 链接:Spring Boot Messaging
  • 简介:Spring Boot官方文档中的“消息传递”部分,介绍了如何在Spring Boot应用中集成消息队列和事件驱动架构。

[5] “Event-Driven Architecture” by Martin Fowler

  • 链接:Event-Driven Architecture
  • 简介:Martin Fowler的文章提供了关于事件驱动架构(EDA)的深入分析,包括它的优势、挑战和实现策略。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

iOS——类与对象底层探索

类和对象的本质 当我们使用OC创建一个testClass类并在main函数创建它的实例对象的时候&#xff0c;OC的底层到底是什么样的呢&#xff1f; 首先&#xff0c;我们要了解OC对象的底层结构&#xff0c;那么我们就得知道&#xff1a;OC本质底层实现转化其实都是C/C代码。 使用下面…

【scikit-learn010】sklearn算法模型清单实战及经验总结(已更新)

1.一直以来想写下基于scikit-learn训练AI算法的系列文章,作为较火的机器学习框架,也是日常项目开发中常用的一款工具,最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下scikit-learn框架模型算法包相关技术点及经验。 3.欢迎批评指正,欢迎互三,跪谢一键…

【重磅丨教育设备】推动大规模设备更新和消费品以旧换新行动方案

近日&#xff0c;国务院印发《推动大规模设备更新和消费品以旧换新行动方案》&#xff08;以下简称《行动方案》&#xff09;。《行动方案》提出&#xff1a;实施设备更新行动。提升教育文旅医疗设备水平&#xff0c;推动符合条件的高校、职业院校&#xff08;含技工院校&#…

数据资产入表-数据治理-标签设计标准

前情提要&#xff1a;数据价值管理是指通过一系列管理策略和技术手段&#xff0c;帮助企业把庞大的、无序的、低价值的数据资源转变为高价值密度的数据资产的过程&#xff0c;即数据治理和价值变现。上一讲介绍了数据清洗标准设计的基本逻辑和思路。 上一讲介绍了其他的通用标…

JVM类加载机制详解(JDK源码级别)

提示&#xff1a;从JDK源码级别彻底剖析JVM类加载机制、双亲委派机制、全盘负责委托机制、打破双亲委派机制的程序、Tomcat打破双亲委派机制、tomcat自定义类加载器详解、tomcat的几个主要类加载器、手写tomcat类加载器 文章目录 前言一、loadClass的类加载大概有如下步骤二、j…

centos8stream 编译安装 php-rabbit-mq模块

官方GitHub&#xff1a;https://github.com/php-amqp/php-amqp 环境依赖安装 dnf install cmake make -y 1.安装rabbitmq-c cd /usr/local/src/ wget https://github.com/alanxz/rabbitmq-c/archive/refs/tags/v0.14.0.tar.gz tar xvf v0.14.0.tar.gz cd rabbitmq-c-0.14.0/…

MYSQL数据库细节详细分析

MYSQL数据库的数据类型(一般只需要用到这些) 整型类型&#xff1a;用于存储整数值&#xff0c;可以选择不同的大小范围来适应特定的整数值。 TINYINTSMALLINTMEDIUMINTINTBIGINT 浮点型类型&#xff1a;用于存储带有小数部分的数值&#xff0c;提供了单精度&#xff08;FLOA…

调用上传文件接口出现格式错误

一、造成这种错误的可能有很多 1.检查一下传递格式 2.检查一下接口要求的格式 二、举个例子 这两个有什么区别&#xff1f; 那就是json、和form-data&#xff0c;一定要看仔细接口 如果还是按照json的方式去传就会报错 三、更改header里Content-Type的类型 json等的heade…

iOS18 新变化提前了解,除了AI还有这些变化

iOS 18即将在不久的将来与广大iPhone用户见面&#xff0c;这次更新被普遍认为是苹果历史上最重要的软件更新之一。据多方报道和泄露的消息&#xff0c;iOS 18将带来一系列全新的功能和改进&#xff0c;包括在人工智能领域的重大突破、全新的设计元素以及增强的性能和安全性。现…

【成都信息工程大学】只考程序设计!成都信息工程大学计算机考研考情分析!

成都信息工程大学&#xff08;Chengdu University of Information Technology&#xff09;&#xff0c;简称“成信大”&#xff0c;由中国气象局和四川省人民政府共建&#xff0c;入选中国首批“卓越工程师教育培养计划”、“2011计划”、“中西部高校基础能力建设工程”、四川…

SASAM软件架构静态分析法-系统架构师(六)

1、体系结构权衡分析法&#xff08;Architecture Tradeoff Analysis Method ATAM&#xff09;包含四个主要活动领域&#xff0c;分别是 场景和需求的收集、体系结构视图和场景的实现、&#xff08;&#xff09;、折中。基于场景的架构分析方法&#xff08;Scenarios-based Arch…

React常见的一些坑

文章目录 两个基础知识1. react的更新问题, react更新会重新执行react函数组件方法本身,并且子组件也会一起更新2. useCallback和useMemo滥用useCallback和useMemo要解决什么3. react的state有个经典的闭包,导致拿不到最新数据的问题.常见于useEffect, useMemo, useCallback4. …

Crosslink-NX器件应用连载(11): 图像(数据)远程传输

作者&#xff1a;Hello&#xff0c;Panda 大家下午好&#xff0c;晚上好。这里分享一个Lattice Crosslink-NX器件实现图像或数据&#xff08;卫星数据、雷达数据、ToF传感器数据等&#xff09;远程传输的案例&#xff08;因为所描述的内容颇杂&#xff0c;晒图不好晒&#xff…

618数码好物推荐!精选便宜又实用的数码产品推荐!

着618购物盛宴的脚步日益临近&#xff0c;你是否已经锁定了心仪的宝贝&#xff1f;那些曾让你心动不已的数码产品&#xff0c;现在正是以最低价收入囊中的绝佳时机。618不仅是一场购物狂欢&#xff0c;更是各大电商平台竞相推出优惠政策的盛宴。为了满足大家的需求&#xff0c;…

C语言笔记第13篇:自定义类型(联合union和枚举enum)

1、联合体 1.1 联合体类型的声明 像结构体一样&#xff0c;联合体也是由一个或多个成员构成&#xff0c;这些成员可以是不同的类型。 但是编译器只为最大的成员分配足够的内存空间&#xff0c;联合体的特点是所有成员共用一块内存空间&#xff0c;所以联合体也叫&#xff1a…

HTML+CSS+JS实现2048经典小游戏(附完整源码)

2048 小游戏的目标是通过合并数字单元格&#xff0c;最终在 4x4 的棋盘上创建一个值为 2048 的单元格。 一、预览效果 二、程序源码 html代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"…

Vue——组件数据传递与props校验

文章目录 前言组件数据传递的几种类型简单字符串类型数据专递其他类型数据(数字、数组、对象)传递注意事项 数据传递值校验限定数据类型 type给定默认值 default指定必选项 required 前言 组件与组件之间并不是完全独立的&#xff0c;他们之间可以进行一些数据的传递操作。传递…

宇宙探索:假如把银河系缩小到一个电子那么小,那宇宙会有多大?

“你知道银河系有多大吗?”“我们可以看到的宇宙有多大呢?”“那么假如把银河系缩小到一个电子那么小&#xff0c;那么我们可以看到的宇宙会有多大呢?”这样一个看似简单的问题却没有一个简单的答案&#xff0c;那么蕴藏其中的玄机是什么? 一、光是无法照亮宇宙的角落。 从…

思维,1209G1 - Into Blocks (easy version)

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1209G1 - Codeforces 二、解题报告 1、思路分析 考虑&#xff1a; 最终状态为若干段相同数字&#xff0c;且任意两段数字不同 每个数字出现的最左下标和最右下标构成一个区间 连锁反应—…

月薪12万招聘AI人才,AI已成为大公司的竞争,小公司难以生存

前言 AI已经成为了时代的风口&#xff0c;这个风口的风力有多大呢&#xff1f; 一个月12-20万。 对&#xff0c;一个月120000-200000元&#xff01; 如果说&#xff0c;步入2024年最火的是什么&#xff0c;那一定就是ChatGPT所引领的开放式AI了&#xff0c;这个东西有多火呢…