使用 Operating 高效管理持久化卷

增强型 StatefulSet 控制器 Kubernetes 内置 StatefulSet 为 Pods 分配连续的序号。比如 3 个副本时,Pods 分别为 pod-0, pod-1, pod-2。扩缩容时,必须在尾部增加或删除 Pods。比如扩容到 4 个副本时,会新增 pod-3。缩容到 2 副本时,会删除 pod-2。在使用本地存储时,Pods 与 Nodes 存储资源绑定,无法自由调度。若希望删除掉中间某个 Pod ,以便维护其所在的 Node 但并没有其他 Node 可以迁移时,或者某个 Pod 故障想直接删除,另起一个序号不一样的 阅读详情

b7a24a3a10f032e998723fbb90f048f6.gif

前言

KusionStack Operating 致力于提供符合 Kubernetes 标准的云原生运维、链路可观测、资源可洞察等能力,以帮助开发者更好地搭建自己的平台。

目前 KusionStack Opearating 已发布到 v0.3.0 版本。在最近版本中,Operating CollaSet 新增对持久卷的配置使用,允许用户声明 VolumeClaimTemplate 为 Pod 创建 PVCs。此外,对于持久化卷变更成本高和难以控制的问题,CollaSet 通过下沉和复用运维经验加以解决,并支持:

1. 用户根据对存储卷的需求,可灵活修改、添加或删除 PVC 模版;

2. 提供对 PVC 生命周期的控制。

01

使用Workload管理持久化卷

持久化卷声明 PVC(PersistentVolumeClaim)能够让用户请求持久化卷 PV (PersistentVolume),为应用的状态提供稳定、持久的存储介质。在无状态 Workload(如 Deployment、DaemonSet)部署的应用中使用持久化卷,需用户手动创建 PVC 并挂载到容器。

无状态 Workload 缺乏对持久化卷的统一管理,为简化持久化卷的使用,社区提供多种有状态 Workload,如 StatefulSet、Advanced StatefulSet、CloneSet 等,它们向用户暴露配置入口 VolumeClaimTemplates(PVC 模版),为每个 Pod 维护独立的 PVC。

|StatefulSet

StatefulSet 是 Kubernetes 中用于部署和管理有状态的应用的原生 Workload API 对象。StatefulSet 为每个 Pod 实例提供稳定、唯一的网络标识符和 PVCs;当 Pod 发生故障时,通过唯一标识将新建的 Pod 与 PVCs 重新关联,以恢复数据和保持弹性。

|Advanced Statefulset

Advanced StatefulSet 是 OpenKruise 基于 StatefulSet 设计的 Workload,增强了原生 StatefulSet 发布、原地升级和 PVC 管理等能力。Advanced StatefulSet 提供对持久卷的生命周期的控制:通过配置保留策略以决定 StatefulSet 和 Pod 生命周期结束时是否级联删除所关联的 PVCs。原生 StatefulSet 在 Kubernetes 1.27 beta 版本后也支持了 PVC 生命周期管理。

|CloneSet

CloneSet 是由 OpenKruise 提供的 Workload,支持原地升级、分批灰度发布和 PVCs 管理等功能。它将持久化卷的管理与运维融合,不同升级方式 PVC 管理策略不同。如原地升级后的 Pod 会复用原持久化卷;重建升级会删除原 Pod 关联的持久化卷并重建。尽管重建升级也为灵活扩展持久化卷提供了可能,但 CloneSet 的设计目标不包括变更 PVC,因此仅变更 PVC 模版不生效。

02

管理持久化卷的痛点

在前文介绍的 Workloads 下,当应用存储空间不足,用户需手动扩展持久化卷,这件事情在大规模的集群下并不容易。原因是它们不感知 PVC 模版变化,因此用户需要手动维护和更新 PVCs(如 StatefulSet 中 PVC 变更事件在 Webhook 被拦截,无法被调和),存在以下痛点:

  • 高风险:过程需删除、重建 Workload,服务被强制中断导致不可用;

  • 高成本:无法复用经验,运维成本高;当部署规模越来越大,问题变得更加突出。

接下来演示一个扩展 StatefulSet 持久卷容量的例子:

|环境准备

1. 部署 K8s 集群,如 Minikube,Kind 等

    • https://minikube.sigs.k8s.io/docs/start/

    • https://kind.sigs.k8s.io/docs/user/quick-start/

2. 安装 csi-driver-host-path

    • https://github.com/kubernetes-csi/csi-driver-host-path#development

3. 制备可扩展 StorageClass

$ git clone https://github.com/kubernetes-csi/csi-driver-host-path.git
$ kubectl apply -f ./csi-driver-host-path/examples/csi-storageclass.yaml

$ kubectl get storageclass
NAME                 PROVISIONER                RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
csi-hostpath-sc      hostpath.csi.k8s.io        Delete          Immediate           true                   30m

4. 使用 sample.yaml 准备一个简单的 StatefulSet

# sample.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sample
spec:
  replicas: 2
  selector:
    matchLabels:
      app: sample
  template:
    metadata:
      labels:
        app: sample
    spec:
      containers:
      - image: nginx:1.25
        name: nginx
        volumeMounts:
        - mountPath: /path/to/storage
          name: foo
  volumeClaimTemplates:
  - metadata:
      name: foo
    spec:
      storageClassName: csi-hostpath-sc # 使用提前制备的可扩展 StorageClass
      volumeMode: Filesystem
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 10G

|扩展持久化卷

1. 确保 StorageClass 可扩展

仅部分类型支持扩展,本例中 CSI 类型支持扩展

$ kubectl get storageclass csi-hostpath-sc | grep allowVolumeExpansion
allowVolumeExpansion: true

2. 删除原 StatefulSet,根据需求修改 PVC 模版大小为 20Gi

删除后服务处于不可用状态

$ kubectl delete statefulset sample
statefulset.apps/sample deleted
$ cat statefulset.yaml
...
  volumeClaimTemplates:
  ...
    spec:
      ...
      resources:
        requests:
-         storage: 10Gi
+         storage: 20Gi
...

3. 修改 PVC 容量至 20Gi

$ kubectl edit pvc foo-sample-0
spec:
...
  resources:
    requests:
-     storage: 10Gi
+     storage: 20Gi # 扩展容量至 20Gi
...

4. 使用修改后的 yaml 重新创建 StatefulSet

$ kubectl apply -f statefulset.yaml 
statefulset.apps/sample created

$ kubectl get pod
NAME                   READY   STATUS    RESTARTS   AGE
sample-0                  1/1     Running   0          18s
sample-1                  1/1     Running   0          11s

$ kubectl get pvc
NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
foo-sample-0   Bound    pvc-80f27a1c-3a39-4e02-8425-2e04e5dd660f   20Gi       RWO            csi-hostpath-sc   2m5s
foo-sample-1   Bound    pvc-ee487d9b-dcd5-4826-a730-6a35f9fc4a52   20Gi       RWO            csi-hostpath-sc   115s

在以上示例中可以观察到,扩展 StatefulSet 持久化卷流程较为复杂;且部署的应用被删除和重建,难以保证服务持续可用,风险较高。

03

使用CollaSet管理持久化卷

CollaSet 是 Kusionstack Operating 提供的工作负载,为应用 Pod 提供运维、精细化生命周期管理等能力,同时支持部署有状态应用。CollaSet 支持管理持久化卷,包括更新、新增、删除持久化卷,控制持久卷的生命周期,下面通过两个示例展示 CollaSet 如何管理 PVC。

|扩展持久化卷

以下图为例,展示了用户变更持久卷流程,假设用户使用 CollaSet 时对持久卷的需求发生变化,要求将名为 foo 的持久卷扩容至 20Gi。此时用户仅需修改名称为 foo 的 VolumeClaimTemplates,CollaSet 接管复杂的 Pod 和 PVCs 更新替换操作:

0c5f47130fab4aea3c8e82cbfe94a62a.png

  1. 删除大小为 10Gi 的持久卷,同时删除 Pod-1,创建 Pod-1';

  2. 根据模版 foo 创建大小为 20Gi 的持久卷,并绑定至 PVC-1';

  3. 并将 PVC-1' 挂载到 Pod-1';

在 PVC 扩展时,用户可选择是否保留原 PVC-1。通过配置保留策略 whenScaled=Retain 以保留原 PVC-1,此时用户回滚至 10G 版本,原 PVC-1 将被自动挂回 Pod。若用户不再需要原始 PVC 数据,通过配置 whenScaled=Delete 删除 PVC-1。

|新增持久化卷

接着以上示例,假设用户进一步要求为每个 Pod 新增持久卷,以下图为例,用户在 PVC 模版列表新增一个名为 www 的持久卷,CollaSet 感知 PVC 模版列表新增,并自动创建挂载 PVC:

7df977d4e0da47c743bde2ae9081cc0e.png

  1. 删除 Pod-1',创建 Pod-1'';

  2. 创建 PVC-2;

  3. PVC-2 与 PVC1'' 挂载到 Pod-1''。

|试一试

0. 安装 Operating

    • https://www.kusionstack.io/docs/operating/started/install

1. 基于前示例中 sample.yaml 准备 CollaSet

# cat sample.yaml
- apiVersion: apps/v1
- kind: StatefulSet
+ apiVersion: apps.kusionstack.io/v1alpha1
+ kind: CollaSet
...
spec:
- replicas: 2
+ replicas: 1
$ kubecel apply -f sample.yaml
collaset.apps.kusionstack.io/sample created

$ kubectl get pod
NAME                   READY   STATUS    RESTARTS   AGE
sample-fn928           1/1     Running   0          13s

$ kubectl get pvc
NAME               STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
sample-foo-4hhjz   Bound    pvc-cf5b0db4-810f-4530-ae3c-33f8d3bb0ba0   10Gi       RWO            csi-hostpath-sc   17s

2. 更新、添加 PVC 模版

# cat sample.yaml
  template:
  ...
    spec:
      containers:
      ...
        volumeMounts:
        ...
+       - mountPath: /path/to/storage-www
+         name: www
  ...
  volumeClaimTemplates:
  - metadata:
      name: foo
    spec:
      ...
      resources:
        requests:
-         storage: 10Gi
+         storage: 20Gi     # 修改存储容量至 20Gi
      storageClassName: csi-hostpath-sc
      volumeMode: Filesystem
+ - metadata:
+     name: www     # 新增名 PVC 模版
+   spec:
+     accessModes:
+     - ReadWriteOnce
+     resources:
+       requests:
+        storage: 20Gi
+     storageClassName: csi-hostpath-sc
+     volumeMode: Filesystem
$ kubectl apply -f sample.yaml
collaset.apps.kusionstack.io/sample configured

3. 验证 Pod 与 PVC 状态,观察到 Pod 和 PVC 被重建和挂载

$ kubectl get pod
NAME                   READY   STATUS    RESTARTS   AGE
sample-fn928   1/1     Terminating         0          101s
sample-k8wtz   0/1     ContainerCreating   0          4s

$ kubectl get pvc
NAME               STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
sample-foo-w42vm   Bound    pvc-f9e525e9-174f-4bcf-9218-d22fc21c81a2   20Gi       RWO            csi-hostpath-sc   6s
sample-www-ns7c7   Bound    pvc-8ced1205-e447-43b0-a598-7e6ef2584073   20Gi       RWO            csi-hostpath-sc   6s

可以观察到 PVC 变更过程无需删除 Workload,服务保持可用;过程中用户也可以使用 ReplaceUpdate 或 Partition 等发布策略保证服务质量。更多内容详见 CollaSet 手册:https://www.kusionstack.io/docs/operating/manuals/collaset。

总结

持久化数据是支撑有状态应用的基础,现有工作负载通过管理 PVC 支持有状态应用,具有许多优点,如优雅管理 PVC 生命周期、与 Pod 运维兼容等。当用户的需求发生变化,需要扩展、删除、新增持久化卷时需要人工介入,且存在风险。为更好地支持有状态应用,CollaSet 将人工管理运维经验下沉,感知 PVC 变更,以提升效率和降低风险。

更多的云原生运维能力还等着我们探索和发现,也欢迎大家一起参与共建!

欢迎 star ⭐️

https://github.com/KusionStack/kusion

https://github.com/KusionStack/operating

https://github.com/KusionStack/controller-mesh

https://github.com/KusionStack/resource-consist

https://github.com/KusionStack/kube-utils

https://github.com/kcl-lang/kcl

浏览器里跑 Docker:零配置在线容器实验平台 容器技术入门的核心障碍往往不是概念本身,而是环境搭建——Docker Desktop、WSL2、虚拟机配置让初学者止步于第一行命令。Docker 容器本质上是基于 Linux 命名空间与 cgroups 的进程隔离机制,其学习价值在于快速理解镜像分层、容器生命周期和端口映射等基础原理。Play with Docker(PWD)作为轻量级在线沙箱,通过真实虚拟机集群+WebSocket 终端透传+预置镜像缓存,实现了浏览器中秒级启动、免费可用、零本地依赖的实操体验。它不替代生产部署,而是聚焦教学验证与即时反馈 阅读详情

相关推荐

SpringBoot+Vue+MySQL 高校学科竞赛平台 完整可运行版(源码+文档)

本项目基于SpringBoot+Vue+MySQL构建高校学科竞赛管理平台,覆盖学生、教师、领队教师、管理员四大角色,实现竞赛发布、报名、刷题、评分、公示等全流程闭环管理。系统架构清晰,技术主流,配套完整源码、数据库脚本、万字论文、开题报告、答辩PPT及部署文档,支持一键运行,适用于毕业设计、课程设计及院系二次开发,真正实现“开箱即用”。

招风的黑耳优快云 147

【亲测免费】 高级StatefulSet (Advanced StatefulSet) 使用指南

高级StatefulSet (Advanced StatefulSet) 使用指南 一、项目介绍 高级StatefulSet是开源项目OpenKruise的一部分,旨在增强Kubernetes原生StatefulSet的能力,尤其聚焦于提升应用程序部署及维护效率。其主要特点包括支持并行发布、maxUnavailable配置、以及原地升级等功能,通过新增字段与优化逻辑实现了比传统StatefulSe...

gitblog_00140的博客 905

从零实现Unitree Go2的SLAM建图与导航:手把手集成slam_toolbox和nav2(附Rviz2可视化配置)

本文详细指导如何在Unitree Go2四足机器人上集成slam_toolbox和nav2,实现SLAM建图与导航功能。从ROS2环境配置、雷达数据处理到slam_toolbox参数优化,再到nav2路径规划与Rviz2可视化调试,提供完整解决方案。特别适合机器人开发者快速掌握ROS2导航栈在Unitree Go2上的应用实践。

weixin_33737134的博客 1232

高级状态集 (Advanced StatefulSet) 开源项目指南

高级状态集 (Advanced StatefulSet) 开源项目指南 目录结构及介绍 当你克隆或下载了 advanced-statefulset 开源项目仓库后, 其主要目录及其内容概述如下: /docs: 文档目录,包含详细的使用说明和技术文档。 /examples: 示例目录,包含了如何部署和使用的具体示例配置文件。 /pkg: 包目录,这里是项目的核心代码实现,包括各种功能模块和封装好的...

gitblog_00766的博客 956

大模型的安全发展与安全治理

2022 年底,OpenAI 推出的 ChatGPT 在文本生成领域实现了重大突破,引领了大模型技术的发展方向,推动了各式各样的基座大模型及行业大模型的发展,并逐步向多模态和具身化方向迅速演进。显然,大模型展现出的强大能力为人工智能通用化揭开了序幕。然而,大模型技术的安全性也面临着生成内容的安全性、伦理道德等重大挑战。只有积极确保大模型的安全性,才能更有效地推动其持续发展,进而更好地应对大模型技术变革所带来的机遇与挑战。

qq_41432686的博客 2583

蛋白组学/磷酸化蛋白组学分析笔记-2

如何校正蛋白丰度?磷酸化组学质谱下机处理。

weixin_43029125的博客 1372

Advanced StatefulSet

Advanced StatefulSet Advanced StatefulSet 控制器基于原生 StatefulSet 上增强了发布能力,比如 maxUnavailable 并行发布、原地升级等。 注意 Advanced StatefulSet 是一个 CRD,kind 名字也是 StatefulSet,但是 apiVersion 是 apps.kruise.io/v1alpha1 和 apps.kruise.io/v1beta1。这个 CRD 的所有默认字段、默认行为与原生 StatefulSet 完

变成习惯 656

Pyinstaller 打包 Pyzbar 时缺失 DLL 文件的排查与修复指南

本文详细解析了使用Pyinstaller打包Pyzbar库时,因缺失关键DLL文件导致程序闪退的常见问题。文章提供了从问题复现、错误诊断到最终修复的完整解决方案,核心在于通过修改.spec配置文件,手动将缺失的libzbar-64.dll等文件添加到打包过程中,确保生成的可执行文件能独立运行。

wdx012345的博客 504

k8s的PV/PVC详解以及使用范例

pv/pvc是什么,和csi是什么关系, 介绍hostpath.csi.k8s.io插件,还有pv/pvc的完整使用范例

2814

SAP BSP网页开发入门:从SE80创建到MVC实战(附成品展示)

本文详细介绍了SAP BSP网页开发的入门与实战,从SE80环境搭建到MVC架构实现的全流程。通过具体案例和代码示例,帮助开发者掌握业务服务器页面(BSP)技术,提升SAP Web化转型中的开发效率,适用于需要扩展SAP功能的企业场景。

x1y2z的博客 1万+

高通平台WIFI学习-- 基于6GHZ Discovery (STA Scanning)讲解

本文介绍了6GHz频段的网络扫描优化方案。主要内容包括:1)带内发现机制,将6GHz信道分为优先扫描信道(PSC)和非PSC信道,规范了STA发送探测请求的条件及等待时间;2)带外发现机制,通过RNR信息元素实现跨频段AP发现,减少6GHz频段干扰;3)具体扫描流程示例,包括DBS扫描和敏捷扫描的顺序安排。方案通过优化探测请求发送规则和跨频段信息共享,有效降低了信道污染和扫描延迟,日志数据验证了6GHz信道扫描的具体实现过程。

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 267

TiDB增强型 StatefulSet 控制器--Advanced StatefulSet

作者: lqbyz 原文来源: https://tidb.net/blog/bac3e058 ...

TiDB 社区干货传送门 344

Windows服务器环境下 OpenCode Skill 下载与运行全流程实战指南(小白版)

Windows服务器环境下 OpenCode Skill 下载与运行全流程实战指南(小白版),OpenCode技能安装与使用指南,分为四个步骤:1)准备Windows服务器环境并确认OpenCode可用;2)通过Git或直接下载方式获取Skill;3)配置技能路径至.opencode/config.json;4)运行测试技能。关键点包括路径配置必须使用双反斜杠、确保Python环境正确安装、管理员权限运行等。文中提供了文本总结技能的完整案例,从创建skill.yaml和main.py到注册运行的全流程,并针

专注于编程、AI、人工智能等多个领域内容研究和分析 1080

OpenKruise - 云原生应用自动化引擎正式开源

2019 年 6 月 24 日至 26 日, 由 Cloud Native Computing Foundation (CNCF) 主办的云原生技术大会 KubeCon + CloudNativeCon + Open Source Summit(上海 )即将在中国上海盛装启幕。在本次 Kube...

chikuai9995的博客 375

【学习系列】SAP RAP 29:如何创建Application Jobs(下)

本文介绍了在SAP系统中通过API创建和使用Application Jobs的方法。主要内容包括:1) 创建RAP应用并通过Action调用API创建Jobs;2) 使用事件驱动方式异步更新Job状态;3) 通过URL跳转到标准日志页面;4) 使用Custom Entity获取Job日志;5) 演示遗留接口IF_APJ_DT_EXEC_OBJECT和IF_APJ_RT_EXEC_OBJECT的使用。文章提供了详细的代码示例,展示了如何通过CL_APJ_RT_API=>SCHEDULE_JOB调度作业,

DeveloperMrMeng的博客 379

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 289

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 346

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 130

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 198

【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端

上一篇讲了 MCP 的概念:标准协议、三大角色、M+N 替代 M×N。

nice_lcj520的博客 499

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 365

JDK 下载安装:装完 Java 提示「不是内部或外部命令」?环境变量没配

JDK 是写 Java 程序必须装的东西。它包含运行 Java 的虚拟机(JRE)和编译 Java 的编译器(javac)——装了它,能跑、.java文件能编译成可执行程序。免费,学习和小规模生产都不花钱。

科小怪的博客 635

java框架大全

java框架大全

qq_39326137的博客 183

Java 多态 学习笔记

多态是面向对象编程的重要特性,指同一操作作用于不同对象时产生不同行为。其核心在于“父类引用指向子类对象”,结合方法重写实现运行时动态绑定。多态使代码更灵活、可扩展,如用Person p = new Student();统一处理各类人员注册,无需修改调用逻辑。但多态无法直接调用子类特有方法,需通过instanceof判断并强制转换。编译时看左边(类型),运行时看右边(实际对象),实现解耦与维护便利。

AA_AA114514的博客 361

SecureRandom做随机源,这个Java随机字符串工具类有3个方法

本文分享一款JDK17环境下的Java随机字符串工具类,内置3个开箱即用的方法,全部采用SecureRandom加密安全随机源,不存在弱随机、可预测、取模偏差等问题。工具类支持默认62字符集随机串、纯数字随机串、自定义字符集随机串三种生成模式,支持Unicode码点级别的字符集处理,兼容Emoji等增补字符,边界处理严格,异常信息明确,适合验证码、邀请码、盐值、随机口令、短链码等场景,源码可直接复制使用。

Java后端 | AI智能体应用实战派 | 电脑技能行家 299
上一篇: 活动报名|SOFA 六周年,Hello SOFA World
下一篇: KCD上海站报名开启丨赏玉兰花开,畅聊云原生技术
SOFAStack
博客等级 码龄7年 747粉丝 389原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值