Linux操作系统:从分布式计算到容器化的实践

Linux集群与高可用性技术:从分布式计算到容器化的实践

摘要

随着云计算和大数据技术的飞速发展,Linux集群和高可用性技术已成为现代IT架构的核心组成部分。本文以幽默风趣的方式,深入探讨了Linux集群技术(如Hadoop、Spark等分布式计算框架)、高可用性技术(如心跳检测、故障转移等)以及容器技术(如Docker和Docker Compose)。通过理论与实践相结合的方式,本文不仅介绍了这些技术的基本概念和架构,还通过实例展示了如何在实际场景中应用这些技术,为读者提供了一站式的知识体系。


1. 引言

在当今数字化时代,服务器就像是一群“打工仔”,它们需要协同工作才能完成复杂的任务。而Linux集群技术就像是给这些“打工仔”安排了一个超级团队,让它们能够并肩作战。高可用性技术则是这个团队的“急救医生”,确保在某个“打工仔”生病时,其他成员能够无缝接管工作。容器技术更是像一个神奇的“变形金刚”,能够将应用程序及其依赖打包成一个独立的容器,随时随地都能快速启动。本文将带你走进这个奇妙的世界,探索这些技术的奥秘。


2. Linux集群技术:一群服务器的“团队作战”

2.1 分布式计算框架:Hadoop和Spark的“武林争霸”

在大数据时代,数据就像是一座座金矿,而我们需要强大的工具来挖掘这些宝藏。Hadoop和Spark就是两位武林高手,各自有着独门绝技。Hadoop擅长处理海量数据,就像一个力大无穷的巨人,能够将数据分成一块块,然后分给不同的服务器去处理。Spark则像是一个敏捷的剑客,能够快速地在内存中处理数据,速度比Hadoop快上好几倍。它们的出现,让分布式计算变得更加高效和强大。

Hadoop:力大无穷的“数据巨人”

Hadoop是一个开源的分布式计算框架,专为处理海量数据而设计。它的核心是HDFS(Hadoop Distributed File System)和MapReduce编程模型。HDFS负责将数据分散存储到多个节点上,确保数据的高可用性和容错性。MapReduce则通过将计算任务分解为多个子任务并分配到不同的节点上执行,从而实现并行计算。

Hadoop的架构可以分为以下几个关键部分:

  1. HDFS(Hadoop Distributed File System):这是Hadoop的分布式文件系统,能够将大文件分割成多个小块(通常为128MB),并将这些小块分散存储到不同的节点上。这种设计不仅提高了数据的读写速度,还通过冗余存储(默认三份副本)增强了数据的可靠性。

  2. NameNode和DataNode:HDFS的架构包括一个NameNode(主节点)和多个DataNode(从节点)。NameNode负责管理文件系统的元数据(如文件的存储位置、文件大小等),而DataNode则负责存储实际的数据块。

  3. MapReduce:这是Hadoop的核心计算模型。MapReduce通过将计算任务分为Map(映射)和Reduce(归并)两个阶段来实现并行计算。Map任务负责处理输入的数据块并生成中间结果,而Reduce任务则对中间结果进行汇总,最终生成最终结果。

Hadoop的优点在于其强大的容错能力和对大规模数据的处理能力。但它也有缺点,比如MapReduce的计算模型相对复杂,且对内存的利用效率较低。这为Spark的出现提供了契机。

Spark:敏捷的“内存剑客”

Spark是一个基于内存计算的分布式计算框架,它的目标是解决Hadoop在处理速度上的瓶颈。Spark的核心是RDD(Resilient Distributed Dataset,弹性分布式数据集),它将数据存储在内存中,从而大大提高了数据处理的速度。Spark不仅支持批处理,还支持实时流处理(Spark Streaming)和机器学习(MLlib)等多种计算模式。

Spark的架构可以分为以下几个关键部分:

  1. RDD(Resilient Distributed Dataset):这是Spark的核心数据结构,表示一个不可变的分布式数据集合。RDD支持两种操作:Transformation(转换操作,如map、filter等)和Action(行动操作,如collect、saveAsTextFile等)。Transformation操作是惰性计算的,只有当执行Action操作时才会触发实际的计算。

  2. DAG(Directed Acyclic Graph):Spark通过DAG来表示计算任务的依赖关系。DAG调度器会根据RDD之间的依赖关系生成一个有向无环图,并将其拆分为多个Stage(阶段)进行并行计算。

  3. Spark的生态系统:Spark不仅是一个计算框架,还拥有一个强大的生态系统,包括Spark SQL(用于数据查询)、Spark Streaming(用于实时流处理)、MLlib(机器学习库)和GraphX(图计算库)等。

Spark的优点在于其快速的处理速度和灵活的编程模型。它能够充分利用内存资源,大大提高了数据处理的效率。然而,Spark的缺点在于其对内存的需求较高,且在处理超大规模数据时可能会遇到资源瓶颈。

Hadoop vs. Spark:谁才是分布式计算的“武林盟主”?

Hadoop和Spark各有优势,选择哪一个取决于具体的应用场景:

  • 如果你需要处理海量数据,且对处理速度的要求不高,Hadoop是一个不错的选择。它的容错能力和数据存储能力非常强大,适合大规模数据的离线处理。

  • 如果你需要快速处理数据,尤其是实时数据,Spark则更具优势。它的内存计算能力和灵活的编程模型能够满足对速度和效率的高要求。

在实际应用中,很多企业会同时使用Hadoop和Spark,将它们的优势结合起来。例如,使用Hadoop存储数据,然后通过Spark进行快速计算。这种“组合拳”能够充分发挥两者的长处,实现高效的数据处理。

2.2 集群的分类与架构:不同的队伍,不同的战斗方式

Linux集群可以分为高可用集群、负载均衡集群和高性能计算集群。高可用集群就像是一个永不掉线的守护者,通过心跳检测和故障转移,确保服务始终可用。负载均衡集群则像是一个聪明的调度员,能够将用户的请求合理分配到不同的服务器上,避免某一台服务器过载。高性能计算集群则是计算界的超级战士,通过并行计算,能够快速解决复杂的科学计算问题。

高可用集群:永不掉线的“守护者”

高可用集群的目标是确保服务的持续可用性。即使某个节点出现故障,整个系统仍然能够正常运行。高可用集群的核心技术包括心跳检测、故障转移和资源接管。

  1. 心跳检测(Heartbeat):这是高可用集群的核心机制之一。通过定期发送心跳信号,系统可以检测节点的健康状态。如果某个节点在规定时间内没有发送心跳信号,系统会认为该节点已经故障,并触发故障转移机制。

  2. 故障转移(Failover):当检测到某个节点故障时,系统会自动将服务切换到备用节点上。这个过程通常是无缝的,用户甚至不会察觉到任何中断。

  3. 资源接管(Resource Takeover):在故障转移完成后,备用节点会接管故障节点的资源,包括IP地址、存储设备和应用程序等。通过这种方式,服务能够继续正常运行。

高可用集群的典型应用场景包括Web服务、数据库服务和企业级应用等。例如,一个在线购物网站需要确保其Web服务器和数据库服务器的高可用性,以避免因服务器故障而导致的业务中断。

负载均衡集群:聪明的“调度员”

负载均衡集群的目标是合理分配用户的请求,避免某一台服务器过载。通过将请求均匀分配到多个服务器上,负载均衡集群能够提高系统的整体性能和可用性。

  1. 负载均衡算法:负载均衡集群通常使用特定的算法来分配请求。常见的算法包括轮询(Round Robin)、最少连接(Least Connections)和加权轮询(Weighted Round Robin)等。轮询算法会按照顺序将请求分配到各个服务器上;最少连接算法会将请求分配到当前连接数最少的服务器上;加权轮询算法则会根据服务器的权重分配请求。

  2. 硬件负载均衡器:一些企业会使用硬件负载均衡器(如F5 BIG-IP)来实现负载均衡。这些设备专门用于处理高流量的负载均衡任务,具有高性能和高可靠性。

  3. 软件负载均衡解决方案:除了硬件负载均衡器,还可以使用软件解决方案,如HAProxy和Nginx。HAProxy是一个高性能的TCP/HTTP负载均衡器,能够处理大量的并发连接;Nginx则可以通过反向代理的方式实现负载均衡。

负载均衡集群的典型应用场景包括Web服务器集群、应用服务器集群和数据库集群等。例如,一个大型门户网站可能会使用负载均衡集群来处理用户的访问请求,确保每个用户的请求都能得到快速响应。

高性能计算集群:计算界的“超级战士”

高性能计算集群的目标是通过并行计算快速解决复杂的科学计算问题。这种集群通常用于需要大量计算资源的场景,如气象模拟、生物信息学和金融风险分析等。

  1. 并行计算:高性能计算集群的核心是并行计算。通过将复杂的计算任务分解为多个子任务,并分配到不同的节点上执行,能够大大缩短计算时间。

  2. 消息传递接口(MPI):MPI是一种用于并行计算的通信协议,允许节点之间进行高效的数据交换。通过MPI,多个节点可以协同工作,完成复杂的计算任务。

  3. GPU加速:许多高性能计算集群会使用GPU(图形处理单元)来加速计算。GPU具有强大的并行计算能力,能够显著提高计算效率。

高性能计算集群的典型应用场景包括科学研究、工程设计和数据分析等。例如,一个气象研究机构可能会使用高性能计算集群来模拟气候变化,通过并行计算快速生成气象预测模型。

2.3 实例:搭建一个简单的高可用集群

假设我们有一个Web服务,需要确保它始终可用。我们可以使用Heartbeat软件来搭建一个高可用集群。以下是一个详细的搭建过程:

环境准备

我们需要两台服务器,一台作为主服务器(Primary Server),另一台作为备用服务器(Backup Server)。假设它们的IP地址分别为192.168.1.100(主服务器)和192.168.1.101(备用服务器)。此外,我们还需要一个虚拟IP地址(Virtual IP),用于对外提供服务,假设为192.168.1.200

安装Heartbeat

在两台服务器上安装Heartbeat软件。Heartbeat是一个开源的高可用性解决方案,支持心跳检测和故障转移。

sudo apt-get update
sudo apt-get install heartbeat
配置Heartbeat

Heartbeat的配置文件通常位于/etc/heartbeat/目录下。我们需要编辑以下几个配置文件:

  1. /etc/heartbeat/ha.cf:这是Heartbeat的主要配置文件,用于定义集群的基本参数。

# 定义心跳通信方式
keepalive 2
deadtime 30
warntime 10
initdead 120# 定义集群节点
node primary
node backup# 定义心跳通信接口
udpport 694
ucast eth0 192.168.1.101# 定义日志文件
logfacility local0
  1. /etc/heartbeat/authkeys:这个文件用于定义心跳通信的认证方式。

auth 1
1 sha1 YourSecretKey
  1. /etc/heartbeat/haresources:这个文件用于定义资源的分配。

primary 192.168.1.200 nginx

这个配置表示当主服务器正常运行时,它将绑定虚拟IP地址192.168.1.200并运行Nginx服务。如果主服务器故障,备用服务器将接管这些资源。

启动Heartbeat服务

在两台服务器上启动Heartbeat服务:

sudo systemctl enable heartbeat
sudo systemctl start heartbeat
测试故障转移

为了验证故障转移功能,我们可以在主服务器上模拟一个故障。例如,可以通过关闭Heartbeat服务来模拟故障:

sudo systemctl stop heartbeat

此时,备用服务器会检测到主服务器的心跳信号丢失,并接管虚拟IP地址和Nginx服务。我们可以通过访问虚拟IP地址192.168.1.200来验证服务是否已经成功切换到备用服务器。

恢复主服务器

当主服务器恢复正常后,它会重新接管虚拟IP地址和服务。我们可以通过重新启动Heartbeat服务来完成这个过程:

bash复制

sudo systemctl start heartbeat

通过这个实验,我们可以直观地看到高可用性技术的强大之处。即使主服务器出现故障,备用服务器也能够无缝接管服务,确保用户不会感受到任何中断。


3. 高可用性技术:让服务器永不掉线的秘密武器

3.1 心跳检测:服务器的“健康体检”

心跳检测是高可用性技术的核心,就像医生给病人做体检一样,通过定期发送心跳信号,检测服务器是否正常工作。如果服务器没有按时回复心跳信号,那么系统就会认为它出现了故障,从而触发故障转移机制。

心跳检测的工作原理

心跳检测通常通过以下几种方式进行:

  1. 网络心跳(Network Heartbeat):通过网络发送心跳信号,检测节点之间的通信是否正常。这种方式的优点是简单易实现,缺点是可能会受到网络延迟或故障的影响。

  2. 串行心跳(Serial Heartbeat):通过串行电缆发送心跳信号,这种方式相对稳定,但需要额外的硬件支持。

  3. 磁盘心跳(Disk Heartbeat):通过共享磁盘发送心跳信号,这种方式的优点是稳定可靠,缺点是需要配置共享存储。

在实际应用中,网络心跳是最常用的方式。它可以通过UDP或TCP协议实现,具有简单和高效的特点。

心跳检测的参数配置

心跳检测的参数配置对于系统的可靠性至关重要。常见的参数包括:

  1. Keepalive:心跳信号的发送间隔时间,通常设置为2秒或更短。这个参数决定了系统检测故障的灵敏度。

  2. Deadtime:节点被判定为故障的时间阈值。如果一个节点在Deadtime时间内没有发送心跳信号,系统会认为它已经故障。

  3. Warntime:警告时间阈值。如果一个节点在Warntime时间内没有发送心跳信号,系统会发出警告,但不会触发故障转移。

  4. Initdead:集群启动时的初始检测时间。这个参数通常设置为较长的时间,以避免在集群启动时误判节点故障。

通过合理配置这些参数,可以提高系统的可靠性和容错能力。

3.2 故障转移:无缝切换的魔法

故障转移就像是一个自动切换的开关,当主服务器出现故障时,备用服务器会无缝接管服务,让用户甚至感觉不到任何中断。这种技术的应用,让服务器的可用性得到了极大的提升。

故障转移的工作原理

故障转移的实现依赖于以下几个关键步骤:

  1. 故障检测:通过心跳检测机制,系统会检测到主服务器的心跳信号丢失。

  2. 资源接管:备用服务器会接管主服务器的资源,包括IP地址、存储设备和应用程序等。

  3. 服务恢复:备用服务器启动相关服务,确保服务的持续可用性。

故障转移的类型

故障转移可以根据资源的接管方式分为以下几种类型:

  1. 主动-被动(Active-Passive):在这种模式下,备用服务器在接管资源之前处于待命状态。当主服务器故障时,备用服务器会接管资源并启动服务。

  2. 主动-主动(Active-Active):在这种模式下,主服务器和备用服务器同时运行服务,但备用服务器会在主服务器故障时接管更多的资源和服务。

  3. 多节点故障转移:在这种模式下,多个备用服务器可以同时参与故障转移,提高系统的容错能力。

3.3 实例:使用Heartbeat实现故障转移

我们可以通过一个简单的实验来验证Heartbeat的故障转移功能。在两台服务器上安装Heartbeat软件,并配置好心跳检测和故障转移的参数。然后,模拟主服务器的故障,观察备用服务器是否能够成功接管服务。通过这个实验,我们可以直观地看到高可用性技术的强大之处。

实验环境

我们需要两台服务器,一台作为主服务器(Primary Server),另一台作为备用服务器(Backup Server)。假设它们的IP地址分别为192.168.1.100(主服务器)和192.168.1.101(备用服务器)。此外,我们还需要一个虚拟IP地址(Virtual IP),用于对外提供服务,假设为192.168.1.200

安装和配置Heartbeat

在两台服务器上安装Heartbeat软件,并编辑配置文件/etc/heartbeat/ha.cf/etc/heartbeat/authkeys/etc/heartbeat/haresources

测试故障转移

通过关闭主服务器的Heartbeat服务来模拟故障,观察备用服务器是否能够成功接管虚拟IP地址和服务。通过访问虚拟IP地址192.168.1.200,可以验证服务是否已经成功切换到备用服务器。

恢复主服务器

当主服务器恢复正常后,重新启动Heartbeat服务,主服务器会重新接管虚拟IP地址和服务。通过这个实验,我们可以直观地看到高可用性技术的强大之处。


4. 容器技术:Docker的奇幻世界

4.1 Docker的基本概念和架构:容器的魔法盒子

Docker就像是一个神奇的魔法盒子,能够将应用程序及其依赖打包成一个独立的容器。它的架构基于客户端-服务器模式,客户端通过API与守护进程通信,实现容器的创建、启动和管理。

4.2 安装和使用Docker:开启容器之旅

安装Docker就像安装一个普通的软件一样简单。只需要在Linux系统上运行几条命令,就可以完成安装。然后,我们可以通过Docker命令来创建和运行容器。例如,我们可以运行一个简单的Web服务器容器,只需要一条命令:docker run -d -p 80:80 nginx

4.3 构建Docker镜像:打造自己的“变形金刚”

Docker镜像是容器的“模板”,它包含了应用程序运行所需的文件、库和依赖项。我们可以通过编写Dockerfile来定义如何构建Docker镜像。例如,以下是一个简单的Dockerfile示例:

FROM python:3.9-slim  
WORKDIR /app  
COPY . /app  
RUN pip install -r requirements.txt  
CMD ["python", "app.py"]

通过运行docker build -t myapp .命令,就可以基于这个Dockerfile构建一个名为myapp的镜像。

4.4 使用Docker Compose管理多容器应用:一键启动的“超级管家”

当我们的应用变得复杂,需要多个容器协同工作时,Docker Compose就派上用场了。Docker Compose通过一个docker-compose.yml文件来定义多个容器之间的关系,然后使用一条命令docker-compose up就可以启动整个应用。

例如,以下是一个简单的docker-compose.yml文件,用于启动一个包含Web服务和数据库服务的多容器应用:

version: '3.8'  
services:  web:  image: nginx:latest  ports:  - "8080:80"  networks:  - app-network  volumes:  - ./nginx.conf:/etc/nginx/nginx.conf  db:  image: mysql:latest  environment:  MYSQL_ROOT_PASSWORD: example  
networks:  app-network:  

通过这个文件,我们可以轻松管理多个容器,而不需要手动启动和配置每个容器。


5. 总结

本文以幽默风趣的方式,深入探讨了Linux集群技术、高可用性技术和容器技术。通过理论与实践相结合的方式,我们不仅了解了这些技术的基本概念和架构,还通过实例展示了如何在实际场景中应用这些技术。希望本文能够帮助读者更好地理解和掌握这些技术,为他们在云计算和大数据领域的探索提供一份实用的指南。

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

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

相关文章

python和pycharm 和Anaconda的关系

好的,下面我会详细说明 Python、PyCharm 和 Anaconda 三者的关系,并逐一解释它们的功能和作用。 1. Python(编程语言) 定义:Python 是一种高级编程语言,设计简洁,易于学习,且功能强…

STM32 外部中断和NVIC嵌套中断向量控制器

目录 背景 外部中断/事件控制器(EXTI) 主要特性 功能说明 外部中断线 嵌套向量中断控制器 特性 ‌中断线(Interrupt Line) 中断线的定义和作用 STM32中断线的分类和数量 优先级分组 抢占优先级(Preemption Priority) …

代码随想录算法【Day49】

Day49 42. 接雨水 思路 这道题利用单调栈进行横向求解。对于每一个元素,找到它右边第一个比它大的元素和左边第一个比它大(或者与它相等的元素,当然这种情况可以忽略),最后计算雨水的存储量:&#xff08…

PHP 网络编程介绍

PHP 学习资料 PHP 学习资料 PHP 学习资料 在当今数字化时代,网络编程是开发各类应用必不可少的技能。PHP 作为一门广泛应用于 Web 开发的编程语言,同样具备强大的网络编程能力。接下来,我们将深入探讨 PHP 中网络连接的建立、Socket 编程、…

《深度学习》——ResNet网络

文章目录 ResNet网络ResNet网络实例导入所需库下载训练数据和测试数据设置每个批次的样本个数判断是否使用GPU定义残差模块定义ResNet网络模型导入GPU定义训练函数定义测试函数创建损失函数和优化器训练测试数据结果 ResNet网络 ResNet(Residual Network&#xff0…

为什么要学习AI、掌握AI技能有什么用?

随着人工智能的迅速的发展,DeepSeek的爆火,加之目前就业环境的走向,越来越多的职场朋友开始关注到AI的发展,重视AI技能的掌握。不少同学都会问:“职场人为什么要学习AI、掌握AI技能?” 为什么要学AI 现…

AIP-146 泛化域

编号146原文链接AIP-146: Generic fields状态批准创建日期2019-05-28更新日期2019-05-28 API中的大多数域,无论是在请求、资源还是自定义应答中,都有具体的类型或模式。这个模式是约定的一部分,开发者依此约定进行编码。 然而,偶…

vue3和vue2的组件开发有什么区别

Vue3和Vue2在组件开发上存在不少差异,下面从多个方面详细介绍: 响应式原理 Vue2:用Object.defineProperty()方法来实现响应式。打个比方,它就像给对象的每个属性都安排了一个“小管家”,属性被访问或修改时&#xff0…

【NLP 25、模型训练方式】

目录 一、按学习范式分类 1. 监督学习(Supervised Learning) 2. 无监督学习(Unsupervised Learning) 3. 半监督学习(Semi-supervised Learning) 4. 强化学习(Reinforcement Learning, RL&#x…

1-知识图谱-概述和介绍

知识图谱:浙江大学教授 陈华军 知识图谱 1课时 http://openkg.cn/datasets-type/ 知识图谱的价值 知识图谱是有什么用? 语义搜索 问答系统 QA问答对知识图谱:结构化图 辅助推荐系统 大数据分析系统 自然语言理解 辅助视觉理解 例…

零基础学QT、C++(一)安装QT

目录 如何快速学习QT、C呢? 一、编译器、项目构建工具 1、编译器(介绍2款) 2、项目构建工具 二、安装QT 1、下载QT安装包 2、运行安装包 3、运行QT creator 4、导入开源项目 总结 闲谈 如何快速学习QT、C呢? 那就是项目驱动法&…

STM32外设SPI FLASH应用实例

STM32外设SPI FLASH应用实例 1. 前言1.1 硬件准备1.2 软件准备 2. 硬件连接3. 软件实现3.1 SPI 初始化3.2 QW128 SPI FLASH 驱动3.3 乒乓存储实现 4. 测试与验证4.1 数据备份测试4.2 数据恢复测试 5 实例5.1 参数结构体定义5.2 存储参数到 SPI FLASH5.3 从 SPI FLASH 读取参数5…

Leetcode2080:区间内查询数字的频率

题目描述: 请你设计一个数据结构,它能求出给定子数组内一个给定值的 频率 。 子数组中一个值的 频率 指的是这个子数组中这个值的出现次数。 请你实现 RangeFreqQuery 类: RangeFreqQuery(int[] arr) 用下标从 0 开始的整数数组 arr 构造…

Spring Boot自动装配:约定大于配置的魔法解密

#### 一、自动装配的哲学思考 在传统Spring应用中,开发者需要手动配置大量的XML或JavaConfig。Spring Boot通过自动装配机制实现了**约定大于配置**的设计理念,其核心思想可以概括为: 1. **智能预设**:基于类路径检测自动配置 2…

Fiddler笔记

文章目录 一、与F12对比二、核心作用三、原理四、配置1.Rules:2.配置证书抓取https包3.设置过滤器4、抓取App包 五、模拟弱网测试六、调试1.线上调试2.断点调试 七、理论1.四要素2.如何定位前后端bug 注 一、与F12对比 相同点: 都可以对http和https请求进行抓包分析…

Python爬虫-猫眼电影的影院数据

前言 本文是该专栏的第46篇,后面会持续分享python爬虫干货知识,记得关注。 本文笔者以猫眼电影为例子,获取猫眼的影院相关数据。 废话不多说,具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。接下来,跟着笔者直接往下看正文详细内容。(附带完整代码) …

linux笔记:shell中的while、if、for语句

在Udig软件的启动脚本中使用了while循环、if语句、for循环,其他内容基本都是变量的定义,所以尝试弄懂脚本中这三部分内容,了解脚本执行过程。 (1)while循环 while do循环内容如下所示,在循环中还用了expr…

利用分治策略优化快速排序

1. 基本思想 分治快速排序(Quick Sort)是一种基于分治法的排序算法,采用递归的方式将一个数组分割成小的子数组,并通过交换元素来使得每个子数组元素按照特定顺序排列,最终将整个数组排序。 快速排序的基本步骤&#…

从零到一实现微信小程序计划时钟:完整教程

在本教程中,我们将一起实现一个微信小程序——计划时钟。这个小程序的核心功能是帮助用户添加任务、设置任务的时间范围,并且能够删除和查看已添加的任务。通过以下步骤,我们将带你从零开始实现一个具有基本功能的微信小程序计划时钟。 项目…

idea日常报错之UTF-8不可映射的字符

目录 一、UTF-8不可映射的字符的解决 1、出现这种报错的情形 2、具体解决办法 前言: 在我们日常代码编写的时候可能会遇到各式各样的错误,有时候并不是你改动了代码,而是莫名其妙就出现的报错,今天我就遇到一个在maven编译的时候…