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

随着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)的深入分析,包括它的优势、挑战和实现策略。

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

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

相关文章

PyQt5+SQLlite3基于邮箱验证的登陆注册找回系统

本期教程投稿一篇实用性的基于邮箱登陆注册找回于一体的系统&#xff0c;在日常的开发和软件应用中非常常见&#xff0c;并且也使用了逻辑与界面分离的写法&#xff0c;那这个文章将详细的为大家介绍整个流程&#xff0c;但是细节的话还需要大家自己去完善&#xff0c;也欢迎大…

传输大咖24|镭速传输揭秘:确保UDP数据完整性的先进策略

在现代网络通信中&#xff0c;UDP&#xff08;User Datagram Protocol&#xff09;因其低延迟和高效率的特点而受到青睐&#xff0c;尤其是在需要快速传输大量数据的场景中。然而&#xff0c;UDP协议本身并不保证数据的可靠性和一致性&#xff0c;这就要求使用UDP进行数据传输的…

泛微开发修炼之旅--06自定义Action接口开发示例、源码及使用场景

文章链接&#xff1a;泛微开发修炼之旅--06自定义Action接口开发示例、源码及使用场景

关于序列化与反序列化解题(2)

1、 [NISACTF 2022]babyserialize 分析发现定义一个类&#xff0c;里面为两个对象赋值并调用__wakeup()魔术方法&#xff0c;用if语句//检查 $this->fun 是否等于 "show_me_flag"&#xff0c;如果是&#xff0c;则调用 hint() 函数。 当对象的方法不存在时&#x…

Threejs加载DOM+CSS到场景中,实现3D场景展示2D平面的效果

1. 前言 本篇文章主要实现了将DOM元素转换为Threejs可以使用的数据结构,使用CSS2DRenderer渲染器渲染这些DOMCSS的平面,使其可以作为一个物体添加到Threejs场景里 如下效果图: 2. 实现步骤 首先创建一个ThreejsVueVite的项目,作为本次的demo项目下载Threejs第三方库 yarn…

力扣hot100:25. K 个一组翻转链表

LeetCode&#xff1a;25. K 个一组翻转链表 这个题很像24. 两两交换链表中的节点 和 206. 反转链表 的合并体。 在力扣hot100&#xff1a;24. 两两交换链表中的节点中我们使用递归来实现这个问题是很方便的&#xff0c;使用迭代在k个结点一组时就不太好使了&#xff0c;我们可…

谷粒商城实战(032 业务-秒杀功能3)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第319p-第p325的内容 秒杀首页编写 预告秒杀信息 创建action请求 创建service 模糊查询 使用*号 ps:redis单线程&#xff0c;你用keys会阻塞一…

温补晶振TG5032SGN专用于无线通信设备应用

随着无线通信技术的快速发展&#xff0c;设备对时钟源的精度和稳定性的要求越来越高。爱普生温补晶振&#xff08;TCXO&#xff09;TG5032SGN因其优异的性能&#xff0c;成为无线通信设备中不可或缺的关键组件。TG5032SGN采用紧凑的封装设计&#xff0c;非常适合集成到各种无线…

Linux---进程/磁盘管理

文章目录 目录 文章目录 一.Linux中进程的概念 二.显示系统执行的进程 2.1: ps 命令 2.2 top 命令 三.终止进程 四.磁盘分区 一.Linux中进程的概念 在Linux中&#xff0c;进程是指操作系统中正在执行的程序的实例。每个进程都由操作系统分配了独立的内存空间&#xff0c;用于…

hadoop配置nfs,window映射nfs

1.修改hadoop配置如下内容,并同步到其它节点 core-site.xml新增配置项 <!-- 允许hadoop用户代理任何其它用户组 --><property><name>hadoop.proxyuser.hadoop.groups</name><value>*</value></property><!-- 允许代理任意服务器…

TypeScript的never类型的妙用

never类型介绍 在 TypeScript 中&#xff0c;"never" 是一个表示永远不会发生的值类型。 使用场景 "never" 类型通常用于以下几种情况&#xff1a; 1、函数返回类型&#xff1a;当一个函数永远不会返回任何值&#xff08;比如抛出异常或者无限循环&…

跟TED演讲学英文:Let your garden grow wild by Rebecca McMackin

Let your garden grow wild Link: https://www.ted.com/talks/rebecca_mcmackin_let_your_garden_grow_wild Speaker: Rebecca McMackin Date: October 2023 文章目录 Let your garden grow wildIntroductionVocabularySummaryTranscriptAfterword Introduction Many garden…

110、python-第四阶段-7-Socket服务端开发

服务端代码&#xff1a; 启动客户端工具 netAssist.exe&#xff0c;连接socket服务&#xff0c;如下&#xff0c;进行通信

声音突破:so 索

小孩儿看完武侠剧&#xff0c;就决定从二楼往地面上跳&#xff0c;年轻的老妈看到了&#xff0c;就在那里骂&#xff0c;喝斥不准逞能&#xff0c;不许乱来&#xff0c;不许跳。但小孩子不听话&#xff0c;心里全是影视剧的画面&#xff0c;那叫一个侠之能也&#xff0c;于是飞…

低代码平台适用于哪些行业 低代码开发平台行业应用案例

基于您的查询和提供的网络搜索结果&#xff0c;低代码开发平台在多个行业中都有广泛的应用案例。这些平台能够帮助企业快速构建应用程序&#xff0c;减少编码工作&#xff0c;提高开发效率和产品质量。下面是一些典型行业的低代码应用案例&#xff1a; 低代码平台行业应用场景 …

视频怎么压缩变小?推荐三个压缩方法

视频怎么压缩变小&#xff1f;在数字时代&#xff0c;视频已成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;随着视频质量的提升&#xff0c;视频文件的大小也随之增加&#xff0c;这给存储和分享带来了不小的挑战。幸运的是&#xff0c;市面上有许多视频压缩软件…

CUDA Unity Compute Shader 3

计划 这应该是第3章的读书笔记&#xff0c;但是因为第3章读起来比较困难&#xff0c;所以先看了《CUDA并行程序设计编程指南》的第5章和第6章&#xff0c;感觉读起来顺畅多了&#xff0c;《CUDA并行程序设计编程指南》暂定精读第5、6、7章 1.如何生成ptx文件 属性➔CUDA C/C➔…

鸿蒙轻内核M核源码分析系列六 任务及任务调度(3)任务调度模块

调度&#xff0c;Schedule也称为Dispatch&#xff0c;是操作系统的一个重要模块&#xff0c;它负责选择系统要处理的下一个任务。调度模块需要协调处于就绪状态的任务对资源的竞争&#xff0c;按优先级策略从就绪队列中获取高优先级的任务&#xff0c;给予资源使用权。本文我们…

java多线程原理

1.线程创建与启动&#xff1a;通过继承Thread类或实现Runnable接口创建线程&#xff0c;并调用start()方法启动线程。 1.线程状态&#xff1a;线程在其生命周期中有多种状态&#xff0c;包括新建、运行、阻塞、死亡等。了解这些状态以及如何在它们之间转换对于管理线程至关重要…

完美解决 mysql 报错ERROR 1524 (HY000): Plugin ‘mysql_native_password‘ is not loaded

文章目录 错误描述错误原因解决步骤 跟着我下面的步骤走&#xff0c;解决你的问题&#xff0c;如果解决不了 私信我来给你解决 错误描述 执行ALTER USER root% IDENTIFIED WITH mysql_native_password BY 123456;报错ERROR 1524 (HY000): Plugin mysql_native_password is not …