Java微服务容器化进阶:Docker镜像优化与K8s生产部署实战(避坑手册)
1. 从“能跑就行”到“跑得又好又稳”Java微服务容器化进阶之路作为一名和Java打了十几年交道的“老码农”我经历过从单体巨石应用到微服务架构的完整变迁。早期我们最怕听到的一句话就是“在我本地是好的啊” 环境不一致、依赖冲突、部署脚本复杂这些问题让开发和运维的“墙”越垒越高。后来Docker的出现让我们眼前一亮它把应用和它的运行环境打包在一起解决了“环境一致性”这个老大难。但很快新的问题又来了镜像动辄几百兆甚至上G拉取慢、存储浪费容器跑起来后资源怎么分配服务挂了怎么自动恢复流量大了怎么自动扩容这就是从“容器化”到“生产级容器化”的进阶之路。简单地把Spring Boot应用塞进Docker只是万里长征第一步。真正的挑战在于如何让这个容器化的微服务在生产环境的KubernetesK8s集群里跑得高效、稳定、可观测、易管理。这就像造车能开上路和能安全、舒适、省油地跑长途完全是两码事。这篇文章我就结合自己趟过的无数坑和你聊聊如何把Java微服务容器化这件事从“能用”做到“精通”。我们会聚焦于两个核心如何打造一个“苗条”且高效的Docker镜像以及如何在K8s上为这个镜像配置一个“舒适又安全”的家。目标很明确让你的服务在生产环境里既省资源又扛得住压力。2. Docker镜像优化从“臃肿”到“精干”的瘦身实战刚开始用Docker时很多人会写一个简单的DockerfileFROM openjdk:11然后COPYjar包最后ENTRYPOINT启动。这样打出来的镜像轻松超过600MB。镜像越大从仓库拉取的时间就越长节点磁盘压力也越大特别是滚动更新时影响发布速度。优化镜像是提升整个部署流水线效率的第一步。2.1 多阶段构建分离“建造车间”与“运行环境”这是镜像瘦身最核心、最有效的一招。它的思想很简单用一个完整的、包含构建工具如Maven、Gradle的镜像来编译打包你的应用然后只把最终产物比如可执行的jar包复制到一个非常精简的运行环境镜像中。看看我们优化前后的对比。一个典型的“胖镜像”Dockerfile可能是这样的FROM openjdk:11 COPY target/myapp.jar app.jar ENTRYPOINT [java, -jar, /app.jar]这个镜像包含了完整的JDK而不仅仅是JRE以及很多运行应用并不需要的工具。而采用多阶段构建后# 第一阶段构建阶段 (Builder Stage) FROM maven:3.8.8-openjdk-11 AS builder WORKDIR /app COPY pom.xml . COPY src ./src # 利用Maven的依赖缓存层只有当pom.xml变化时才重新下载依赖 RUN mvn dependency:go-offline -B RUN mvn clean package -DskipTests # 第二阶段运行阶段 (Runtime Stage) FROM openjdk:11-jre-slim WORKDIR /app # 从builder阶段只复制我们需要的jar包其他所有中间文件都被丢弃 COPY --frombuilder /app/target/*.jar app.jar # 创建一个非root用户运行应用增强安全性 RUN useradd -m -u 1000 appuser chown -R appuser:appuser /app USER appuser ENTRYPOINT [java, -jar, app.jar]这个简单的改动就能让镜像体积从600MB降到150MB左右。为什么因为第一阶段的maven:3.8.8-openjdk-11镜像在构建完成后就被丢弃了最终镜像只基于轻量级的openjdk:11-jre-slim只包含Java运行时环境。我实测过一个Spring Boot Web应用镜像从687MB降到了142MB网络传输和加载速度的提升是立竿见影的。2.2 选择更小的基础镜像与JVM调优多阶段构建是基础选对“运行阶段”的基础镜像同样关键。openjdk:11-jre-slim已经不错但我们还可以更进一步。JRE vs JDK生产环境运行应用99%的情况只需要JREJava Runtime Environment。除非你的应用需要在容器内动态编译代码否则永远选择-jre后缀的镜像。Slim vs Alpine-slim版本基于Debian删除了许多非必需软件包。-alpine版本基于Alpine Linux镜像极小通常只有几MB但使用的是musl libc库与标准的glibc可能存在兼容性问题。对于大多数Java应用我推荐使用eclipse-temurin:11-jre-alpineAdoptium Temurin项目的Alpine镜像它兼容性好且体积非常小。但要注意如果应用依赖了某些本地库如通过JNI调用在Alpine上可能需要重新编译。剥离不必要的文件即使使用slim镜像你也可以在Dockerfile中进一步清理。例如在复制jar包后可以删除/tmp目录下的缓存文件。镜像瘦身了JVM参数也得跟上。在容器这个“资源受限”的环境里JVM的默认行为可能不是最优的。这里有几个关键参数ENV JAVA_OPTS-Xms512m -Xmx512m -XX:UseContainerSupport -XX:MaxRAMPercentage75.0 -XX:UseG1GC -XX:MaxGCPauseMillis200-Xms512m -Xmx512m将堆内存初始值和最大值设为相同避免堆在运行时动态调整带来的性能开销。-XX:UseContainerSupport这是一个关键参数JDK 8u191和JDK 10默认开启让JVM能够识别容器设置的内存限制而不是读取宿主机的物理内存。-XX:MaxRAMPercentage75.0结合容器支持设置JVM堆最大可用内存为容器内存限制的75%。剩下的25%留给堆外内存Metaspace, Thread stacks, Direct buffers等。这比写死-Xmx值更灵活能自动适配Pod不同的内存限制。-XX:UseG1GCG1垃圾收集器在延迟和吞吐量上有较好的平衡适合微服务这种响应式应用。2.3 进阶技巧分层优化与Distroless镜像除了多阶段构建还有两个进阶技巧可以压榨最后一点空间。分层优化Docker镜像由一系列只读层Layer组成。Dockerfile的每一条指令都会创建一个新层。常用的层会被缓存加速后续构建。优化原则是变化频率低的层放在前面变化频率高的层如复制应用代码放在后面。这就是为什么上面的Dockerfile先单独COPY pom.xml并运行mvn dependency:go-offline因为依赖通常比业务代码稳定。这样当只有源代码变更时依赖层可以被复用无需重新下载所有jar包。Distroless镜像这是谷歌推崇的终极安全与瘦身方案。Distroless镜像只包含应用及其运行时依赖不包含Shell、包管理器甚至/bin/bash。这意味着攻击面极小。对于Java可以使用gcr.io/distroless/java11-debian11。但调试会变得困难无法docker exec进入容器通常需要搭配完善的日志和监控。使用方式如下FROM maven AS builder # ... 构建过程同上 ... FROM gcr.io/distroless/java11-debian11 COPY --frombuilder /app/target/*.jar app.jar USER nonroot:nonroot # 使用非root用户 ENTRYPOINT [java, -jar, app.jar]这个镜像比slim版本还要小得多安全性极高。建议在对安全有严格要求且运维体系成熟的环境中使用。3. K8s生产部署为Java微服务配置“智能管家”镜像优化好了相当于我们造了一辆性能优良、油耗低的车。接下来就是把它停进一个现代化的、自动化的停车场K8s集群。K8s不只是个“停车场”它更是一个“智能管家”负责调度、监控、维修、扩容你的“车”。3.1 资源限制与请求给容器划清“资源边界”这是保障集群稳定性的生命线。不设资源限制一个“疯跑”的Pod可能吃光节点内存引发“邻居”被驱逐。K8s通过resources字段来管理。apiVersion: apps/v1 kind: Deployment spec: template: spec: containers: - name: my-java-app resources: requests: memory: 512Mi cpu: 250m limits: memory: 1024Mi cpu: 500mrequests请求相当于Pod的“低保”调度器会根据节点的剩余可分配资源是否能满足所有Pod的requests总和来决定将Pod调度到哪个节点。对于Java应用memory.request应至少等于JVM堆-Xmx值加上一定的堆外内存余量比如128-256MB。limits限制Pod能使用的资源上限。这是硬限制。这里有个超级大坑如果JVM的-Xmx堆最大内存设置得超过了容器的memory.limits当堆内存使用达到-Xmx但尚未触发GC时整个容器占用的内存可能已超出limits导致容器被K8s的OOM Killer直接杀死日志都来不及打。所以务必确保-Xmx容器内存limit并留出足够空间建议至少20%给JVM自身和系统库。CPU的limits设置也需要小心。设置过严如100m即0.1核可能导致应用在流量高峰时处理变慢设置过松则浪费资源。通常可以从500m0.5核开始根据监控指标调整。一个重要的建议是对于延迟敏感型应用可以考虑不设置CPU limits只设置requests以避免CPU节流Throttling导致性能抖动但前提是你要信任你的应用不会恶意占用CPU。3.2 探针配置让K8s知晓你的应用健康状态没有配置探针K8s就不知道你的应用是死是活是否准备好接收流量。这会导致流量被打到尚未启动完成或已经僵死的Pod上。就绪探针readinessProbe检测应用是否准备好接收请求。如果探测失败K8s会将该Pod从Service的负载均衡端点中移除。这是必须配置的。对于Spring Boot可以借助Actuator的健康端点。存活探针livenessProbe检测应用是否还活着。如果探测失败K8s会重启该Pod。要谨慎配置只有当应用确实陷入不可恢复状态如死锁时才应重启。误判会导致频繁重启服务永远无法就绪。一个针对Spring Boot的推荐配置livenessProbe: httpGet: path: /actuator/health/liveness # 使用独立的liveness端点 port: 8080 initialDelaySeconds: 90 # 给JVM和应用足够的启动时间 periodSeconds: 10 failureThreshold: 3 # 连续失败3次才判定为失败 readinessProbe: httpGet: path: /actuator/health/readiness # 使用独立的readiness端点 port: 8080 initialDelaySeconds: 30 periodSeconds: 5 failureThreshold: 1关键点区分liveness和readiness端点Spring Boot Actuator允许你配置独立的健康组。liveness检查可以简单如内嵌服务器状态readiness检查可以复杂如依赖的数据库、缓存是否连通。initialDelaySeconds一定要给足Java应用启动慢特别是Spring Boot。给少了探针会在应用启动中途就开始检查导致失败和重启循环。我建议至少60秒复杂应用可能需要120秒以上。readiness检查要包含关键依赖如果数据库挂了你的应用虽然进程活着但已无法提供服务此时readiness应失败让流量切到其他健康的服务实例。3.3 滚动更新与回滚策略实现无缝发布Deployment控制器默认的RollingUpdate策略已经很好但我们还可以微调以实现更平滑、可控的发布。apiVersion: apps/v1 kind: Deployment spec: strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 # 在更新期间可以超出期望Pod数量的最大个数。可以是具体数字或百分比如25%。 maxUnavailable: 0 # 在更新期间允许不可用Pod的最大个数。设为0意味着“先启动新Pod再终止旧Pod”保证全程有可用实例。 minReadySeconds: 30 # 新创建的Pod在就绪后必须运行至少30秒才被视为可用。这给了应用一个“热身”时间如加载缓存。maxSurge: 1, maxUnavailable: 0这是一种“先扩后缩”的保守策略能保证服务容量在整个更新过程中不降低适合对可用性要求极高的场景但会暂时需要更多资源。maxSurge: 25%, maxUnavailable: 25%这是一种更快速的更新策略允许同时有部分Pod不可用并创建额外的Pod更新速度更快。回滚是救命的黄金按钮。发布新版本后发现问题立即回滚# 查看发布历史 kubectl rollout history deployment/my-app -n microservice # 回滚到上一个版本 kubectl rollout undo deployment/my-app -n microservice # 回滚到指定版本 kubectl rollout undo deployment/my-app --to-revision2 -n microservice一定要养成在发布后立即进行核心功能验证的习惯一旦发现问题在影响扩大前快速回滚。4. 生产环境稳定性加固监控、日志与网络策略车停好了管家也雇了但你还得给停车场装上摄像头监控、建立值班日志日志收集、并制定停车规则网络策略才能高枕无忧。4.1 可观测性Metrics、Logs与Tracing对于Java微服务可观测性三板斧必须落地。1. 指标监控Metrics使用Micrometer集成Prometheus是标准做法。在pom.xml中添加依赖后在application.yml中配置暴露端点。更重要的是在K8s的Deployment中为Pod添加注解让Prometheus自动发现并抓取。apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: template: metadata: annotations: prometheus.io/scrape: true prometheus.io/path: /actuator/prometheus prometheus.io/port: 8080在Grafana中你可以监控JVM堆/非堆内存、GC时间、线程状态、HTTP请求QPS、延迟、错误率等。设置好告警规则如GC暂停时间过长、错误率超过1%这是发现问题的第一道防线。2. 日志收集Logs容器标准输出和标准错误会被Docker引擎收集但默认不会持久化。生产环境必须使用EFKElasticsearch, Fluentd/Fluent Bit, Kibana或Loki等方案进行集中式日志管理。关键点在于在K8s中通常采用DaemonSet方式在每个节点部署日志采集代理如Fluentd采集/var/log/containers/目录下的容器日志并附加丰富的K8s元数据Pod名称、命名空间、标签等便于在Kibana中按服务、实例进行过滤和查询。3. 分布式追踪Tracing对于复杂的微服务调用链链路追踪如SkyWalking, Jaeger是定位性能瓶颈和调用失败的利器。它需要你在应用中集成相应的客户端库。在K8s环境中部署一个追踪后端服务应用通过配置Agent或SDK将追踪数据上报就能在UI上清晰地看到一次请求流经了哪些服务在每个服务中耗时多少。4.2 网络策略与安全上下文默认情况下K8s集群内所有Pod是可以互相通信的。这不符合最小权限原则。网络策略NetworkPolicy就像防火墙规则可以控制Pod之间的流量。 例如只允许来自ingress命名空间的Pod访问你的微服务或者只允许你的微服务访问特定的数据库PodapiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-ingress-to-app spec: podSelector: matchLabels: app: my-java-app policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: name: ingress-nginx ports: - protocol: TCP port: 8080此外在Pod或容器级别设置安全上下文SecurityContext也是最佳实践比如以非root用户运行容器、禁止特权模式、设置文件系统只读等能有效降低安全风险。securityContext: runAsNonRoot: true runAsUser: 1000 allowPrivilegeEscalation: false capabilities: drop: - ALL readOnlyRootFilesystem: true4.3 配置与敏感信息管理绝对不要把数据库密码、API密钥等硬编码在代码或镜像里。K8s提供了ConfigMap和Secret来管理配置和敏感数据。ConfigMap存储非敏感的配置数据如环境变量、配置文件内容。kubectl create configmap app-config --from-fileapplication.properties -n microservice在Deployment中挂载为卷或设置为环境变量。Secret存储敏感数据如密码、令牌。数据默认是Base64编码并非加密。kubectl create secret generic db-secret --from-literalpasswordmysecret -n microservice使用时以卷或环境变量方式注入比ConfigMap更安全虽然仍建议结合Vault等专业工具。在Deployment中引用它们env: - name: DB_PASSWORD valueFrom: secretKeyRef: name: db-secret key: password - name: SPRING_PROFILES_ACTIVE valueFrom: configMapKeyRef: name: app-config key: spring.profiles.active这样当你需要修改配置或轮换密码时只需更新ConfigMap或Secret然后重启Pod即可无需重新构建镜像。5. 浓缩避坑清单那些年我踩过的“雷”最后分享一份我用自己的“血泪史”换来的避坑清单希望能帮你少走弯路。镜像标签永远不用latest生产环境必须使用明确的版本号如v1.2.3或基于Git Commit SHA的标签。latest是万恶之源会导致环境不一致和回滚困难。JVM内存设置必须小于容器内存限制这是导致容器被OOM Kill的最常见原因。牢记公式-XmxMaxDirectMemorySizeMetaspace线程栈内存JVM自身开销容器内存limits。使用-XX:MaxRAMPercentage是更优雅的方式。探针配置不当引发“死亡循环”initialDelaySeconds设得太短应用没启动完就被探针判死然后重启无限循环。readiness和liveness检查的逻辑要区分开liveness检查条件要宽松。资源请求requests设置过低导致调度失败如果你的应用平均需要512Mi内存但requests只写了128Mi调度器可能会把很多这样的Pod塞到同一个节点导致节点实际负载过高引发系统OOM。忘记配置Pod反亲和性导致单点故障如果不加约束Deployment的所有副本可能被调度到同一个节点。一旦该节点故障服务就全挂了。使用podAntiAffinity可以避免这种情况。affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - my-java-app topologyKey: kubernetes.io/hostname容器内时区不对基础镜像通常是UTC时间导致日志时间对不上。可以在Dockerfile中设置时区RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime或者通过环境变量TZAsia/Shanghai传递。应用日志不输出到标准输出很多传统的Java应用习惯写日志文件。在容器中日志文件不便于采集。务必改造日志配置如Logback、Log4j2将日志输出到控制台标准输出/错误流。没有设置Pod生命周期钩子对于一些有状态的应用在停止前需要执行一些清理操作如优雅关闭、注销服务注册。使用preStop生命周期钩子给应用一个优雅退出的机会。lifecycle: preStop: exec: command: [sh, -c, sleep 10] # 或者发送一个管理端点请求让应用优雅关闭直接使用kubectl exec或kubectl logs调试生产环境这应该是最后的手段且操作前必须明确知道自己在做什么。频繁的exec会干扰容器运行logs不加--tail或-f参数可能会拉取大量历史日志占用资源。优先通过监控和集中日志系统来排查问题。忽略K8s事件Eventskubectl get events -n namespace或kubectl describe pod pod-name输出的Events字段是诊断Pod创建失败、调度失败、镜像拉取失败等问题的最直接线索。很多新手一遇到问题就慌了却忘了看这个最宝贵的信息源。容器化和K8s部署是一个系统工程每一个环节的优化和加固累积起来就是生产环境稳定性的巨大提升。从镜像构建开始就追求极致在资源配置上精细规划用探针和策略为服务保驾护航再配上完善的可观测性手段你的Java微服务才能真正在云原生时代“健步如飞”。记住最好的实践来自于对自身应用特性的深刻理解以及不断的测试、观察和调整。

相关新闻

CHORD-X视觉战术指挥系统MySQL数据库集成教程:战术数据存储与分析

CHORD-X视觉战术指挥系统MySQL数据库集成教程:战术数据存储与分析

CHORD-X视觉战术指挥系统MySQL数据库集成教程:战术数据存储与分析 你是不是刚部署好CHORD-X视觉战术指挥系统,看着屏幕上实时跳动的目标坐标、分类结果,心里琢磨着:这些宝贵的数据,总不能每次都让它一闪而过吧&#x…

2026/7/9 14:43:14 阅读更多 →
Cursor AI 编程助手实战:5个提升开发效率的隐藏技巧(附真实案例)

Cursor AI 编程助手实战:5个提升开发效率的隐藏技巧(附真实案例)

Cursor AI 编程助手实战:5个提升开发效率的隐藏技巧(附真实案例) 如果你已经熟悉了 Cursor 的基础操作,比如用 CtrlK 生成代码片段,或者用 CtrlL 打开聊天框提问,那么你可能觉得自己已经掌握了这个工具。但…

2026/7/8 5:44:32 阅读更多 →
从IPMI到RedFish:云服务器带外管理的演进与未来

从IPMI到RedFish:云服务器带外管理的演进与未来

1. 从“推车进机房”到“指尖点鼠标”:带外管理的前世今生 不知道你有没有过类似的经历,反正我记忆犹新。几年前,实验室的几台高性能计算服务器,就像是几个脾气古怪的“大爷”,动不动就给你来个“原地宕机”。最头疼的…

2026/5/17 12:41:02 阅读更多 →

最新新闻

软件设计模式实战解析:5种高频模式(策略/观察者/装饰器等)在Java/Python中的实现对比

软件设计模式实战解析:5种高频模式(策略/观察者/装饰器等)在Java/Python中的实现对比

软件设计模式实战解析:5种高频模式在Java/Python中的实现对比 1. 设计模式基础与工程价值 设计模式是软件工程中经过验证的解决方案模板,它们针对特定场景提供了可复用的设计思路。在大型软件系统中,合理运用设计模式能显著提升代码的可维护…

2026/7/10 10:19:22 阅读更多 →
什么是OpenAI API协议

什么是OpenAI API协议

个 Demo,秒懂使用 OpenAI API 协议 一行命令,直连模型。没有 SDK,没有抽象层——你面对的是最原始的 HTTP 与 JSON,这正是 OpenAI API 协议的真正面貌。 curl -X POST ‘https://tokenhub.tencentmaas.com/v1/chat/completions’ …

2026/7/10 10:19:22 阅读更多 →
2026家用豆浆破壁机带12小时预约,醒来就喝热乎鲜豆浆

2026家用豆浆破壁机带12小时预约,醒来就喝热乎鲜豆浆

2026家用豆浆破壁机带12小时预约,醒来就喝热乎鲜豆浆清晨六点半,厨房里飘出温热的豆浆香,杯体安静运转几乎听不到噪音,预约好的早餐已经准备就绪。这样的场景,正在越来越多家庭里变成日常。蓝宝这款柔音破壁机&#xf…

2026/7/10 10:17:21 阅读更多 →
3个神级操作,让Mac窗口置顶神器Topit帮你工作效率飙升200%

3个神级操作,让Mac窗口置顶神器Topit帮你工作效率飙升200%

3个神级操作,让Mac窗口置顶神器Topit帮你工作效率飙升200% 【免费下载链接】Topit Pin any window to the top of your screen / 在Mac上将你的任何窗口强制置顶 项目地址: https://gitcode.com/gh_mirrors/to/Topit 还在为窗口遮挡而抓狂吗?Topi…

2026/7/10 10:15:21 阅读更多 →
终极指南:如何使用Kinovea开源运动分析软件快速掌握专业视频分析技巧

终极指南:如何使用Kinovea开源运动分析软件快速掌握专业视频分析技巧

终极指南:如何使用Kinovea开源运动分析软件快速掌握专业视频分析技巧 【免费下载链接】Kinovea Video solution for sport analysis. Capture, inspect, compare, annotate and measure technical performances. 项目地址: https://gitcode.com/gh_mirrors/ki/Ki…

2026/7/10 10:13:20 阅读更多 →
BilibiliDown使用指南:3步掌握B站视频音频批量下载技巧

BilibiliDown使用指南:3步掌握B站视频音频批量下载技巧

BilibiliDown使用指南:3步掌握B站视频音频批量下载技巧 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/…

2026/7/10 10:09:18 阅读更多 →

日新闻

STM32与LTC1864高精度ADC的SPI通信实现

STM32与LTC1864高精度ADC的SPI通信实现

1. 项目背景与核心需求在工业控制和嵌入式系统开发中,模拟信号与数字系统的无缝集成一直是工程师面临的关键挑战。LTC1864作为一款16位高精度ADC转换器,配合STM32F101ZG这类主流微控制器,能够构建高性能的模拟信号采集系统。这种组合特别适合…

2026/7/10 0:03:07 阅读更多 →
猫抓插件:浏览器资源嗅探与视频下载的终极解决方案

猫抓插件:浏览器资源嗅探与视频下载的终极解决方案

猫抓插件:浏览器资源嗅探与视频下载的终极解决方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为网页视频无法下载而烦恼吗&am…

2026/7/10 0:05:09 阅读更多 →
直流有刷电机驱动方案:TC78H653FTG与MKV46F256VLH16应用

直流有刷电机驱动方案:TC78H653FTG与MKV46F256VLH16应用

1. 直流有刷电机驱动方案概述在工业自动化和消费电子领域,直流有刷电机因其结构简单、控制方便、成本低廉等优势,仍然是许多应用场景的首选驱动方案。TC78H653FTG作为东芝推出的新一代H桥驱动器,与MKV46F256VLH16微控制器配合使用&#xff0c…

2026/7/10 0:05:09 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/8 16:14:06 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/9 13:46:46 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/9 21:41:05 阅读更多 →

月新闻