容器技术 20 年:颠覆、重构与重塑软件世界的力量

news2025/7/19 0:17:00

目录

容器技术发展史

虚拟化技术向容器技术转变

Docker的横空出世

容器编排技术与Kubernetes

微服务的出现与Istio

工业标准的容器运行时

容器技术与 DevOps 的深度融合​

无服务架构推波助澜

展望未来发展方向


从 20 世纪硬件虚拟化的笨重,到操作系统虚拟化的轻量探索,容器技术历经蜕变。2013 年 Docker 横空出世,以 “一次构建,到处运行” 的创举打破环境壁垒,开启容器黄金时代。随后,Docker Compose、Kubernetes、Istio 等技术相继涌现,从多容器管理到集群编排,再到微服务治理,不断突破应用部署与运维的边界。如今,容器与 DevOps 深度融合,Serverless 架构异军突起,共同重塑软件开发生态。本文将带你穿越容器技术发展的关键节点,揭秘其如何以颠覆性力量推动云计算与数字化

容器技术发展史

虚拟化技术向容器技术转变

在电子计算机刚出现时,由于硬件成本高昂,人们试图寻找能够多用户共享计算资源的方式,以提高资源利用率和降低成本。在 20 世纪 60 年代,基于硬件技术的主机虚拟化技术出现了。一台物理主机可以被划分为若干个小的机器,每个机器的硬件互不共享,并可以安装各自的操作系统来使用。20 世纪 90 年代后期,X86 架构的硬件虚拟化技术逐渐兴起,可在同一台物理机上隔离多个操作系统实例,带来了很多的优点,目前绝大多数的数据中心都采用了硬件虚拟化技术。

虽然硬件虚拟化提供了分隔资源的能力,但是采用虚拟机方式隔离应用程序时,效率往往较低,毕竟还要在每个虚拟机中安装或复制一个操作系统实例,然后把应用部署到其中。因此人们探索出一种更轻量的方案 —— 操作系统虚拟化,使面向应用的管理更便捷。所谓操作系统虚拟化,就是由操作系统创建虚拟的系统环境,使应用感知不到其他应用的存在,仿佛在独自占有全部的系统资源,从而实现应用隔离的目的。在这种方式中不需要虚拟机,也能够实现应用彼此隔离,由于应用是共享同一个操作系统实例的,因此比虚拟机更节省资源,性能更好。操作系统虚拟化在不少系统里面也被称为容器(Container)

操作系统虚拟化最早出现在 2000 年,FreeBSD 4.0 推出了 Jail。Jail 加强和改进了用于文件系统隔离的 chroot 环境。到了 2004 年,Sun 公司发布了 Solaris 10 的 Containers,包括 Zones 和 Resource management 两部分。Zones 实现了命名空间隔离和安全访问控制,Resource management 实现了资源分配控制。2007 年,Control Groups(简称 cgroups)进入 Linux 内核,可以限定和隔离一组进程所使用的资源(包括 CPU、内存、I/O 和网络等)。

Docker的横空出世

Docker详细学习地址:

Docker容器云介绍及基础应用-CSDN博客

2013 年,Docker 公司发布 Docker 开源项目,中文名为“码头工人”。提供了一系列简便的工具链来使用容器。Docker 出现之前,开发者和运维人员面临着诸多挑战。应用在开发环境中运行良好,但是部署到测试环境或者生产环境时,却常常出现各种问题,这就是所谓的 环境不一致” 问题。不同环境中的操作系统版本、依赖库版本、系统配置等差异,都可能导致应用无法正常运行。而且传统的应用打包和部署方式非常繁琐,需要手动安装各种依赖,配置环境变量等。Docker 的出现很好地解决了这些问题。它采用了一种将应用及其依赖打包成一个可移植的镜像的方式,这个镜像包含了运行应用所需的所有文件系统、库、环境变量等,实现了 一次构建,到处运行”。这样无论在开发、测试还是生产环境,只要有 Docker 运行时,应用都能以相同的方式运行。

传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程; 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核 且也没有进行硬件虚拟 。因此容器要比传统虚拟机更为轻便。 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。新老技术对比:

从架构上来看,Docker 采用了客户端 - 服务器(C/S)架构。Docker 客户端负责与 Docker 守护进程(Docker daemon)进行通信。用户通过客户端发送各种命令,比如构建镜像、运行容器、管理容器等。Docker 守护进程则负责实际执行这些命令,它运行在宿主机上,管理容器的生命周期,包括创建容器、启动容器、停止容器、销毁容器等。

Docker 还使用了联合文件系统(Union File System)来管理镜像和容器的文件系统。镜像由一系列的只读层组成,而容器则在镜像的基础上添加了一个可写层,这样可以在多个容器之间共享镜像的只读层,节省存储空间,同时也能保证每个容器都有自己独立的可写空间来存储运行时产生的数据。

容器编排技术与Kubernetes

随着容器化应用场景的日益复杂,单个容器往往难以满足需求,开发者经常需要部署多个相互关联的容器来构成完整的应用系统,例如一个 Web 应用可能需要一个数据库容器、一个缓存容器以及 Web 服务器容器等协同工作。在这种情况下,管理多个容器就变得非常繁琐,需要分别启动、停止、配置各个容器,还要确保它们之间的网络通信和依赖关系正确设置。

2014 年,Docker Compose 应运而生,它允许用户通过一个 YAML 文件来定义多容器的应用,并通过一条命令就可以实现对这些容器的统一编排管理,比如一键启动、停止、重启整个应用的所有容器,极大地简化了多容器应用的部署和运维流程 。

DockerCompose学习地址:

Docker-Compose基础学习_docker compose 学习-CSDN博客

例如一个典型的电商项目,通过 Docker Compose 可以轻松定义数据库容器(如 MySQL)、应用后端容器(如基于 Node.js 或 Python Flask 的服务)以及前端容器(如 Nginx 用于静态资源服务)之间的关系和配置,包括端口映射、环境变量设置、数据卷挂载等,让开发者能专注于业务逻辑开发,而不用在复杂的容器管理上耗费过多精力。

同样在 2014 年,Kubernetes 由谷歌团队发起开源项目。谷歌内部长期使用 Borg 系统来管理大规模的容器化工作负载,在实践中积累了大量关于容器编排和集群管理的经验。随着容器技术在开源社区的兴起,谷歌希望将这些经验分享出来,打造一个能在大规模生产环境中高效管理容器化应用的开源平台。当时,虽然 Docker 解决了应用打包和运行的标准化问题,但在容器集群的自动化部署、扩缩容、负载均衡以及故障恢复等方面还存在不足。

Kubernetes 应运而生。

Kubernetes详细学习地址:(匠心巨作)

Kubernetes完整详细学习笔记_kubernetes 最新学习资料-CSDN博客

它采用主从架构,主要由控制平面(Control Plane)和工作节点(Worker Nodes)两部分组成。

控制平面是 Kubernetes 集群的大脑,负责管理和控制整个集群,主要包含以下核心组件:

  • API Server:作为 Kubernetes 集群的统一入口,提供 RESTful API 接口,接收并处理来自客户端和其他组件的请求,是集群中所有资源操作的唯一入口。所有对资源(如创建、更新、删除 Pod、Service 等)的操作都需要通过 API Server 进行。它还负责验证和授权请求,确保只有合法的操作才能执行。
  • etcd:是一个高可用的键值对存储数据库,用于保存 Kubernetes 集群的所有配置信息和状态数据,如集群的节点信息、Pod 的定义和状态、Service 的配置等。它采用分布式一致性算法,保证数据在多个节点之间的一致性和可靠性,是 Kubernetes 集群正常运行的基础
  • Scheduler负责将待调度的 Pod 分配到合适的工作节点上。它会根据一系列的调度策略和算法,评估各个工作节点的资源情况(如 CPU、内存使用量)、节点标签、Pod 的亲和性和反亲和性等条件,选择最适合运行 Pod 的节点,确保集群资源的合理利用。
  • Controller Manager包含多个控制器,每个控制器负责管理 Kubernetes 集群中特定资源的生命周期,例如 Node Controller 管理节点的添加、删除和状态更新;Pod Controller 确保 Pod 按照期望的状态运行,当 Pod 出现故障时进行重启或重建;Service Controller 负责管理 Service 资源,实现服务发现和负载均衡等功能 。这些控制器通过持续监控集群状态,并与 API Server 交互来执行相应的操作,使集群始终保持在用户期望的状态。

工作节点是运行容器化应用的地方,主要包含以下组件:

  • kubelet:是工作节点上的核心代理,负责与控制平面通信,接收并执行 API Server 分配给该节点的任务。它管理 Pod 的生命周期,包括创建、启动、停止 Pod,以及管理 Pod 中的容器,如拉取镜像、启动容器、监控容器状态等。同时,kubelet 会将节点和 Pod 的状态信息汇报给 API Server,以便控制平面实时掌握集群运行情况。
  • kube - proxy是工作节点上实现服务发现和负载均衡的组件。它通过在节点上创建和管理 iptables 或 IPVS 规则,将访问 Service 的流量转发到后端对应的 Pod 上,确保客户端能够正确访问到服务 。无论是内部服务之间的调用,还是外部客户端对服务的访问,kube - proxy 都起到了关键的流量转发作用。
  • Container Runtime负责运行容器,常见的容器运行时包括 Docker、containerd、CRI - O 等。Kubernetes 通过容器运行时接口(CRI)与不同的容器运行时进行交互,实现对容器的创建、运行和管理,使得 Kubernetes 能够支持多种容器运行时环境,提高了系统的灵活性和兼容性。

Kubernetes 通过控制平面和工作节点各组件之间的紧密协作,实现了容器集群的自动化管理,能自动完成容器的部署、调度到集群中的不同节点上,根据业务负载动态调整容器实例数量,还具备自我修复能力,当某个容器出现故障时能自动重启或迁移到其他健康节点 。以一个大型互联网公司的在线业务为例,在业务高峰时段(如电商的促销活动期间),Kubernetes 能根据事先设定的规则,快速启动更多的应用容器实例来应对流量洪峰,保障服务的可用性和性能;而在业务低谷期,又能自动减少容器实例,节约计算资源。如今,Kubernetes 已经成为容器编排领域的事实标准,被广泛应用于各类企业级场景。

微服务的出现与Istio

随着容器化应用场景的日益复杂,单个容器往往难以满足需求,开发者经常需要部署多个相互关联的容器来构成完整的应用系统,此时微服务架构应运而生。传统的单体应用将所有功能模块打包在一起,随着业务规模的扩大,代码会变得臃肿,开发、维护和扩展都非常困难,而且一个小功能的修改可能需要重新部署整个应用。微服务架构将应用拆分成多个小型、独立运行的服务每个服务专注于完成单一功能,如用户服务、订单服务、支付服务等。这些服务可以使用不同的编程语言、框架和数据库,通过轻量级的通信机制(如 HTTP/REST)进行交互 。微服务架构解决了单体应用的扩展性差、维护困难等问题,使得团队可以并行开发不同的服务,加快开发速度;同时,某个服务出现故障不会影响整个应用,提高了系统的容错性和可靠性;并且可以根据业务需求对单个服务进行独立的扩展和升级。​

在微服务架构中,服务之间的通信管理、流量控制、安全防护等问题变得至关重要。2017 年,Istio 作为一个开源的服务网格(Service Mesh)项目发布,为解决这些问题提供了强大的解决方案。Istio 的核心是通过在服务之间注入代理(通常是 Envoy 代理)来实现对服务间通信的统一管理。它主要由数据平面和控制平面组成。​

数据平面由一系列的 Envoy 代理组成,这些代理部署在每个服务实例旁边,负责处理服务之间的所有网络通信,包括请求的转发、负载均衡、熔断、限流等操作 。例如,当一个服务调用另一个服务时,请求会先发送到本地的 Envoy 代理,Envoy 代理根据配置的负载均衡策略将请求转发到目标服务的 Envoy 代理,再由目标服务的 Envoy 代理将请求传递给实际的服务实例。​

控制平面则负责管理和配置数据平面,主要包含 Pilot、Mixer 和 Galley 等组件。Pilot 负责将用户定义的流量管理规则(如路由规则、熔断策略等)转换为 Envoy 代理可以理解的配置,并下发到各个 Envoy 代理,实现对服务间流量的精确控制;Mixer 提供了策略执行和遥测功能,用于控制服务的访问权限,收集服务的调用次数、延迟、吞吐量等指标数据,方便进行监控和计费;Galley 则负责验证和处理用户定义的配置,确保配置的正确性和一致性 。

通过 Istio,开发人员无需在每个服务中编写复杂的代码来实现服务治理功能,就可以轻松实现服务间的流量管理、故障恢复、安全认证和监控等,极大地降低了微服务架构的运维和管理难度,提升了微服务应用的可观测性和安全性。例如,在电商大促期间,通过 Istio 可以灵活地调整流量分配,将更多流量导向核心服务;当某个服务出现异常时,Istio 能自动进行熔断,防止故障扩散,保障整个系统的稳定性 。

工业标准的容器运行时

containerd 最早于 2015 年出现在 Docker Engine 中,后来为了使 Docker Engine 更加轻量、快速和健壮,2016 年 Docker 将 containerd 从 daemon

dockerd中独立出来,并完成与 daemon 的集成。独立后的 containerd 全面支持 OCI(Open Container Initiative)资源的启动和生命周期管理,这意味着它可以支持除 runc(其前身是 Docker 中的 libcontainer,后来捐赠给 LF)以外的其他 OCI 实现,增强了容器运行时的可扩展性和兼容性 。

2017 年 Docker 将 containerd 捐献给 CNCF,并在 2019 年 2 月 containerd 从 CNCF 毕业,其健壮性得到了业界广泛认可。containerd 在架构上负责处理容器的创建、运行、停止等核心操作,它接收来自上层(如 Docker Engine 或 Kubernetes 等)的请求,不会直接去操作容器(避免因自身故障影响容器运行),而是先创建一个 container - shim 进程,由 container - shim 调用 runc cli 来运行容器,并通过 Unix domain socket 暴露 API 给 containerd 用于容器管理,同时提供镜像拉取、删除、检查、存储等功能,是容器技术生态中底层且关键的一环 。

  时至今日, Containerd 已经成为一个工业级的容器运行时了,甚至已经有了 solgen : 超简单!超健壮!超强移植性!当然,为了让 Docker 以为自己不会抢饭碗, Containerd 声称自己的设计的主要目的是为了嵌入到更大的系统中(暗指 Kubernetes),而不是直接由开发人员或者终端用户使用。事实上呢,Containerd 基本啥都干了,开发人员或者终端用可以在宿主机中管理完整的容器生命周期,包括镜像的传输和存储、容器的执行和管理、依赖文件的存储和网络等等。

容器技术与 DevOps 的深度融合​

DevOps 是一种强调开发(Development)和运维(Operations)协同合作的文化、理念和实践方法,旨在缩短系统开发周期,提高软件交付频率和质量,实现业务的快速迭代和持续创新。容器技术与 DevOps 理念天然契合,从多个维度为 DevOps 的落地提供了强大支持,推动了软件开发和交付流程的变革。

在持续集成(Continuous Integration,CI)环节,容器技术的镜像特性发挥了关键作用。开发人员可以将应用代码及其依赖打包成容器镜像,每次代码提交后,CI 系统可以基于该镜像快速构建、测试应用。由于容器镜像的一致性,无论是在开发人员的本地环境、CI 服务器环境还是后续的测试和生产环境,应用的运行环境都是一致的,这有效避免了 “在我的机器上能运行,在其他环境却不行” 的问题,极大地提高了测试的准确性和效率。同时,容器镜像的分层存储机制使得镜像的构建和更新速度更快,当代码仅有少量改动时,只需更新相应的层,无需重新构建整个镜像,加快了 CI 流程。​

在持续交付(Continuous Delivery,CD)阶段,容器的轻量化和可移植性优势明显。基于容器部署的应用可以轻松地在不同环境(如开发、测试、预生产、生产环境)之间迁移。Kubernetes 等容器编排工具与 CD 流水线集成后,可以实现应用的自动化部署、扩缩容和回滚。例如,当 CD 流水线检测到新的容器镜像通过了所有测试后,Kubernetes 可以按照预先定义的部署策略,将新的容器实例快速部署到生产环境中,并且在出现问题时,能够迅速回滚到之前的稳定版本,保障业务的连续性。​

容器技术还促进了开发和运维团队之间的协作。在传统模式下,开发和运维团队可能使用不同的工具和技术栈,导致沟通成本高、协作效率低。而容器技术提供了统一的标准化运行环境,开发团队以容器镜像的形式交付应用,运维团队基于容器和容器编排工具进行部署和管理,双方使用相同的技术语言和操作方式,减少了因环境差异和技术理解不同产生的矛盾,增强了团队间的协作效率和信任度。

此外,容器技术与 DevOps 结合,有助于实现更精细的监控和日志管理。在容器化应用中,每个容器都是一个独立的运行单元,通过容器运行时和编排工具,可以方便地收集容器的资源使用情况(如 CPU、内存、网络流量)、运行状态等指标数据。同时,容器内应用产生的日志也可以通过标准化的方式进行收集、存储和分析。这些监控和日志数据为开发和运维人员提供了丰富的信息,帮助他们快速定位和解决问题,优化应用性能,进一步推动应用的持续改进和优化,实现 DevOps 所追求的持续反馈和持续改进的闭环。

无服务架构推波助澜

Serverless(无服务器架构)在云计算领域逐渐兴起。它最早可追溯到 2006 年亚马逊云科技发布的第一个无服务器架构的存储服务 Amazon S3,2012 年 Ken Form 在文章中首次提出 “serverless” 概念,2014 年亚马逊云科技推出的 Amazon Lambda 服务普及了这一计算模型 。Serverless 以平台即服务(PaaS)为基础,为开发者提供了一种微型架构,其架构主要由事件源、函数计算服务和后端服务三大部分组成。

事件源是触发 Serverless 函数执行的起点,可以是多样化的。例如,在云存储场景中,文件上传到指定的存储桶可以作为事件源;在数据库领域,数据的插入、更新或删除操作也能触发相应的函数;此外,HTTP 请求、消息队列中的消息到达等都可以作为事件源 。事件源将事件信息发送给函数计算服务,从而启动函数的执行流程。

函数计算服务是 Serverless 架构的核心部分,负责接收来自事件源的请求,执行开发者编写的函数代码,并管理函数的运行环境。它具备自动弹性扩展能力,能够根据事件的流量自动调整计算资源的分配 。当有大量事件同时触发函数执行时,函数计算服务可以快速启动更多的计算实例来处理请求,确保服务的性能和响应速度;而在事件较少时,又能自动减少资源占用,节省成本。函数计算服务还提供了诸如日志记录、监控指标收集、错误处理等功能,方便开发者对函数的运行情况进行跟踪和调试。

后端服务为函数提供支持和数据存储功能。后端服务涵盖多种类型,包括数据库服务(如关系型数据库、NoSQL 数据库)用于存储和检索数据;消息队列服务用于实现异步通信和解耦;文件存储服务用于存储文件等 。函数在执行过程中,可以根据业务需求与后端服务进行交互,例如从数据库中读取数据进行处理,将处理结果写入数据库,或者向消息队列发送消息等 。

在 Serverless 架构下,终端客户无需部署、配置或管理服务器服务,代码运行所需的服务器资源都由云端平台自动提供。例如开发者只需编写云函数,并选择触发函数运行的事件(如上传文件到云存储、数据库数据变更等),系统会自动处理底层的服务器选择、部署、容错、监控、日志等运维操作 。Serverless 架构具有诸多优势,如用户无需管理服务器,可将精力集中在业务代码编写上;按实际使用的资源(如函数执行时间)付费,相比传统云计算按预留资源收费更加经济;具备自动持续扩容能力,能轻松应对流量的大幅波动;内置高可用和容错机制,保障服务稳定性 。

Serverless 不仅应用于计算领域,还逐渐成为云原生数据库、云原生数据分析乃至人工智能的标配,推动着云计算向更加便捷、高效、低成本的方向发展。

展望未来发展方向

展望未来,容器技术有望在多个方面持续创新。安全性方面,随着容器应用在企业核心业务中的深入,对容器安全隔离、镜像安全扫描、运行时安全监测等技术的需求将更加强烈,相关技术将不断演进以应对日益复杂的安全威胁 。性能优化上,进一步提升容器的启动速度、资源利用效率,减少容器运行时的开销仍是重要方向,例如通过优化容器运行时的内核机制、文件系统和网络协议栈等 。与新兴技术的融合也将是趋势,如结合人工智能技术实现容器资源的智能调度和应用性能的自动优化;在边缘计算场景中,容器技术将助力实现应用在边缘节点的快速部署和高效运行,满足实时性、低带宽等特殊需求 。

此外,容器生态系统将更加完善,不同工具和平台之间的兼容性、互操作性会进一步提升,降低开发者使用容器技术构建和运维应用的门槛,使容器技术在更多领域得到更广泛的应用,持续推动软件开发生命周期和云计算产业的变革 。

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

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

相关文章

cmake:test project

本文主要探讨cmake在测试和项目中的应用。 add_test add_test(NAME <name> COMMAND <command> [<arg>...] [CONFIGURATIONS <config>...] [WORKING_DIRECTORY <dir>] [COMMAND_EXPAND_LISTS])  add_test(NAME test_uni COMMAND $<TARGET_F…

C++开发过程中的注意事项详解

目录 C++开发过程中的注意事项详解 一、内存管理:避免泄漏与资源浪费 1.1 使用智能指针管理动态内存 1.2 避免手动内存管理的陷阱 1.3 利用RAII机制管理资源 1.4 容器与内存分配 二、安全性:防御攻击与未定义行为 2.1 输入验证与安全编码 2.2 使用安全的通信协议 2…

第六天:Java数组

数组 数组概述 数组是相同类型数据的有序集合。数组中的元素可以是任意数据类型&#xff0c;包括基本类型和引用类型数组描述是相同类型的若干个数据&#xff0c;按照一定的先后顺序排列组合而成。数组下标从0开始。 数组声明与创建 数组的声明 int[] nums;//声明一个数组…

李沐动手深度学习(pycharm中运行笔记)——09.softmax回归+图像分类数据集+从零实现+简洁实现

09.softmax回归图像分类数据集从零实现简洁实现&#xff08;与课程对应&#xff09; 目录 一、softmax回归 1、回归 vs 分类 2、经典分类数据集&#xff1a; 3、从回归到分类——均方损失 4、从回归到多类分类——无校验比例 5、从回归到多类分类——校验比例 6、softmax和…

Qt获取CPU使用率及内存占用大小

Qt 获取 CPU 使用率及内存占用大小 文章目录 Qt 获取 CPU 使用率及内存占用大小一、简介二、关键函数2.1 获取当前运行程序pid2.2 通过pid获取运行时间2.3 通过pid获取内存大小 三、具体实现五、写在最后 ​ 一、简介 近期在使用软件的过程中发现一个有意思的东西。如下所示&a…

嵌入式学习笔记 - 运算放大器的共模抑制比

一 定义 共模抑制比&#xff08;Common Mode Rejection Ratio, ‌CMRR‌&#xff09;是衡量差分放大器&#xff08;或差分电路&#xff09;抑制共模信号能力的关键指标。它在电子工程中尤为重要&#xff0c;特别是在需要处理微弱信号或对抗环境噪声的场景中。 核心概念 ‌共…

牛客周赛 Round 92-题解

牛客周赛 Round 92-题解 A-小红的签到题 code #include<iostream> #include<string> using namespace std; string s; int main() {int n;cin >> n;cout << "a_";for (int i 0; i < n - 2; i )cout << b;return 0; }B-小红的模…

【PVE】ProxmoxVE8虚拟机,存储管理(host磁盘扩容,qcow2/vmdk导入vm,vm磁盘导出与迁移等)

【PVE】ProxmoxVE8虚拟机&#xff0c;存储管理&#xff08;host磁盘扩容&#xff0c;qcow2/vmdk导入vm&#xff0c;vm磁盘导出与迁移等&#xff09; 文章目录 1、host 磁盘扩容2、qcow2/vmdk导入vm3、vm 磁盘导出与迁移 1、host 磁盘扩容 如何给host扩容磁盘&#xff0c;如增加…

Umi+React+Xrender+Hsf项目开发总结

一、菜单路由配置 1.umirc.ts 中的路由配置 .umirc.ts 文件是 UmiJS 框架中的一个配置文件&#xff0c;用于配置应用的全局设置&#xff0c;包括但不限于路由、插件、样式等。 import { defineConfig } from umi; import config from ./def/config;export default defineCon…

C# Newtonsoft.Json 使用指南

Newtonsoft.Json (也称为 Json.NET) 是一种适用于 .NET 的常用高性能 JSON 框架&#xff0c;用于处理 JSON 数据。它提供了高性能的 JSON 序列化和反序列化功能。 安装 通过 NuGet 安装 基本用法 1. 序列化对象为 JSON 字符串 using Newtonsoft.Json;var product new Prod…

数字电子技术基础(五十七)——边沿触发器

目录 1 边沿触发器 1.1 边沿触发器简介 1.1.1 边沿触发器的电路结构 1.3 边沿触发的D触发器和JK触发器 1.3.1 边沿触发的D型触发器 1.3.2 边沿触发的JK触发器 1 边沿触发器 1.1 边沿触发器简介 对于时钟触发的触发器来说&#xff0c;始终都存在空翻的现象&#xff0c;抗…

VC++ 获取CPU信息的两种方法

文章目录 方法一&#xff1a;使用 Windows API GetSystemInfo 和 GetNativeSystemInfo (基本信息)编译和运行代码解释 方法二&#xff1a;使用 __cpuid&#xff08;CPU序列号、特性等&#xff09;代码解释&#xff1a; 开发过程中需要使用 VC获取电脑CPU信息&#xff0c;先总结…

编程技能:字符串函数02,strcpy

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏&#xff0c;故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 &#xff08;一&#xff09;WIn32 专栏导航 上一篇&#xff1a;编程技能&#xff1a;字符串函数01&#xff0c;引言 回到目录 …

特励达力科LeCroy推出Xena Freya Z800 800GE高性能的800G以太网测试平台

Xena Freya Z800 800GE 是由全球领先的测试与测量解决方案提供商特励达力科公司&#xff08;Teledyne LeCroy&#xff09;开发的高性能以太网测试平台&#xff0c;专为满足从10GE到800GE数据中心互连速度的需求而设计。特励达力科公司在网络测试领域拥有超过50年的技术积累&…

docker 日志暴露方案 (带权限 还 免费 版本)

接到了一个需求&#xff0c;需求的内容是需要将测试环境的容器暴露给我们的 外包同事&#xff0c;但是又不能将所有的容器都暴露给他们。 一开始&#xff0c;我分别找了 Portainer log-pilot dpanel 它们都拥有非常良好的界面和容器情况可视化。 但&#xff0c;缺点是&am…

【软考-高级】【信息系统项目管理师】【论文基础】风险管理过程输入输出及工具技术的使用方法

风险管理概念 项目风险是一种不确定的事件或条件&#xff0c;一旦发生&#xff0c;会对项目目标产生某种正面或负面的影响。项目风险既包括对项目目标的威胁&#xff0c;也包括促进项目目标的机会。 风险源于项目之中的不确定因素&#xff0c;项目在不同阶段会有不同的风险。…

第八讲 | stack和queue的使用及其模拟实现

stack和queue的使用及其模拟实现 一、stack和queue的使用1、stack的使用stack算法题 2、queue的使用queue算法题 二、stack和queue的模拟实现封装适配器1、stack的模拟实现top 2、queue的模拟实现 三、deque——了解即可&#xff0c;不需要模拟实现1、vector和list的优缺点&…

Yocto 项目中的 glibc 编译失败全解析:原因、原理与修复策略

✅ 适用版本&#xff1a;glibc 2.39 / Yocto Scarthgap &#x1f4cc; 涉及平台&#xff1a;NXP i.MX / 通用 ARM / x86 架构 &#x1f9d1;‍&#x1f4bb; 作者&#xff1a;嵌入式 Jerry &#x1f553; 阅读时间&#xff1a;约 15 分钟 &#x1f4e6; 关键知识点&#xff1a;…

【计算机视觉】OpenCV实战项目 :Image_Cartooning_Web_App:基于深度学习的图像卡通化

Image_Cartooning_Web_App&#xff1a;基于深度学习的图像卡通化Web应用深度解析 1. 项目概述2. 技术原理与模型架构2.1 核心算法2.2 系统架构 3. 实战部署指南3.1 环境配置3.2 模型部署3.3 处理流程示例 4. 常见问题与解决方案4.1 模型加载失败4.2 显存溢出4.3 边缘伪影 5. 关…

利用并行处理提高LabVIEW程序执行速度

在 LabVIEW 编程中&#xff0c;提升程序执行速度是优化系统性能的关键&#xff0c;而并行处理技术则是实现这一目标的有力武器。通过合理运用并行处理&#xff0c;不仅能加快程序运行&#xff0c;还能增强系统的稳定性和响应能力。下面将结合实际案例&#xff0c;深入探讨如何利…