[笔记]深入解析Windows操作系统《四》管理机制
文章目录
- 前言
- 4.1注册表
- 查看和修改注册表
- 注册表用法
- 注册表数据类型
- 注册表逻辑结构
- HKEY_CURRENT_USER
- HKEY_USERS
- 实验:观察轮廓加载和卸载
- HKEY_CLASSES_ROOT
- HKEY_LOCAL_MACHINE
- 实验:离线方式或远程编辑BCD
- HKEY_CURRENT_CONFIG
- HKEY_PERFORMANCE_DATA
前言
本章讲述了Microsoft Windows操作系统中四种基本的机制,它们对于系统的管理和配置至关重要,它们是:
- 注册表服务
- 统一的背景进程管理器Windows管理设施
- Windows诊断基础设施
4.1注册表
注册表在Windows系统的配置和控制方面扮演了一个非常关键的角色。它既是系统全局设置的存储仓库,也是每个用户的设置信息的存储仓库。虽然大多数人都把注册表想象成存储在磁盘上的静态数据,但是,在这一节中你将会看到,注册表也是Windows执行体和内核所维护的各种内存中数据结构的一个窗口。
我们首先从总体上介绍注册表的结构,并讨论一下它所支持的数据类型,简要地浏览一下Windows在注册表中维护的关键信息。然后,我们进一步讨论配置管理器( configurationmanager)的内部机理。这里的配置管理器是负责实现注册表数据库的执行体组件。我们将会涉及的话题有:注册表在磁盘上的内部结构、当一个应用程序请求配置信息时Windows如何获得相应的信息,以及Windows采用了哪些手段来保护这一关键的系统数据库。
查看和修改注册表
一般来说,你应该永远不需要直接编辑注册表:如果存储在注册表中的应用程序设置和系统设置需要手工修改,那么,它们应该有一个对应的用户界面来控制其修改。然而,正如你在本书中已经多次看到过的那样,有些高级设置和调试设置并没有相应的编辑用户界面。因此,Windows中包含了图形用户界面(GUI)和命令行工具,用于查看和修改注册表。
注册表用法
配置数据主要在四个时间点上被读取:
- 在初始的引导过程中,引导加载器读入配置数据和引导设备驱动程序的列表,以便
在初始化内核以前将它们加载到内存中。因为BCD(引导配置数据库,BootConfiguration Database)实际上存放在注册表储巢中,有人可能会争辩说,对注册表的访问发生在更早的时候(当引导管理器显示操作系统列表的时候)。 - 在内核引导过程中,内核读取有关的设置信息,这些设置信息指定了应该加载哪些设备驱动程序,以及各个系统部件(比如内存管理器和进程管理器(process manager))该如何配置以及该如何调整系统的行为。
- 在登录过程中,Explorer和其他的Windows组件从注册表中读取到每个用户的参数选择,包括网络驱动器字母映射、桌面墙纸、屏幕保护程序、菜单行为和图标的摆放,以及可能更重要的是,哪些启动程序需要激发起来,以及哪些文件最近被访问过。
- 在应用程序启动过程中,它们读取系统全局范围的设置,比如所有可选安装的组件列表和许可数据,还读取一些针对每个用户的设置信息,可能包括菜单和工具栏的摆放,以及最近访问过的文档的列表。
然而,在其他时间点上也可以读取注册表,比如在响应注册表值或键的修改的时候。注册表提供了异步回调机制,这是优先采用的接收注册表变化通知的方法,尽管如此,仍然有些应用程序会通过不停查询的做法,来监视它们存放在注册表中的设置信息,以便自动地让更新过的设置信息起作用。然而,一般来说,在一个空闲的系统上,注册表不应该有任何活动,显然这样的应用程序违反了注册表的最佳实践原则。(Sysinternals的Process Monitor是一个追查这种活动和错误应用程序的极佳工具。)
在下面的情形下,注册表通常会被修改:
- 虽然算不上是修改,但是,注册表的初始结构和许多默认设置是由一个原型版本的
注册表来定义的,此原型版本随Windows的安装介质一起发行,在安装的时候被拷贝到一个新的系统中。 - 应用安装工具创建了默认的应用程序设置,以及一些可反映出安装配置选项的设置信息。
- 在设备驱动程序的安装过程中,即插即用系统在注册表中创建了一些设置,告诉I/O
管理器如何启动此驱动程序;还创建了其他一些用于配置该驱动程序如何操作的设置(有关设备驱动程序如何被安装到系统中的更多信息,参见本书下册第8章“I/O系统”)。 - 当你通过用户界面改变了应用程序或者系统设置时,这些改变通常被保存在注册表
中。
注册表数据类型
注册表是一个数据库,其结构类似于磁盘卷的结构。注册表包含了键(key)和值( value)。键类似于磁盘的目录,而值则好比是磁盘上的文件。键是一个容器,可以包含其他的键(子键)或值。而值存储的是数据。最顶级的键是根键(root key)。在本节中,我们将相互交换着使用子键和键这两个词。
键和值两者都借用了文件系统的命名规范。因此,可以用名称“trade\mark”唯一标识一个存储在名为“trade”的键下面的、名为“mark”的值。此命名方案的一个例外是,每个键都有一个未命名的值。Regedit将未命名的值显示为“(默认)”。
注册表的值存储了不同种类的数据,它们可以是表4.1中所列出的12种类型之一。大多数注册表值是REG_DWORD、REG_BINARY或REG_Sz。REG_DWORD类型的值可以存储整数或者布尔值(开/关值);REG_BINARY值可以存储超过32位的整数值,或者诸如加密后的口令之类的原始数据;REG_Sz值存储字符串(当然是Unicode),可以表达诸如名称、文件名、路径和类型等元素。
REG_LINK类型特别值得注意,因为它让一个键可以透明地指向另一个键。当你搜索注册表而碰到一个链接时,路经搜索过程会在此链接的目标处继续进行。例如,如果\Root1\Link是一个指向\Root2\RegKey的REG_LINK值,并且RegKey包含了值RegValue,那么,可以有两条路径标识RegValue:\Root1\Link\RegValue和\Root2(RegKey\RegValue
。正如下一小节将要解释的那样,Windows自己也显式地使用了注册表链接:六个注册表根键中有三个其实是链接,它们指向另三个非链接的根键中的子键。
注册表逻辑结构
利用注册表中存储的数据,你可以画出注册表的组织结构。总共有6个根键(你不能加入新的根键,也不能删除已有的根键)可以存储信息,如表4.2所示。
为什么根键的名称都以“H”开头?因为根键的名称代表了指向键(KEY)的Windows句柄(H)。正如第1章“”中所提及的那样,HKLM是用于HKEY_LOCAL_MACHINE的缩写。表4.3列出了所有的根键以及它们的缩写。下面的几小节详细地解释了这六个根键中每一个根键的内容和用途。
HKEY_CURRENT_USER
HKCU根键包含了与当前本地登录用户的参数和软件配置有关的数据。它指向当前登录用户的用户轮廓,位于硬盘上的\Users<用户名>\Ntuser.dat中(要想知道根键是如何被映射到硬盘文件的,请参见本章后面的“注册表的内部机理”一节)。无论何时当一个用户的轮廓信息被加载的时候(比如在登录时候,或者当一个服务进程运行在某个特定用户名的环境中时),HKCU就会被创建出来,映射到HKEY_USERS下该用户的键上。表4.4列出了HKCU下面的一些子键。
HKEY_USERS
HKU为系统中每个加载的用户轮廓和用户类注册数据库包含了一个子键。它也包含一个名为HKU.DEFAULT的子键;这是一个链接,指向该系统的轮廓(对于那些运行在本地系统账户下的进程,它们会用到该轮廓信息;本章后面的“服务”一节中更加详细地讲述了有关该轮廓的信息)。譬如,这是Winlogon使用的轮廓,所以,改变了该轮廓中的桌面背景设置,就可以在登录屏幕上体现出来。当一个用户第一次登录到一个系统中,并且她的账户不依赖于一个漫游域轮廓(也就是说,用户的轮廓是在域控制器的指示下,从一个中心网络位置上获得的)的时候,系统以%SystemDrive%\Users\Default下存放的轮廓为基础,为她的账户创建一个轮廓。
系统将这些轮廓存储在哪里呢?此位置是由注册表值HKLM\Software\Microsoft\WindowsNT\CurrentVersion\ProfileList\ProfilesDirectory
来定义的,其默认设置是%SystemDrive%\Users。ProfileList键也存放了一个系统上所有出现过的轮廓的列表。针对每个轮廓的信息存放在一个对应的子键下面,其名称反映了该轮廓所对应账户的安全标识符(SID,Security ldentifier)(有关SID的更多信息,参见第6章“安全性”)。在每个轮廓的键所存储的数据中,sid值中存放的是该账户SID的二进制表示,而在ProfilelmagePath目录中存放的则是该轮廓所对应的储巢( hive,参见本章后面的“储巢”一节中的介绍)的硬盘路径。Windows在用户轮廓管理对话框中显示了一个系统中存储的轮廓列表,如图4.1所示。你只需在控制面板的System小程序的AdvancedSystem Settings中的Advanced标签视图的User Profiles部分单击Setting,就可以看到该对话框。
实验:观察轮廓加载和卸载
通过Runas命令,用一个当前并未登录到机器上的账户来激发一个进程,就可以看到一个轮廓先被加载到注册表中,然后又被卸载出去的过程。当新进程正在运行的时候,运行Regedit,你可在HKEY_USERS下注意到加载进来的轮廓键。在终止了此进程以后,在Regedit中按一下FS键以便刷新视图,此轮廓应该已经不在了。
HKEY_CLASSES_ROOT
HKCR包含了三种类型的信息:文件扩展名关联、COM类注册信息,以及UAC(User AccountControl)虚拟化注册表根。(关于UAC的更多信息,请参见第6章。)针对每个已注册的文件扩展名,都有一个对应的键。大多数键中包含一个REG_Sz值,指向HKCR中的另一个键,此键中包含了与该扩展名所代表的文件类相关联的信息。
例如,HKCR.xls指向了在另一个键(比如HKCU.xls\Excel.Sheet.8)中包含的有关MicrosoftExcel文件的信息。HKCR中其他的键包含了已注册到当前系统上的COM对象的详细配置信息。UAC虚拟化注册表位于VirtualStore键下,它与HKCR中保存的其他种类的数据没有关系。
HKEY_CLASSES_ROOT下的数据有以下两个来源途径:
- 针对每个用户的类注册数据:位于HKCU\SOFTWARE\Classes下(被映射至磁盘文件
\Users<username>\AppData\Local\Microsoft\Windows\Usrclass.dat)。 - 整个系统范围的类注册数据:位于HKLM\SOFTWARE\Classes下。
针对每个用户的注册数据为什么要与系统全局范围的注册数据分开呢,其原因在于,这样做以后,可漫游的轮廓就能够包含这些定制的用户数据。它同时也关闭了一个安全漏洞:非特权用户无法改变或者删除系统全局版本HKEY_CLAsSES_ROOT中的键,因此也就无法影响到系统中应用程序的操作。非特权用户和应用程序可以读取系统全局范围的数据,也可以在系统全局数据中增加新的键和值(在它们的用户数据中这些键和值也被镜像过来了),但是它们只能修改其私有数据中已有的键和值。
HKEY_LOCAL_MACHINE
根键HKLM包含了所有系统全局范围的配置子键:BCDO0000000、COMPONENTS(根据需要动态加载)、HARDWARE、SAM、SECURITY、SOFTWARE和SYSTEM。
HKLM\BCDO0000000子键包含了引导配置数据库(BCD)信息,这是作为一个注册表储巢被加载进来的。该数据库代替了以前在Windows Vista以前使用的Boot.ini文件,为每次安装Windows的引导配置数据增加了极大的灵活性和隔离性。(有关BCD的更多信息,请参考本书下册第13章“启动和停机”。)
在BCD中的每一项,比如一次安装的Windows,或者针对这一次安装的命令行设置,都保存在Objects子键下,它或者是一个可通过GUID来引用的对象(针对引导项的情形),或者是一个称为元素(element)的数值子键。这些原始元素,绝大多数在MSDN Library的BCD参考材料部分有文档描述,它们定义了各种命令行设置或者引导参数。与每个元素子键相关联的值对应于相应的命令行标记或者引导参数的值。
BCDEdit命令行工具使得你可以通过元素和对象的符号名称来修改BCD。它也提供了关于所有可用的引导选项的大量帮助信息;不幸的是,它只能工作在本地系统环境中。因为注册表可以被远程打开,也可以从储巢文件中导入进来,所以,你可以利用注册表编辑器来修改或读取一台远程计算机的BCD。下面的实验显示了你可以利用注册表编辑器来打开内核调试功能。
实验:离线方式或远程编辑BCD
子键HKLM\COMPONENTS包含的信息与CBS(Component Based Servicing,基于组件的服务)栈有关。此CBSs栈包含了各种文件和资源,它们是Windows安装映像(用于自动化的安装包或者OEM预安装包)的一部分,或者是一次活动的Windows安装的一部分。为了服务目的而定义的CBS AP利用此注册表键中的信息来标识出已安装的组件和它们的配置信息。无论何时当单独地或者成组地安装、更新或者移除组件(分别称为单元unit或包package)时,这些信息都会被用到。因为该键可能会非常大,所以,为了优化系统资源,如果CBs栈在服务一个请求时,它只是被动态地加载到系统中,然后根据需要被卸载。
子键HKLM\HARDWARE维护了有关当前系统中的遗留硬件,以及一些从硬件设备至驱动程序的映射关系的描述信息。在现代系统上,只有一些外设,比如键盘、鼠标和ACPIBIOS数据,有可能在这里能找得到。设备管理器工具(从控制面板中运行System小程序,然后单击DeviceManager〉使你可以查看注册表硬件信息,这些信息只是简单地从HARDWARE键中读取出来的值(尽管它主要使用了HKLM\SYSTEM\CurrentControlSet\Enum树)。
HKLM\SAM存放了本地账户和组的信息,比如用户口令、组定义和域关联信息。作为域控制器运行的Windows Server系统将域账户和组的信息存放在活动目录(Active Directory)中。所谓活动目录,是一个用于存放域范围的各种设置和信息的数据库(本书并没有介绍活动目录)。在默认情况下,SAM键上的安全描述符被配置成:即使管理员账户也不能访问。
HKLM\SECURITY存放了系统全局范围的安全策略和用户权限分配。HKLM\SAM被链接到HKLM\SECURITY\SAM下的SECURITY子键。在默认情况下,你不能查看HKLM\SECURITY或者HKLM\SAM\SAM键的内容,因为这些键的安全设置只允许System账户才能访问(本章后面将会极其详细地讨论System账户)。如果你想要检查这些键的话,你可以改变此安全描述符,以便允许管理员组中的用户可以读访问这些键,或者,你可以利用PsExec,在本地系统账户中运行Regedit。然而,仅仅看一眼这些数据是不会有多大用处的,因为这些数据是没有文档说明的,其中的口令已经通过一个单向映射关系加了密,也就是说,你是无法从加密形式得到一个口令的。
HKLM\SOFTWARE是Windows存储系统全局配置信息的地方,这些配置信息在系统引导的时候并不需要。而且,第三方应用程序也将它们的系统全局范围的设置存放在这里,比如应用程序文件和目录的路径、授权许可信息和过期日期信息。
HKLM\SYSTEM包含了引导系统所需要的全局配置信息,比如该加载哪些设备驱动程序、该启动哪些服务。因为这些信息对于启动系统是至关重要的,所以,Windows也在该键下维护了这份信息的一份拷贝,称为“last known good control set(最后已知的好控制集)”。由于维护了这样一份拷贝,因此,万一对当前控制集做了修改以后,系统无法正常引导了,管理员可以选择以前的一份正常工作的控制集。关于Windows何时声明当前控制集是“好”的,更详细的信息请参见本章“接受当前引导和最后已知的好控制集”一节。
HKEY_CURRENT_CONFIG
HKEY_CURRENT_CONFIG只是一个链接,指向HKLM\SYSTEM\CurrentControlSet\ HardwareProfiles\Current下的当前硬件轮廓。Windows不再支持硬件轮廓,但是该键仍然存在,以便支持那些遗留下来的、可能依赖于该键的应用程序。
HKEY_PERFORMANCE_DATA
在Windows上,注册表也是访问性能计数器值的机制,无论这些计数器是从操作系统组件中来的,还是从服务器应用程序中来的。通过注册表来访问性能计数器,一个额外的好处是,远程性能监视工作几乎可以“免费”完成,因为注册表很容易通过常规的注册表API就可以访问到。
只需打开一个名为HKEY_PERFORMANCE_DATA的特殊的键,并且查询该键下面的值,就可以直接访问注册表性能计数器信息。如果在注册表编辑器中查寻此键,是无法找到的;这个键只能通过编程的方式,利用Windows注册表函数,例如RegQueryValueEx,才可以访问到。性能信息实际上并没有存储在注册表中,注册表函数利用该键来获得从性能数据提供者那里提供的信息。
也可以利用性能数据帮助器(PDH,Performance Data Helper)API(Pdh.dIl)中的性能数据帮助器函数来访问性能计数器信息。图4.2显示了在访问性能计数器信息过程中涉及的组件。
相关文章:

[笔记]深入解析Windows操作系统《四》管理机制
文章目录 前言4.1注册表查看和修改注册表注册表用法注册表数据类型注册表逻辑结构HKEY_CURRENT_USERHKEY_USERS 实验:观察轮廓加载和卸载HKEY_CLASSES_ROOTHKEY_LOCAL_MACHINE 实验:离线方式或远程编辑BCDHKEY_CURRENT_CONFIGHKEY_PERFORMANCE_DATA 前言 本章讲述了…...

【小沐学Python】Python实现在线英语翻译功能
文章目录 1、简介2、在线翻译接口2.1 Google Translate API2.2 Microsoft Translator API2.2.1 开发简介2.2.2 开发费用2.2.3 开发API 2.3 百度翻译开放平台 API2.3.1 开发简介2.3.2 开发费用2.3.3 开发API 2.4 Tencent AI 开放平台的翻译 API2.4.1 开发简介2.4.2 开发API 2.5 …...

k8s中pod使用详解
一、前言 在之前k8s组件一篇中,我们谈到了pod这个组件,了解到pod是k8s中资源管理的最小单位,可以说Pod是整个k8s对外提供服务的最基础的个体,有必要对Pod做深入的学习和探究。 二、再看k8s架构图 为了加深对k8s中pod的理解,再来回顾下k8s的完整架构 三、pod特点 结合上面这…...

案例说明:vue中Element UI下拉列表el-option中的key、value、label含义各是什么
可以简单理解为:label 是给用户展示的东西,value是前端往后端传递的真实值 <template><div><el-page-header back"goBack" content"注册"></el-page-header><el-divider></el-divider><el-…...

idea创建javaweb项目步骤超详细(2022最新版本)
目录 前言必读 一、新建文件 1.在idea里面点击文件-新建-项目 2.新建项目-更改名称为自己想要的项目名称-创建 3.右键自己建立的项目-添加框架支持(英文版是Add Framework Support...) 4.勾选Web应用程序-确定 5.建立成功界面 二、配置tomcat 6.…...

「SAP ABAP」OPEN SQL(六)【DELETE语句 | MODIFY语句】
💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言ABAP,SQL进行任务的完成,对SAP企业管理系统,SAP ABAP开发和数据库具有较…...

SpringCloud --- Feign远程调用
一、RestTemplate问题 先来看我们以前利用RestTemplate发起远程调用的代码: 存在下面的问题: 代码可读性差,编程体验不统一参数复杂URL难以维护 Feign是一个声明式的http客户端,官方地址:GitHub - OpenFeign/feign:…...

基于单片机的数字频率计设计
数字频率计概述 数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。它是一种用十进制数字显示被测信号频率的数字测量仪器。它的基本功能是测量正弦信号,方波信号及其他各种单位时间内变化的物理量。在进行模拟、数字电路的设计、安装、调试…...

我看看哪个靓仔还没把Github Copilot用起来?
本人经常分享有价值的生产力工具、技术、好物与书籍,可关注同名公众🐭并设为🌟星标,第一时间获得更新 Github Copilot 是一个AI编程助手,其使用 OpenAI CodeX 在你的编辑器中实时建议代码或给你实现整个功能。 视频版介…...

C++系列一: C++简介
C入门简介 1. C语言的特点2. C编译器3. 第一个 C 程序4. 总结(手稿版) C 是一种高级编程语言,是C语言的扩展和改进版本,由Bjarne Stroustrup于1983年在贝尔实验室为了支持C语言中的面向对象编程而创建。C 既能够进行底层的系统编程…...

信通初试第一:无科研无竞赛一战上岸上海交大819学硕感悟
笔者来自通信考研小马哥23上交819全程班学员 信通初试第一:无科研无竞赛一战上岸上海交大819学硕感悟 原创2023-04-27 11:04通信考研小马哥 笔者来自通信考研小马哥23上交819全程班学员 本人情况: 本人是19届交本,本科成绩很差,…...

Spring —— Spring Boot 配置文件
JavaEE传送门 JavaEE Spring —— Bean 作用域和生命周期 Spring —— Spring Boot 创建和使用 目录 Spring Boot 配置文件Spring Boot 配置文件格式properties配置文件properties 基本语法properties 缺点 yml 配置文件yml 基本语法yml 配置不同类型数据及 nullyml 配置对象…...

Python 网络爬虫与数据采集(一)
Python 网络爬虫与数据采集 第1章 序章 网络爬虫基础1 爬虫基本概述1.1 爬虫是什么1.2 爬虫可以做什么1.3 爬虫的分类1.4 爬虫的基本流程1.4.1 浏览网页的流程1.4.2 爬虫的基本流程 1.5 爬虫与反爬虫1.5.1 爬虫的攻与防1.5.2 常见的反爬与反反爬 1.6 爬虫的合法性与 robots 协议…...

2023年6月DAMA-CDGP数据治理专家认证请尽快报名啦!
目前6月DAMA-CDGP数据治理认证考试开放报名地区有:北京、上海、广州、深圳、长沙、呼和浩特。 目前南京、济南、西安、杭州等地区还在接近开考人数中,打算参加6月考试的朋友们可以抓紧时间报名啦!!! 5月初,…...

STM32+esp8266,让你的STM32开发板连接网络-----esp8266
分享一下,STM32开发板连接网络的第一种方法:连接esp8266。 esp8266与STM32利用串口通信连接,esp8266连接网络,把收到的数据通过串口的方式传输给STM32,之后STM32接收到消息做出对应的反应。 使用到的开发板如图&…...
分布式缓存的基础知识
前言 现代互联网应用中,分布式缓存成为了必不可少的一环。它通过在多台服务器之间共享数据,避免了网络通信的高延迟和低带宽的性能问题。本文将介绍分布式缓存的基础知识,包括缓存机制、常见的缓存策略以及缓存的使用场景。 缓存机制 缓存是…...
Vue3通透教程【七】生命周期函数
文章目录 🌟 写在前面🌟 生命周期钩子函数🌟 组合式API生命周期🌟 写在最后🌟 写在前面 专栏介绍: 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章,应粉丝要求开始更新 Vue3 的相关技术文章,Vue 框架目前的地位大家应该都晓得,所谓三大框架使用人数最多,公司选…...
《“裸奔”时代的网络防护:如何保护你的隐私和数据安全》
一、引言 在此时此刻,你可能正在使用电子设备阅读这篇文章。你可能在一天中的大部分时间都在与网络世界互动,无论是通过电子邮件、社交媒体、在线购物,还是通过流媒体服务消费内容。然而,你有没有考虑过,当你在享受这些…...
mapreduce优化方法
1)数据输入: 1)合并小文件:在执行mr任务前将小文件进行合并,大量的小文件会产生大量的map任务,增大map任务装载次数,而 任务的装载比较耗时,从而导致 mr 运行较慢。 2)…...
06-nexus搭建Docker私仓
使用nexus创建docker私有仓库 Nexus的安装请参考该文档:https://www.yuque.com/tmfl/pom/uumrx2 Nexus配置Docker仓库步骤; nexus默认docker是失效的,需要 在security --> Realms,将docker配置成Active在 Repository 的 Blo…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...