当前位置: 首页 > news >正文

为何在Kubernetes容器中以root身份运行存在风险?

作者:马辛·瓦西奥内克(Marcin Wasiucionek)
在这里插入图片描述

引言

在Kubernetes安全领域,一个常见的建议是让容器以非root用户身份运行。但是,在容器中以root身份运行,实际会带来哪些安全隐患呢?在Docker镜像和Kubernetes配置中,这一最佳实践常常被重点强调。在Kubernetes清单文件中,可以通过以下代码实现:

securityContext:runAsNonRoot: true # 确保runAsUser指定的用户ID不是0。如果用户ID设置为0,Pod将无法运行。runAsUser: 1000 # 将容器中运行的进程的用户ID设置为1000。

你可以只设置runAsUser字段,而不包含runAsNonRoot。然而,如果你指定了runAsNonRoot,那么也必须定义runAsUser

容器以root身份运行为何危险⚠️

当容器以root身份运行时,会出现多种潜在的攻击途径。让我们通过实验来探究一下。

搭建实验环境🛠️

为了说明以root身份运行容器的风险,我们将使用两个相似的容器进行实际测试:

  1. 一个默认以root身份运行的alpine:3.20.2容器。
  2. 一个自定义的alpine:3.20.2容器,配置为以非root用户身份运行。

以下是用于创建非root容器的Dockerfile:

# 使用Alpine镜像作为基础镜像
FROM alpine:3.20.2# 添加一个名为'nonroot'的非root用户,用户ID为1000
RUN adduser -D -u 1000 nonroot# 将后续命令的用户设置为'nonroot'
USER nonroot
# 可选:设置默认命令
CMD ["sh"]

在本地环境中,我们使用Minikube 1.32.0和Kubernetes版本v1.28.3。通过以下命令构建镜像,并使其在Minikube集群中可用:

eval $(minikube docker-env)
docker build. -t nonroot:1.0.0

接下来,我们在Kubernetes中部署这些容器。在这个演示中,我使用hostPath卷来测试权限,不过强烈建议不要在家庭实验室之外使用hostPath(我会在另一篇文章中解释原因)!
root用户的Pod定义如下:

apiVersion: v1
kind: Pod
metadata:name: root
spec:containers:- name: alpineimage: alpine:3.20.2command: ["/bin/sh", "-c"]args: ["while true; do sleep 100; done"]volumeMounts:- mountPath: /hostname: hostvolumes:- name: hosthostPath:path: /etc/kubernetes/manifests # 挂载节点上的静态Pod目录type: Directory

非root用户的Pod定义如下:

apiVersion: v1
kind: Pod
metadata:name: nonroot
spec:containers:- name: alpineimage: nonroot:1.0.0command: ["/bin/sh", "-c"]args: ["while true; do sleep 100; done"]securityContext:runAsUser: 1000 # 确保容器以用户ID为1000的非root用户运行volumeMounts:- mountPath: /hostname: hostvolumes:- name: hosthostPath:path: /etc/kubernetes/manifests # 挂载节点上的静态Pod目录type: Directory
测试潜在攻击🧪
  1. 下载恶意软件🦠
    一种常见的攻击方式是下载并执行恶意软件包。我通过尝试从dev.to获取一些数据来测试这一点。
    在这里插入图片描述

由于容器中最初未安装curl,我尝试安装它:
在这里插入图片描述

在root容器中安装成功,但在非root容器中安装失败。让我们尝试获取数据。
在这里插入图片描述

在root容器中操作正常,但在非root容器中被阻止。这表明以非root用户身份运行可以有效地缓解这种攻击。其他措施,如使用只读文件系统,可以进一步增强安全性,我将在未来的文章中介绍。

  1. 访问主机资源🔒
    我将一个主机目录挂载到了Pod(再次强调 —— 请不要在家庭实验室之外这样做!)。通过这种访问权限,攻击者可以尝试访问包含静态Pod manifests 的目录,并尝试运行恶意Pod(尽管下载恶意镜像应该会被集群策略阻止)。这可以通过向静态清单目录(通常是Kubernetes节点上的/etc/kubernetes/manifests)添加新的清单文件来实现。有了这种访问权限,攻击者可以尝试:
    • 通过部署拦截集群内网络流量的Pod来执行中间人攻击,并捕获敏感信息。
    • 部署带有反向shell的后门Pod(你可以在https://www.revshells.com/ 找到示例),接受来自黑客机器的连接。
    • 运行一个Pod,将包含敏感数据的卷中的数据传输到外部实体。
    • 通过从ETCD存储中读取机密信息来扩大攻击范围,并进一步渗透基础设施。
    • 使用你的资源运行加密货币挖掘程序以获取经济利益。

让我们使用以下清单文件部署一个加密货币挖掘程序的模拟:

apiVersion: v1
kind: Pod
metadata:name: crypto - miner
spec:containers:- name: miner - containerimage: busyboxcommand: ["/bin/sh", "-c", "while true; do echo 'Mining in progress...'; sleep 5; done"]

并从两个Pod中添加静态Pod文件:
在这里插入图片描述

如你所见,非root用户的Pod上的命令被拒绝。它在root用户的Pod上成功运行,并将加密货币挖掘程序的清单文件添加到了静态Pod目录中。集群中创建了这个Pod吗?
在这里插入图片描述
是的,它在集群中运行,并且在出现故障或重启时将被重新调度。

攻击者通过访问节点上的hostPath还可以做的另一件事是读取主机上的/etc/passwd文件。该文件不包含明文密码,但它让攻击者了解系统中存在的用户。结合其他一些数据源和/etc/shadow,这些信息可能会让攻击者进一步利用系统。

  1. 权限提升🚫
    你难道不能将非root用户切换为root用户,然后做同样的事情吗?让我们试试。
    在这里插入图片描述

不,你不能。从非root用户切换到root用户的尝试失败了,这表明在没有sudo权限的情况下,权限提升是不可行的。因此,如果非root用户不在sudoers列表中,风险就会降低。

如何预防?🛡️

为了防止与以root身份运行容器相关的安全问题,请遵循以下最佳实践:

  1. 使用非root用户:始终在你的Docker容器中定义并使用非root用户。🧑‍💻
  2. 利用Kubernetes安全上下文:使用Kubernetes安全上下文(Security Context)指定容器执行的用户。🔐
结论✨

在Kubernetes中以非root用户身份运行容器,通过缓解常见的攻击途径,显著增强了安全性。希望本文能让你了解这一最佳实践的重要性。

参考文献
  1. Understanding the Docker USER instruction
  2. Kubernetes Security Context
  3. Alpine Docker images on Docker Hub
  4. Kubernetes Pod Security Standards
  5. https://medium.com/@marcin.wasiucionek/why-is-running-as-root-in-kubernetes-containers-dangerous-e5f1a116080e

相关文章:

为何在Kubernetes容器中以root身份运行存在风险?

作者:马辛瓦西奥内克(Marcin Wasiucionek) 引言 在Kubernetes安全领域,一个常见的建议是让容器以非root用户身份运行。但是,在容器中以root身份运行,实际会带来哪些安全隐患呢?在Docker镜像和…...

【人工智能】多模态学习在Python中的应用:结合图像与文本数据的深度探索

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 多模态学习是人工智能领域的一个重要研究方向,旨在通过结合多种类型的数据(如图像、文本、音频等)来提高模型的性能。本文将深入探讨多模…...

以AI为翼:技术能力进阶的新路径

一、引言 1.1 研究背景与意义 在当今数字化时代,人工智能(AI)已成为推动各领域发展的核心驱动力。从最初简单的算法模型到如今复杂的深度学习架构,AI 技术取得了令人瞩目的进步。自 20 世纪 50 年代人工智能概念提出以来&#x…...

使用 HTTP::Server::Simple 实现轻量级 HTTP 服务器

在Perl中,HTTP::Server::Simple 模块提供了一种轻量级的方式来实现HTTP服务器。该模块简单易用,适合快速开发和测试HTTP服务。本文将详细介绍如何使用 HTTP::Server::Simple 模块创建和配置一个轻量级HTTP服务器。 安装 HTTP::Server::Simple 首先&…...

Jenkins 触发构建的几种常见方式

为了实现自动化构建,Jenkins 提供了多种触发构建的方式。这些触发方式可以根据开发团队的需求来选择,使得构建过程更加灵活和高效。 1. 手动触发构建 手动触发构建是最简单的一种方式,通常用于开发人员或管理员手动启动构建任务。 步骤: 登录 Jenkins 后,进入某个项目(…...

算法基础--二分查找

模板 #include <iostream> #include <cstring> #include <algorithm> #include <unordered_map> /** 二分查找&#xff08;Binary Search&#xff09;是一种高效的查找算法&#xff0c;其时间复杂度为 o(logn) */ using namespace std;const int N …...

Vue 3 30天精进之旅:Day 14 - 项目实践

在前面的学习中&#xff0c;我们已经掌握了Vue 3的基础知识&#xff0c;包括其核心概念、Vue Router、Vuex&#xff0c;以及异步操作等。今天是一个重要的里程碑&#xff1a;我们将把这些知识整合到一个实际的项目中。通过项目实践&#xff0c;你将能够深入理解所学知识&#x…...

【Java基础-42.4】Java中的包装类对象默认值:深入解析与注意事项

在Java编程中&#xff0c;包装类&#xff08;Wrapper Classes&#xff09;是将基本数据类型&#xff08;如int、char等&#xff09;封装为对象的类。它们提供了更多的功能和灵活性&#xff0c;例如允许基本数据类型参与面向对象的操作&#xff08;如存储在集合中&#xff09;。…...

Linux进程概念

目录 一.进程 二.进程状态 三.环境变量 四.程序地址空间 五.Linux2.6内核进程调度队列 一.进程 基本概念 课本概念&#xff1a;程序的一个执行实例&#xff0c;正在执行的程序等内核观点&#xff1a;担当分配系统资源&#xff08;CPU时间&#xff0c;内存&#xff09;的…...

Linux的简单使用和部署4asszaaa0

一.部署 1 环境搭建方式主要有四种: 1. 直接安装在物理机上.但是Linux桌面使用起来非常不友好.所以不建议.[不推荐]. 2. 使用虚拟机软件,将Linux搭建在虚拟机上.但是由于当前的虚拟机软件(如VMWare之类的)存在⼀些bug,会导致环境上出现各种莫名其妙的问题比较折腾.[非常不推荐…...

人工智能专业术语详解(A)

人工智能不仅是指寻求如何替代人类的机器人或人类寻求自我挑战的游戏&#xff0c;更是指运用复杂的程序化数学&#xff0c;其结果与高质量的训练数据相结合&#xff0c;推动了我们在日常生活中所看到的技术进步。从无人驾驶汽车到寻找癌症的治疗方法&#xff0c;人工智能正在逐…...

深度学习 Pytorch 基础网络手动搭建与快速实现

为了方便后续练习的展开&#xff0c;我们尝试自己创建一个数据生成器&#xff0c;用于自主生成一些符合某些条件、具备某些特性的数据集。 导入相关的包 # 随机模块 import random# 绘图模块 import matplotlib as mpl import matplotlib.pyplot as plt# 导入numpy import nu…...

deepseek的对话风格

概述 deepseek的对话风格&#xff0c;比一般的模型的回答多了思考过程&#xff0c;这是它比较可爱的地方&#xff0c;模型的回答有了思考过程&#xff0c;对用户而言大模型的回答不完全是一个黑盒。 deepseek的对话风格 train_prompt_style """Below is an…...

Spring Security(maven项目) 3.0.2.9版本 --- 改

前言&#xff1a; 通过实践而发现真理&#xff0c;又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识&#xff0c;又从理性认识而能动地指导革命实践&#xff0c;改造主观世界和客观世界。实践、认识、再实践、再认识&#xff0c;这种形式&#xff0c;循环往…...

OpenAI新商标申请曝光:AI硬件、机器人、量子计算全线布局?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

TVM调度原语完全指南:从入门到微架构级优化

调度原语 在TVM的抽象体系中&#xff0c;调度&#xff08;Schedule&#xff09;是对计算过程的时空重塑。每一个原语都是改变计算次序、数据流向或并行策略的手术刀。其核心作用可归纳为&#xff1a; 优化目标 max ⁡ ( 计算密度 内存延迟 指令开销 ) \text{优化目标} \max…...

AlexNet网络学习笔记(NIPS 2012)

题目:ImageNet Classification with Deep Convolutional Neural Networks 发文机构:多伦多大学 作者:Alex Krizhevsky,Ilya Sutskever,Geoffrey E. Hinton(人工智能教父,AI三巨头——杰弗里.辛顿(Geoffrey Hinton),约书亚.本吉奥(Yoshua Bengio)和扬.勒丘恩(Yan…...

Starrocks 对比 Clickhouse

极速查询的单表查询 StarRocks 在极速查询方面上做了很多&#xff0c;下面着重介绍四点&#xff1a; 1&#xff09;向量化执行&#xff1a;StarRocks 实现了从存储层到查询层的全面向量化执行&#xff0c;这是 StarRocks 速度优势的基础。向量化执行充分发挥了 CPU 的处理能力…...

C++实现一款功能丰富的通讯录管理系统

在学习编程的过程中&#xff0c;如何设计一个实用的项目是许多同学头疼的问题。如果你是一位正在学习C的同学&#xff0c;想通过实际项目巩固知识&#xff0c;那么这个通讯录管理系统绝对是一个理想的练手项目。在本文中&#xff0c;我将详细拆解代码逻辑&#xff0c;帮助你理解…...

动态规划之背包问题

文章目录 0-1 背包问题1. 二维动态规划实现&#xff08;0-1 背包&#xff09;&#xff1a;2. 一维动态规划实现&#xff08;0-1 背包&#xff09;&#xff1a; 完全背包问题1. 二维动态规划实现&#xff08;完全背包&#xff09;&#xff1a;2. 一维动态规划实现&#xff08;完…...

Linux抢占式内核:技术演进与源码解析

一、引言 Linux内核作为全球广泛使用的开源操作系统核心,其设计和实现一直是计算机科学领域的研究热点。从早期的非抢占式内核到2.6版本引入的抢占式内核,Linux在实时性和响应能力上取得了显著进步。本文将深入探讨Linux抢占式内核的引入背景、技术实现以及与非抢占式内核的…...

Rust语言进阶之文件处理:BufWriter用法实例(一百零四)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…...

EtherCAT主站IGH-- 30 -- IGH之master.h/c文件解析

EtherCAT主站IGH-- 30 -- IGH之master.h/c文件解析 0 预览一 该文件功能`master.c` 文件功能函数预览二 函数功能介绍`master.c` 中主要函数的作用1. `ec_master_init`2. `ec_master_clear`3. `ec_master_thread_start`4. `ec_master_thread_stop`5. `ec_master_enter_idle_pha…...

关于deepseek的一些普遍误读

最近deepseek成为全球最热门的话题&#xff0c;甚至没有之一&#xff0c;无论是北美&#xff0c;欧洲&#xff0c;各大IT巨头&#xff0c;各个投资机构&#xff0c;政府官员&#xff0c;乃至脱口秀演员&#xff0c;都在不断提及这个话题&#xff0c;而国内&#xff0c;自媒体也…...

刷题记录 动态规划-7: 63. 不同路径 II

题目&#xff1a;63. 不同路径 II 难度&#xff1a;中等 给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角&#xff08;即 grid[0][0]&#xff09;。机器人尝试移动到 右下角&#xff08;即 grid[m - 1][n - 1]&#xff09;。机器人每次只能向下或者向右移动一步。…...

7-2 拯救外星人

7-2 拯救外星人 你的外星人朋友不认得地球上的加减乘除符号&#xff0c;但是会算阶乘 —— 正整数 N 的阶乘记为 “N!”&#xff0c;是从 1 到 N 的连乘积。所以当他不知道“57”等于多少时&#xff0c;如果你告诉他等于“12!”&#xff0c;他就写出了“479001600”这个答案。…...

人工智能导论-第3章-知识点与学习笔记

参考教材3.2节的内容&#xff0c;介绍什么是自然演绎推理&#xff1b;解释“肯定后件”与“否定前件”两类错误的演绎推理是什么意义&#xff0c;给出具体例子加以阐述。参考教材3.3节的内容&#xff0c;介绍什么是文字&#xff08;literal&#xff09;&#xff1b;介绍什么是子…...

一个开源 GenBI AI 本地代理(确保本地数据安全),使数据驱动型团队能够与其数据进行互动,生成文本到 SQL、图表、电子表格、报告和 BI

一、GenBI AI 代理介绍&#xff08;文末提供下载&#xff09; github地址&#xff1a;https://github.com/Canner/WrenAI 本文信息图片均来源于github作者主页 在 Wren AI&#xff0c;我们的使命是通过生成式商业智能 &#xff08;GenBI&#xff09; 使组织能够无缝访问数据&…...

Java 大视界 -- Java 大数据在智能电网中的应用与发展趋势(71)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

c语言练习题【消息队列、共享内存、信号灯集】

练习1:消息队列 请使用消息队列实现2个终端之间互相聊天 #发送端 key_t key; int id;typedef struct Msgbuf{long channel;char buf[128];}msg_t;int main(int argc, const char *argv[]) {if (argc<2){printf("传入频道号\n");return 1;}keyftok("./ipc&q…...

力扣 295. 数据流的中位数

&#x1f517; https://leetcode.cn/problems/find-median-from-data-stream/ 题目 数据流中不断有数添加进来&#xff0c;add 表示添加数据&#xff0c;find 返回数据流中的中位数 思路 大根堆存储数据流中偏小的数据小根堆存储数据流中偏大的数据若当前的 num 比大根堆的…...

JavaScript原型链与继承:优化与扩展的深度探索

在 JavaScript 的世界里&#xff0c;万物皆对象&#xff0c;而每个对象都有一个与之关联的原型对象&#xff0c;这就构成了原型链的基础。原型链&#xff0c;简单来说&#xff0c;是一个由对象的原型相互连接形成的链式结构 。每个对象都有一个内部属性[[Prototype]]&#xff0…...

【建站】专栏目录

建站专栏的想法有很多&#xff0c;想写穷鬼如何快速低成本部署前后端项目让用户能访问到&#xff0c;如何将网站收录到百度&#xff0c;bing&#xff0c;google并优化seo让搜索引擎搜索到网站&#xff0c;想写如何把网站加入google广告或者接入stripe信用卡首款平台收款&#x…...

题目 1160: 出圈

题目描述 设有n个人围坐一圈并按顺时针方向从1到n编号&#xff0c;从第1个人开始进行1到m的报数&#xff0c;报数到第个m人&#xff0c;此人出圈&#xff0c;再从他的下一个人重新开始1到m的报数&#xff0c;如此进行下去直到所剩下一人为止。 输入格式 输入多行&#xff0c;每…...

Python小游戏29乒乓球

import pygame import sys # 初始化pygame pygame.init() # 屏幕大小 screen_width 800 screen_height 600 screen pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("打乒乓球") # 颜色定义 WHITE (255, 255, 255) BLACK (…...

力扣 【99. 恢复二叉搜索树】Java题解(二叉树的 Morris 遍历)

题目链接 Morris遍历 递归和迭代遍历&#xff0c;不管是前序中序还是后续&#xff0c;空间复杂度都是O(n)&#xff08;递归是因为隐式调用栈的开销&#xff09;。 而Morris遍历可以做到空间复杂度是O(1)。 思路就是节点的前序节点的右指针指向该节点&#xff0c;来保证可以通…...

CNN的各种知识点(一):卷积神经网络CNN通道数的理解!

卷积神经网络CNN通道数的理解&#xff01; 通道数的核心概念解析1. 通道数的本质 2. 单张灰度图的处理示例&#xff1a; 3. 批量输入的处理通道与批次的关系&#xff1a; 4. RGB三通道输入的处理计算过程&#xff1a;示例&#xff1a; 5. 通道数的实际意义6. 可视化理解(1) 单通…...

python-UnitTest框架笔记

UnitTest框架的基本使用方法 UnitTest框架介绍 框架&#xff1a;framework&#xff0c;为了解决一类事情的功能集合 UnitTest框架&#xff1a;是python自带的单元测试框架 自带的&#xff0c;可以直接使用&#xff0c;不需要格外安装 测试人员用来做自动化测试&#xff0c;作…...

书生大模型实战营3

文章目录 L0——入门岛git基础Git 是什么&#xff1f;Git 中的一些基本概念工作区、暂存区和 Git 仓库区文件状态分支主要功能 Git 平台介绍GitHubGitLabGitee Git 下载配置验证下载 Git配置 Git验证 Git配置 Git常用操作Git简易入门四部曲Git其他指令 闯关任务任务1: 破冰活动…...

在CentOS服务器上部署DeepSeek R1

在CentOS服务器上部署DeepSeek R1,并通过公网IP与其进行对话,可以按照以下步骤操作: 一、环境准备 系统要求: CentOS 8+(需支持AVX512指令集)。 硬件配置: GPU版本:NVIDIA驱动520+,CUDA 11.8+。 CPU版本:至少16核处理器,64GB内存。 存储空间:原始模型需要30GB,量…...

C++中常用的十大排序方法之4——希尔排序

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C中常用的排序方法之4——希尔排序的相…...

机器学习day7

自定义数据集 使用pytorch框架实现逻辑回归并保存模型&#xff0c;然后保存模型后再加载模型进行预测&#xff0c;对预测结果计算精确度和召回率及F1分数 代码 import numpy as np import torch import torch.nn as nn import torch.optim as optimizer import matplotlib.pyp…...

【流媒体】搭建流媒体服务器

搭建Windows Nginx服务器 搭建 下载nginx工具包解压至本地&#xff0c;并在cmd窗口中切换至nginx所在的本地目录修改 conf/nginx.conf 文件&#xff0c;更改其端口号 server中的 listen的端口号从 80改为 8080&#xff0c;因为80经常被其他服务占用&#xff0c;导致无法打开 …...

(电脑版)植物大战僵尸幼儿园版本,开启你的冒险之旅!

欢迎来到植物大战僵尸中文版&#xff0c;园长Jen已准备好迎接你的挑战&#xff01;在这个充满乐趣和策略的游戏中&#xff0c;你将体验到多种游戏模式&#xff0c;每种模式都带来不同的挑战和乐趣。 游戏模式&#xff1a; 冒险模式&#xff1a;踏上刺激的冒险旅程&#xff0c;…...

民法学学习笔记(个人向) Part.2

民法学学习笔记(个人向) Part.2 民法始终在解决两个生活中的核心问题&#xff1a; 私法自治&#xff1b;交易安全&#xff1b; 3. 自然人 3.4 个体工商户、农村承包经营户 都是特殊的个体经济单位&#xff1b; 3.4.1 个体工商户 是指在法律的允许范围内&#xff0c;依法经…...

解决SetWindowCompositionAttribute使控件文本透明的问题

用以下参数调用该API&#xff0c;能实现类似Aero的模糊透明效果。 参数具体含义见 https://zhuanlan.zhihu.com/p/569258181 http://www.memotech.de/WindowComposition/Text.txt http://www.memotech.de/WindowComposition/WindowComposition.zip DWORD accent[4] { 3,0,0,0 …...

响应式编程与协程

响应式编程与协程的比较 响应式编程的弊端虚拟线程Java线程内核线程的局限性传统线程池的demo虚拟线程的demo 响应式编程的弊端 前面用了几篇文章介绍了响应式编程&#xff0c;它更多的使用少量线程实现线程间解耦和异步的作用&#xff0c;如线程的Reactor模型&#xff0c;主要…...

Altium Designer绘制原理图时画斜线的方法

第一步&#xff1a;检查设置是否正确 打开preferences->PCB Editor ->Interactive Routing->Interactive Routing Options->Restrict TO 90/45去掉勾选项&#xff0c;点击OK即可。如下图所示&#xff1a; 然后在划线时&#xff0c;按下shift空格就能够切换划线…...

Android --- CameraX讲解

预备知识 surface surfaceView SurfaceHolder surface 是什么&#xff1f; 一句话来说&#xff1a; surface是一块用于填充图像数据的内存。 surfaceView 是什么&#xff1f; 它是一个显示surface 的View。 在app中仍在 ViewHierachy 中&#xff0c;但在wms 中可以理解为…...

动态分库分表

1. 动态分库分表的核心目标 解决单库性能瓶颈&#xff1a;通过水平拆分数据&#xff0c;提升并发处理能力。 支持弹性扩展&#xff1a;在不中断服务的前提下&#xff0c;实现数据分片的动态扩容/缩容。 避免跨分片操作&#xff1a;减少跨分片查询&#xff08;如JOIN、事务&am…...