容器技术 20 年:颠覆、重构与重塑软件世界的力量
目录
容器技术发展史
虚拟化技术向容器技术转变
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 不仅应用于计算领域,还逐渐成为云原生数据库、云原生数据分析乃至人工智能的标配,推动着云计算向更加便捷、高效、低成本的方向发展。
展望未来发展方向
展望未来,容器技术有望在多个方面持续创新。安全性方面,随着容器应用在企业核心业务中的深入,对容器安全隔离、镜像安全扫描、运行时安全监测等技术的需求将更加强烈,相关技术将不断演进以应对日益复杂的安全威胁 。性能优化上,进一步提升容器的启动速度、资源利用效率,减少容器运行时的开销仍是重要方向,例如通过优化容器运行时的内核机制、文件系统和网络协议栈等 。与新兴技术的融合也将是趋势,如结合人工智能技术实现容器资源的智能调度和应用性能的自动优化;在边缘计算场景中,容器技术将助力实现应用在边缘节点的快速部署和高效运行,满足实时性、低带宽等特殊需求 。
此外,容器生态系统将更加完善,不同工具和平台之间的兼容性、互操作性会进一步提升,降低开发者使用容器技术构建和运维应用的门槛,使容器技术在更多领域得到更广泛的应用,持续推动软件开发生命周期和云计算产业的变革 。
相关文章:
容器技术 20 年:颠覆、重构与重塑软件世界的力量
目录 容器技术发展史 虚拟化技术向容器技术转变 Docker的横空出世 容器编排技术与Kubernetes 微服务的出现与Istio 工业标准的容器运行时 容器技术与 DevOps 的深度融合 无服务架构推波助澜 展望未来发展方向 从 20 世纪硬件虚拟化的笨重,到操作系统虚拟…...
Docker 部署 - Crawl4AI 文档 (v0.5.x)
Docker 部署 - Crawl4AI 文档 (v0.5.x) 快速入门 🚀 拉取并运行基础版本: # 不带安全性的基本运行 docker pull unclecode/crawl4ai:basic docker run -p 11235:11235 unclecode/crawl4ai:basic# 带有 API 安全性启用的运行 docker run -p 11235:1123…...
在C++中,符号位是否参与位运算
在C中,符号位是否参与位运算取决于具体的运算符和数据类型。以下是详细解释: 1. 按位与(&)、按位或(|)、按位异或(^) 规则:这些运算符会处理包括符号位在内的所有二…...
【计算机网络】NAT技术、内网穿透与代理服务器全解析:原理、应用及实践
📚 博主的专栏 🐧 Linux | 🖥️ C | 📊 数据结构 | 💡C 算法 | 🅒 C 语言 | 🌐 计算机网络 上篇文章:以太网、MAC地址、MTU与ARP协议 下篇文章:五种IO模型与阻…...
redis数据结构-08(SINTER、SUNION、SDIFF、SISMEMBER)
集合运算:SINTER、SUNION、SDIFF、SISMEMBER Redis 集合是一种功能强大的数据结构,可用于存储一组唯一元素。本课基于上一课对 Redis 集合的介绍,深入探讨了使 Redis 集合如此多功能的基本集合操作: SINTER 、 SUNION 、 SDIFF 和…...
大模型都有哪些超参数
大模型的超参数是影响其训练效果、性能和泛化能力的关键设置,可分为以下几大类别并结合实际应用进行详细说明: 一、训练过程相关超参数 学习率(Learning Rate) 作用:控制参数更新的步长,直接影响收敛速度和稳定性。过高会导致震荡或过拟合,过低则收敛缓慢。调整策略:初…...
【更新至2023年】1999-2023年上市公司人工智能词频统计数据(年报词频统计)
【更新至2023年】1999-2023年上市公司人工智能词频统计数据(年报词频统计) 1、时间:1999-2023年 2、来源:上市公司年报 3、指标:股票代码、公司简称、年报标题、年份、行业名称、行业代码、全文-文本总长度、仅中英…...
通过 Azure DevOps 探索 Helm 和 Azure AKS
俗话说:“慷慨之人必昌盛;滋润他人者,必得滋润。” 如果您觉得这篇文章对您有有所帮助,请点赞,关注,转发! 前言 在不断发展的云计算世界中,应用程序的无缝部署和管理至关重要。Azu…...
Go语言标识符
文章目录 标识符的组成规则Go语言关键字预定义标识符标识符命名惯例 特殊标识符标识符访问权限控制 在Go语言中,标识符(Identifier)是用来命名变量、函数、类型、常量等程序实体的名称。 标识符的组成规则 1、必须以字母或下划线(_)开头: 字母包括Unico…...
Spring Cloud : OpenFeign(远程调用)
RestTemplate虽然比直接用HTTPClient简单的多,但是还是存在着许多的问题,比如url拼接麻烦,容易出错,并且可读性很差 public OrderDetail selectOrderById(Integer orderId){OrderDetail orderDetail orderMapper.selectOrderById…...
JVM内存结构有哪些?HashMap和HashTable的区别?
JVM内存结构 JVM内存主要分为以下几个区域: 程序计数器(Program Counter Register) 线程私有,记录当前线程执行的字节码行号指示器 唯一一个不会出现OOM的内存区域 Java虚拟机栈(Java Virtual Machine Stacks) 线程私有,生命周期与线程相…...
三维空间中的组织行为映射:MATLAB 数据插值可视化技术
在组织行为学研究中,如何直观呈现多维变量之间的关系一直是个挑战。今天我们将深入解析一段 MATLAB 代码,看看如何通过数据插值和三维可视化技术,将抽象的组织行为数据转化为直观的三维曲面图,揭示组织自尊 (OBSE)、牺牲性领导 (SSL) 与责任感知 (FO) 之间的复杂关系。 �…...
ImportError: DLL load failed: 找不到指定的程序。
查看其他博客说是缺少libssl-1_1-x64.dll 和 libcrypto-1_1-x64.dll 然后去下载放到博客说的目录下 没有用 解决不了一点 OpenSSL for Windows 64位 完整安装包 在这里 项目地址: https://gitcode.com/open-source-toolkit/eb627 注意事项 此安装包仅适用于64位Windows系…...
计算机的三个根本性基础
1. 计算机是执行输入、运算、输出的机器 从硬件上看,计算机是执行输入、运算、输出的机器,计算机的硬件由大量的IC(Integrated Circuit,集成电路)组成。 IC会在其中内部对外部输入的信息进行运算,并把运算…...
C++ Builder XE 使用DevMode设置打印机的自定义纸张,打印方向
代码功能介绍(以备以后查询):该代码片段展示了如何将TPanel控件的内容作为图像打印出来。首先,代码创建了一个与TPanel大小相同的位图,并通过BitBlt函数将TPanel的内容复制到位图中。接着,代码配置打印机,设…...
QOwnNotes:功能强大的跨平台笔记应用程序
QOwnNotes是一款功能强大的跨平台笔记应用程序,专为追求高效、灵活笔记管理的用户设计。它不仅支持Windows、macOS和Linux等多种操作系统,还提供了丰富的功能,帮助用户轻松管理笔记、任务和清单。无论是日常记录、学习笔记还是工作计划&#…...
深入理解反序列化攻击:原理、示例与利用工具实战
反序列化漏洞是现代 Web 安全中的一个高危攻击类型,常常导致远程代码执行(RCE)、文件读写、身份伪造等严重后果。本文将从基础原理讲起,结合实际代码和工具(PHPGGC、ysoserial)演示反序列化攻击的完整过程。…...
【今日三题】素数回文(模拟) / 活动安排(区间贪心) / 合唱团(动态规划)
⭐️个人主页:小羊 ⭐️所属专栏:每日两三题 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 素数回文(模拟)活动安排(区间贪心)合唱团(动态规划) 素数回文(模拟) 素数回文 #include <iostream> #include <st…...
一文了解B+树的删除原理
1. B树的核心特性回顾 B树是一种广泛应用于数据库和文件系统的平衡多路搜索树,其核心特性包括: 阶数(m):定义每个节点最多拥有的子节点数(或键数)节点容量规则: 根节点:…...
Spring Boot项目(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot前后端分离)
下载地址: 前端:https://download.csdn.net/download/2401_83418369/90811402 后端:https://download.csdn.net/download/2401_83418369/90811405 一、前端vue部分的搭建 这里直接看另一期刊的搭建Vue前端工程部分 前端vue后端ssm项目_v…...
26考研——中央处理器_指令流水线_指令流水线的基本概念 流水线的基本实现(5)
408答疑 文章目录 六、指令流水线指令流水线的基本概念流水线的基本实现流水线设计的原则流水线的逻辑结构流水线的时空图表示 八、参考资料鲍鱼科技课件26王道考研书 六、指令流水线 前面介绍的指令都是在单周期处理机中采用串行方法执行的,同一时刻 CPU 中只有一…...
DAY 22 复习日kaggle泰坦里克号人员生还预测
复习日 仔细回顾一下之前21天的内容,没跟上进度的同学补一下进度。 作业: 自行学习参考如何使用kaggle平台,写下使用注意点,并对下述比赛提交代码 kaggle泰坦里克号人员生还预测 输入: import pandas as pd from sklea…...
SpringCloud Gateway知识点整理和全局过滤器实现
predicate(断言): 判断uri是否符合规则 • 最常用的的就是PathPredicate,以下列子就是只有url中有user前缀的才能被gateway识别,否则它不会进行路由转发 routes:- id: ***# uri: lb://starry-sky-upmsuri: http://localhost:9003/predicate…...
婴幼儿托育实训室师资协同培养模式
随着社会对婴幼儿托育服务需求的日益增长,培养适应市场需求的高素质托育人才成为当务之急。产教融合作为一种有效的人才培养模式,对于婴幼儿托育实训室建设具有重要意义,能够有效整合学校和企业的资源,为婴幼儿托育实训室人才培养…...
Gartner 《2025大数据管理规划指南》学习心得
概要 本研究旨在为数据和分析(D&A)技术专业人员提供2025年的数据管理规划指导,帮助他们应对最新数据管理趋势,以增强决策制定并实现卓越的业务成果。强调了持续适应数据管理实践的组织将更有能力做好人工智能(AI&…...
理解反向Shell:隐藏在合法流量中的威胁
引言 在网络安全领域,反向Shell(Reverse Shell) 是一种隐蔽且危险的攻击技术,常被渗透测试人员和攻击者用于绕过防火墙限制,获取对目标设备的远程控制权限。与传统的“正向Shell”(攻击者主动连接…...
《AI大模型应知应会100篇》第55篇:大模型本地开发环境搭建
第55篇:大模型本地开发环境搭建 ——从零开始构建你的AI炼金炉 📌 摘要 在人工智能尤其是大模型(LLM)领域,一个高效、稳定、可扩展的本地开发环境是每位开发者的第一块基石。本文将手把手带你完成从硬件选型到软件配…...
AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年5月11日第74弹
从今天开始,咱们还是暂时基于旧的模型进行预测,好了,废话不多说,按照老办法,重点8-9码定位,配合三胆下1或下2,杀1-2个和尾,再杀6-8个和值,可以做到100-300注左右。 (1)定…...
Docker:安装配置教程(最新版本)
文章目录 一、前言二、具体操作2.1 卸载 Docker (可选)2.2 重新安装(使用清华大学镜像)2.3 配置轩辕镜像加速2.4 Docker 基本命名2.5 测试是否成功 三、结语 一、前言 Docker 是一种容器化技术,在软件开发和部署中得到广泛的应用,…...
数据结构【二叉树的遍历实现】
📘考研数据结构基础:二叉树的存储、遍历与队列辅助实现详 在数据结构的学习中,二叉树作为一种结构清晰、应用广泛的树形结构,是考研计算机专业课中重点内容之一。本文将以实际代码为基础,介绍二叉树的存储结构、遍历方…...
稳态电路和瞬态电路
一、概述 稳态电路是指电路在长时间运行后达到的一种稳定状态; 瞬态电路是指电路在切换或者初始化节点经历过渡的过程。 在电路分析中,稳态和瞬态是动态电路的两个阶段。在电路中,如果有电感或者电容时, 他们的电压和电流不能瞬间…...
spark运行架构及核心组件介绍
目录 1. Spark 的运行架构1.1 Driver1.2 Executor1.3 Cluster Manager1.4 工作流程 2. Spark 的核心组件2.1 Spark Core2.2 Spark SQL2.3 Spark Streaming2.4 MLlib2.5 GraphX 3. Spark 架构图4. Spark 的优势4.1 高性能4.2 易用性4.3 扩展性4.4 容错性 5. 总结 1. Spark 的运行…...
Linux服务器常用运维工具/命令
常用工具/命令 1、查看内存使用 free -m上述命令用于显示系统中内存的使用情况,并将内存使用量以兆字节(MB)为单位显示。这个命令在 Linux 和类 Unix 系统上非常常见,是监视系统内存的一个简单而有用的工具。 具体而言…...
KaiwuDB 2.0:为 AIoT 而生,融合时序、关系与 AI 的未来数据库
目录: 引言:AIoT 数据洪流下的数据库“窘境”KaiwuDB 2.0:为 AIoT “量身定制”的智能数据基座核心利器:多模融合 + 原生 AI,解锁数据新范式不止于云:KaiwuDB Lite 轻装上阵边缘计算硬核实力:AIoT 场景下的显著优势技术基因:融合创新,构筑未来数据架构应用蓝图:深耕 A…...
Python打卡训练营Day22
浙大疏锦行 DAY 22 复习日 复习日 仔细回顾一下之前21天的内容,没跟上进度的同学补一下进度。 作业: 自行学习参考如何使用kaggle平台,写下使用注意点,并对下述比赛提交代码 kaggle 一、Kaggle 核心功能学习参考 注册与基础设置…...
Oracle — 内置函数
介绍 Oracle内置函数是数据库中预定义的编程工具,用于简化数据处理与计算逻辑。这些函数分为单行函数和聚合函数两大类。单行函数针对每条数据独立运算,例如LOWER函数转换文本为小写,ROUND实现数值四舍五入,TO_CHAR格式化日期输出…...
Kubernetes基础(三十二):Worker节点启动全解析
Worker节点是Kubernetes集群的"肌肉",负责实际运行业务负载。本文将深入剖析Worker节点的完整启动流程,并揭秘生产环境中的关键优化点。 一、启动流程全景图 二、核心启动阶段详解 1. 系统初始化(0-30秒) 关键任务&a…...
“爱生活”小项目问题总结
目录 爱生活小程序 1.用户登录和注册模块遇到的问题 1.1在使用密码加密时,注册新用户,客户端响应401的问题 原因: 正确操作: 1.2在设置密码加密后,发送post登录请求,服务器出现报错java.lang.reflect.…...
实战项目5(08)
目录 任务场景一 【r1配置】 【r2配置】 【r3配置】 任务场景二 【r1配置】 【r2配置】 任务场景一 按照下图完成网络拓扑搭建和配置 任务要求: 通过在路由器R1、R2和R3上配置静态路由,实现网络中各终端PC能够正常…...
LeetCode 1550.存在连续三个奇数的数组:遍历
【LetMeFly】1550.存在连续三个奇数的数组:遍历 力扣题目链接:https://leetcode.cn/problems/three-consecutive-odds/ 给你一个整数数组 arr,请你判断数组中是否存在连续三个元素都是奇数的情况:如果存在,请返回 tr…...
大模型在肾肿瘤诊疗全流程预测及方案制定中的应用研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的 1.3 研究创新点 1.4 研究方法与数据来源 二、肾肿瘤概述与大模型技术 2.1 肾肿瘤相关知识 2.1.1 定义、分类及症状 2.1.2 发病机制与影响因素 2.1.3 治疗现状与挑战 2.2 大模型技术原理及医疗应用现状 2.2.1 大模型…...
5月11号.
导入Maven项目: Maven依赖管理: 生命周期: 测试: 断言: Junit常见注解:...
数据库基础概述
一、基础概述 1.数据库 (1)概述 数据库就是存储数据的仓库,其本质是一个文件系统,按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作使用数据库可以高效的…...
Hibernate 性能优化:告别慢查询,提升数据库访问性能
Hibernate 性能优化:告别慢查询,提升数据库访问性能 Hibernate 作为一款流行的 ORM 框架,极大地简化了 Java 应用程序与数据库之间的交互,但如果不进行合理优化,性能瓶颈在高并发场景下就会暴露无遗。本文将深入探讨 …...
【JavaWeb+后端常用部件】
回顾内容看: 一、获取请求参数的方法 参考:[JavaWeb]——获取请求参数的方式(全面!!!)_java 获取请求参数-CSDN博客 Json格式的Body加备注RequestBody{id}动态路径加备注PathVariableid?&name?直接接收就好 i…...
Playwright 简介
Playwright 简介 说明:本教程基于 @playwright/test@1.51.1 版本编写,内容和目录结构与该版本官方推荐保持一致。 适合人群与学习路径 适合谁? 想入门自动化测试的测试工程师需要跨浏览器、移动端自动化的开发者希望提升测试效率、减少维护成本的团队学习建议 跟着文档动手实…...
# 2-STM32-复位和时钟控制RCC
STM32-复位和时钟控制RCC 2-STM32-复位和时钟控制RCC摘要说明本文参考资料如下: 一、STM32最小系统回顾STM32F103C8T6核心板原理图 二、复位三、时钟3.1 时钟树3.2 STM32启动过程3.2 SystemInit()函数3.2.1 SystemInit()第1句:3.2.2 SystemInit()第2句&a…...
idea中的vcs不见了,如何解决
按如下顺序依次找 filesettingsversion controldirectory mappings点击号vcs 改为Subversion 省流:看如下图...
元数据分类
元数据(Metadata)是描述数据的数据,通常分为 业务元数据、技术元数据 和 操作元数据。这三类元数据从不同维度对数据进行描述和管理,以下是它们的定义、作用和示例: 1. 业务元数据(Business Metadata&#…...
【C语言】(9)—指针3
文章目录 一、字符指针的深入理解二、数组指针详解三、二维数组传参的本质四、函数指针及其应用五、函数指针数组与转移表 一、字符指针的深入理解 1.1 字符指针的基本使用 字符指针(char*)是指向字符类型数据的指针,它有两种常见的使用方式: // 方式一…...