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

Nacos-Controller 2.0:使用 Nacos 高效管理你的 K8s 配置

作者:濯光、翼严

Kubernetes 配置管理的局限

目前,在 Kubernetes 集群中,配置管理主要通过 ConfigMap 和 Secret 来实现。这两种资源允许用户将配置信息通过环境变量或者文件等方式,注入到 Pod 中。尽管 Kubernetes 提供了这些强大的工具,但在实际应用中仍存在一些挑战:

1. 历史版本管理缺失:Kubernetes 中的 ConfigMap 和 Secret 本身并不直接支持历史版本管理,更新后旧版本的配置将被覆盖,且无法直接恢复到之前的版本。如果配置更新后出现问题,无法快速回滚到之前的版本,可能导致系统不稳定或服务中断,也不利于故障排查和合规性审计。

2. 缺乏动态性:Kubernetes 原生的配置管理机制不支持实时推送配置变更,这意味着更改后的配置不会立即在应用中生效,除非重启 Pod,这导致系统的响应速度慢,灵活性差。

3. 没有灰度能力:Kubernetes 原生的配置管理机制(如 ConfigMap 和 Secret)不直接支持灰度发布。配置变更通常需要手动更新,并且会立即应用到所有相关的 Pod。

4. 安全性问题:虽然 Secret 可以用来存储敏感信息,但其安全性和访问控制仍有待加强。

Nacos 配置管理的优势

Nacos(Dynamic Naming and Configuration Service)是一个动态服务发现、配置管理和服务管理平台。它旨在帮助开发者更容易地构建云原生应用,提供了一套简单易用的特性来简化微服务架构中的服务发现、配置管理和服务管理。Nacos 在配置管理方面提供了许多高阶的管理功能,能够有效解决上述问题:

  • 历史版本管理: Nacos 支持配置的历史版本管理,您可以轻松查看和恢复到之前的配置版本。这使得回滚配置变得更加简单和可靠。
  • 统一配置管理: Nacos 提供了一个集中式的配置管理中心,可以将所有环境下的配置信息统一管理,简化了配置管理流程。通过一个直观的 Web 界面,用户可以轻松查看、编辑和管理配置
  • 动态配置更新: Nacos 支持实时推送配置变更,无需重启 Pod 即可使新的配置生效,大大提升了系统的灵活性和响应速度。
  • 灰度发布支持: Nacos 支持配置灰度发布功能,可以针对特定的服务实例或环境推送配置变更。通过 Nacos 的灰度发布功能,可以在部分实例上测试新的配置,确保其稳定后再逐步推广到所有实例。
  • 敏感信息安全存储: Nacos 提供了多层次的安全机制,包括配置加密、安全传输等,确保敏感信息的安全性。
  • 丰富的多语言支持: Nacos 提供了丰富的多语言支持,涵盖了 Java\Go\Python 无论您的微服务架构基于何种技术栈,只要它们能够接入 Nacos,就可以享受到一致性的配置管理体验。

最近,伴随着 Nacos 3.0-Beta 版本的发布,Nacos 社区发布了 Nacos-Controller 2.0 版本,它可以帮助同步 K8s 的 Service 到 Nacos,同时也支持 K8s 的 Configmap、Secret 与 Nacos 配置的双向同步。基于 Nacos-Controller 2.0,可以实现 Nacos 一键托管 K8s 配置,使用 Nacos 赋能 K8s 配置管理。接下来就让我们来看看如何使用 Nacos 来管理 K8s 配置吧。

使用 Nacos-Controller 一键托管 K8s 配置

Nacos Controller 2.0 支持 Kubernetes 集群配置和 Nacos 配置的双向同步,支持将 Kubernetes 集群特定命名空间下的 ConfigMap 以及 Secret 同步到 Nacos 指定命名空间下中。用户可以通过 Nacos 实现对于 Kubernetes 集群配置的动态修改和管理。Nacos 配置和 Kubernetes 配置的映射关系如下表所示:

ConfigMap/SecretNacos Config
Namespace用户指定的命名空间
NameGroup
KeyDataId
ValueContent

目前主要支持两种配置同步的策略:

  • 全量同步:Kubernetes 集群特定命名空间下的所有 ConfigMap 以及 Secret 自动同步至 Nacos,Nacos Controller 会自动同步所有新建的 ConfigMap 和 Secret
  • 部分同步:只同步用户指定的 ConfigMap 和 Secret 至 Nacos

部署 Nacos Controller

  1. 安装 helm,参考文档【1】

  2. 安装 Nacos Controller 到对应的 kubernetes 集群中

git clone https://github.com/nacos-group/nacos-controller.git
cd nacos-controller/charts/nacos-controllerexport KUBECONFIG=/你的K8s集群/访问凭证/文件路径
kubectl create ns nacos
helm install -n nacos nacos-controller .

快速开始

通过以下的命令,你可以快速将 kubernetes 集群中当前命名空间的配置全量同步到 Nacos 中。

cd nacos-controller
chmod +x configQuicStart.sh ./configQuicStart.sh <nacos-addr> <nacos-namespace-id>

除此之外,你还可以参照以下说明:根据自己的需要编写 DynamicConfiguration yaml 文件,并部署到 K8s 集群中。

K8s 集群命名空间配置全量同步 Nacos

  1. 编写 DynamicConfiguration yaml 文件:
apiVersion: nacos.io/v1
kind: DynamicConfiguration
metadata:name: dc-demo
spec:nacosServer:# endpoint: nacos地址服务器,与serverAddr互斥,优先级高于serverAddr,与serverAddr二选一即可endpoint: <your-nacos-server-endpoint># serverAddr: nacos地址,与endpoint二选一即可serverAddr: <your-nacos-server-addr># namespace: 用户指定的命名空间namespace: <your-nacos-namespace-id># authRef: 引用存放Nacos 客户端鉴权信息的Secret,支持用户名/密码 和 AK/SK, Nacos服务端未开启鉴权可忽略authRef:apiVersion: v1kind: Secretname: nacos-authstrategy:# scope: 同步策略,full 表示全量同步,partial 表示部分同步scope: full# 是否同步配置删除操作syncDeletion: true# conflictPolicy: 同步冲突策略,preferCluster 表示初次同步内容冲突时以Kubernetes集群配置为准,preferServer 表示以Nacos配置为准conflictPolicy: preferCluster
---
apiVersion: v1
kind: Secret
metadata:name: nacos-auth
data:#阿里云Mse Nacos采用AK SK进行鉴权accessKey: <base64 ak>secretKey: <base64 sk>#开源Nacos采用用户名密码进行鉴权username: <base64 your-nacos-username>password: <base64 your-nacos-password>
  1. 执行命令部署 DynamicConfiguration 到需要全量同步的 Kubernetes 集群命名空间下, 即可实现配置的全量同步
kubectl apply -f dc-demo.yaml -n <namespace>

K8s 集群命名空间配置部分同步 Nacos

  1. 编写 DynamicConfiguration yaml 文件,和全量同步的区别主要在于 strategy 部分,并且要指定需要同步的 ConfigMap 和 Secret:
apiVersion: nacos.io/v1
kind: DynamicConfiguration
metadata:name: dc-demo
spec:nacosServer:# endpoint: nacos地址服务器,与serverAddr互斥,优先级高于serverAddr,与serverAddr二选一即可endpoint: <your-nacos-server-endpoint># serverAddr: nacos地址,与endpoint二选一即可serverAddr: <your-nacos-server-addr># namespace: 用户指定的命名空间namespace: <your-nacos-namespace-id># authRef: 引用存放Nacos 客户端鉴权信息的Secret,支持用户名/密码 和 AK/SK, Nacos服务端未开启鉴权可忽略authRef:apiVersion: v1kind: Secretname: nacos-authstrategy:# scope: 同步策略,full 表示全量同步,partial 表示部分同步scope: partial# 是否同步配置删除操作syncDeletion: true# conflictPolicy: 同步冲突策略,preferCluster 表示初次同步内容冲突时以Kubernetes集群配置为准,preferServer 表示以Nacos配置为准conflictPolicy: preferCluster# 需要同步的ConfigMap和SecretobjectRefs:- apiVersion: v1kind: ConfigMapname: nacos-config-cm- apiVersion: v1kind: Secretname: nacos-config-secret
---
apiVersion: v1
kind: Secret
metadata:name: nacos-auth
data:accessKey: <base64 ak>secretKey: <base64 sk>username: <base64 your-nacos-username>password: <base64 your-nacos-password>
  1. 执行命令部署 DynamicConfiguration 到需要同步的 Kubernetes 集群命名空间下,即可实现配置的部分同步
kubectl apply -f dc-demo.yaml -n <namespace>

通过以上的步骤,Nacos Controller 就会根据我们提供的 DynamicConfiguration 配置信息,自动实现 K8s 集群配置和 Nacos 配置之间的全量同步或者部分同步,让我们来看看具体效果吧!

效果演示

以全量同步为例,在完成 Nacos-controller 的部署后,我们执行以下命令,查看当前 K8s 集群中默认命名空间下的 ConfigMap:

% kubectl get configmap
NAME               DATA   AGE
kube-root-ca.crt   1      63m

可以发现当前只有 kube-root-ca.crt 一个配置。

编写 DynamicConfiguration yaml 文件,选择全量同步模式,并执行命令部署:

apiVersion: nacos.io/v1
kind: DynamicConfiguration
metadata:name: dc-demo
spec:nacosServer:endpoint: nacos-serverAddrserverAddr: nacos-serverAddrnamespace: xxxxxxxxxxxxxxxxx #选择要同步到的nacos命名空间strategy:scope: fullsyncDeletion: trueconflictPolicy: preferCluster
kubectl apply -f dc-demo.yaml

查看对应的 Nacos 控制台:

可以发现对应的命名空间下面已经多了一条分组为 configmap.kube-root-ca.crt,dataId 为 ca.crt 的 Nacos 配置,对应的 K8s 配置已经同步到了 Nacos 中。

此时我们通过 kubectl 命令在 K8s 中再创建一个 ConfigMap:

apiVersion: v1
kind: ConfigMap
metadata:name: testconfignamespace: default
data:test.properties: "Hello, World"
kubectl apply -f test.yaml

查看 Nacos 控制台,可以发现命名空间下已经也多了一条对应的 Nacos 配置,dataId 为 ConfigMap 中的 Key,分组为 ConfigMap的Name:

在 Nacos 控制台上编辑对应的配置内容并发布:

通过 kubectl 查看对应的 ConfigMap 内容:

kubectl describe configmap testconfigName:         testconfig
Namespace:    default
Labels:       <none>
Annotations:  <none>Data
====
test.properties:
----
Hi, WorldBinaryData
====Events:  <none>

可以发现对应的配置内容产生了更改,Nacos 上对于配置内容的变更同步到了 K8s 集群中。

同时,通过 Nacos 的历史版本功能,还可以对历史变更操作进行溯源定位,比较每个版本之间的内容差异,并在故障发生时及时回滚:

通过 Nacos-Controller 将 K8s 集群配置托管至 Nacos,用户可以使用 Nacos 控制台对 K8s 配置进行白屏化管理,避免使用 kubectl 进行的黑屏操作。同时,在 Nacos 上可以对不同环境的配置(开发、线上、测试)进行统一的管理,历史版本功能也能帮助用户进行审计、溯源和恢复。目前,Nacos-Controller 2.0 已经和 Nacos 3.0-BETA 版本同步发布,快来体验下吧。

接入 Nacos 高阶配置管理能力

Nacos-Controller 2.0 支持将 K8s 集群配置托管至 Nacos 进行双向同步,让 K8s 配置拥有了历史版本,白屏化操作以及配置集中化管理等能力。

而如果你希望能够更加高效的对应用配置进行管理,对配置管理还有以下的更高的要求:

  • 动态配置生效: 配置的更改能够直接在应用中生效,无需重启。
  • 配置灰度发布: 配置更新上线时,先在小部分节点进行灰度验证,确认无风险后再全量推送。
  • 敏感配置安全存储: 我的配置中存储了密钥等敏感机密的信息,要保证这些信息不会泄露。
  • 配置监听查询: 我希望直观的了解有哪些节点在使用这份配置。

那我们建议你采用第二种方式:在应用中接入 Nacos sdk,即可轻松享受 Nacos 提供的以上高阶配置管理能力:

配置灰度

Nacos 支持基于 IP 的灰度发布:

正式节点监听到的内容:

receive:Hi, World

IP=192.168.255.254 的灰度节点监听到的内容:

receive:Hi, World Gray

阿里云企业版 Mse Nacos 还额外提供了更强大的多版本标签灰度的能力,欢迎了解。

配置监听查询

在 Nacos 控制台上可以轻松查看有哪些客户端监听了对应的配置

敏感信息安全传输和存储

如果敏感信息以明文形式存储或传输,容易成为黑客攻击的目标,导致数据泄露或系统被滥用。这些信息一旦泄露,可能对用户隐私、企业安全和系统稳定性造成严重影响。Nacos 配置中心支持配置加密功能,并支持 TLS 传输加密,建设了完善的零信任安全体系,可以对存放在 Nacos 上的敏感信息从存储到传输的全链路加密,大大提高安全性:

MSE Nacos 更进一步,和阿里云秘钥管理服务 KMS 合作,支持对配置进行安全等级更高的非对称加密。针对数据安全隐患,MSE Nacos 可为敏感配置提供满足国家三级等保中数据安全要求的解决方案。

应用接入 Nacos SDK

以 Java 为例,当用户没有接入 Nacos,直接通过环境变量或者文件方式去 K8s 配置变化时,一般采用轮训的方式:

String ENV_VARIABLE_NAME = "YOUR_ENV_VARIABLE_NAME"; // 替换为您的环境变量名称
String lastValue = System.getenv(ENV_VARIABLE_NAME);
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);// 每5秒检查一次环境变量的变化
executorService.scheduleAtFixedRate(() -> {String currentValue = System.getenv(ENV_VARIABLE_NAME);if (currentValue != null && !currentValue.equals(lastValue)) {System.out.println("环境变量 " + ENV_VARIABLE_NAME + " 发生变化: 从 " + lastValue + " 变为 " + currentValue);lastValue = currentValue;}
}, 0, 5, TimeUnit.SECONDS);

而只修改几行代码,就可以接入 Nacos Java sdk,享受到 Nacos 配置管理的高阶功能:

String serverAddr = "{serverAddr}";
String dataId = "{dataId}";
String group = "{group}";
Properties properties = new Properties();
# 指定Nacos的地址
properties.put("serverAddr", serverAddr);
ConfigService configService = NacosFactory.createConfigService(properties);
# 查询Nacos的配置
String content = configService.getConfig(dataId, group, 5000);
# 监听Nacos的配置
configService.addListener(dataId, group, new Listener() {@Overridepublic void receiveConfigInfo(String configInfo) {System.out.println("recieve1:" + configInfo);}@Overridepublic Executor getExecutor() {return null;}
});

而除了 Java 之外,Nacos 还提供了丰富的多语言支持,覆盖了 Go/Python 等热门编程语言,对应的开源社区也非常活跃,无论您的应用使用的是以上什么类型的编程语言,都可以采用类似的方式轻松接入,享受到 Nacos 高阶的配置管理能力。

结语

无论是使用 Nacos-Controller 实现配置的双向同步,还是直接在应用中接入 Nacos SDK 以获得更高级的配置管理特性,都能显著提升配置管理的灵活性、安全性和可维护性。使用 Nacos,您能够更好地管理和优化您的应用配置,从而提高系统的稳定性和可靠性。此外,Nacos-Controller 2.0 还支持 Nacos 服务和 K8S Service 的同步。近期,Nacos 3.0-BETA 版本也已经重磅发布,在安全性方面显著提升,同时增加了分布式锁,模糊订阅等新特性,欢迎各位体验使用。

安装 helm,参考文档https://helm.sh/docs/intro/install/

相关链接

[1] Nacos 官网

https://nacos.io

[2] Nacos Github 主仓库

https://github.com/alibaba/nacos

[3] 生态组仓库

https://github.com/nacos-group

[4] MSE 配置灰度发布

https://help.aliyun.com/zh/mse/user-guide/configure-canary-release

Nacos 多语言生态仓库:

[1] Nacos-GO-SDK

https://github.com/nacos-group/nacos-sdk-go

[2] Nacos-Python-SDK

https://github.com/nacos-group/nacos-sdk-python

[3] Nacos-Rust-SDK

https://github.com/nacos-group/nacos-sdk-rust

[4] Nacos C# SDK

https://github.com/nacos-group/nacos-sdk-csharp

[5] Nacos C++ SDK

https://github.com/nacos-group/nacos-sdk-cpp

[6] Nacos PHP-SDK

https://github.com/nacos-group/nacos-sdk-php

[7] Rust Nacos Server

https://github.com/nacos-group/r-nacos

相关文章:

Nacos-Controller 2.0:使用 Nacos 高效管理你的 K8s 配置

作者&#xff1a;濯光、翼严 Kubernetes 配置管理的局限 目前&#xff0c;在 Kubernetes 集群中&#xff0c;配置管理主要通过 ConfigMap 和 Secret 来实现。这两种资源允许用户将配置信息通过环境变量或者文件等方式&#xff0c;注入到 Pod 中。尽管 Kubernetes 提供了这些强…...

特殊文件以及日志——特殊文件

一、特殊文件 必要性&#xff1a;可以用于存储多个用户的&#xff1a;用户名、密码。这些有关系的数据都可以用特殊文件来存储&#xff0c;然后作为信息进行传输。 1. 属性文件.properties&#xff08;键值对&#xff09; &#xff08;1&#xff09;特点&#xff1a; 都只能…...

Spark-SQL核心编程语言

利用IDEA开发spark-SQL 创建spark-SQL测试代码 自定义函数UDF 自定义聚合函数UDAF 强类型的 Dataset 和弱类型的 DataFrame 都提供了相关的聚合函数&#xff0c; 如 count()&#xff0c; countDistinct()&#xff0c;avg()&#xff0c;max()&#xff0c;min()。除此之外&…...

jdk 安装

oracle官网 : Java Archive | Oracle 中国 export JAVA_HOME/Users/xxxxx/app/services/x86jdk/jdk1.8.0_431.jdk/Contents/Home export PATH$JAVA_HOME/bin:$PATH 华为镜像网站&#xff1a;Index of java-local/jdk...

Missashe考研日记-day21

Missashe考研日记-day21 1 专业课408 学习时间&#xff1a;4h学习内容&#xff1a; 今天先把昨天学的内容的课后习题做了&#xff0c;整整75道啊&#xff0c;然后学了OS第二章关于CPU调度部分的内容&#xff0c;这第二章太重要了&#xff0c;以至于每一小节的内容都比较多&am…...

双重路由引入的环路,选路次优的产生以及解决方法

描述 在R2,R3上双向引入ospf,以及rip,R5修改静态的优先级为180,在ospf中引入该静态路由 路由分析 选路次优问题 R5引入了静态路由,优先级是150 R2->R5->100.1.1.0,优先级是150 R3->R4->100.1.1.0,优先级是150 R3->R4->R5->100.1.1.0,优先级是150 R2-…...

环境变量概念以及获取环境变量(linux下解析)

目录 1 基本概念 2 常见的环境变量 3 查看环境变量方法 4 和环境变量相关的命令 5 环境变量的组织方式 6 通过代码如何获取环境变量 6.1 命令行参数 6.2 环境变量 7 通过系统调用获取或设置环境变量 1 基本概念 环境变量(environmentvariables)⼀般是指在操作系统中用来指…...

删除win11电脑上的阿尔巴尼亚输入法SQI

删除电脑自带的阿尔巴尼亚输入法 这个输入法在系统中并不显示&#xff0c;但是有时候会出现在右下角显示&#xff0c;删除这个输入法的流程如下&#xff0c;暂时没发现反复&#xff01; 第一步&#xff1a;打开注册表&#xff1a; winR打开运行&#xff0c;输入 regedit 第二…...

目标检测与分割:深度学习在视觉中的应用

&#x1f50d; PART 1&#xff1a;目标检测&#xff08;Object Detection&#xff09; 1️⃣ 什么是目标检测&#xff1f; 目标检测是计算机视觉中的一个任务&#xff0c;目标是让模型“在图像中找到物体”&#xff0c;并且判断&#xff1a; 它是什么类别&#xff08;classif…...

npm和npx的作用和区别

npx 和 npm 是 Node.js 生态系统中两个常用的工具&#xff0c;它们有不同的作用和使用场景。 1. npm&#xff08;Node Package Manager&#xff09; 作用&#xff1a; npm 是 Node.js 的包管理工具&#xff0c;主要用于&#xff1a; 安装、卸载、更新项目依赖&#xff08;包&a…...

OpenCV 图形API(36)图像滤波-----形态学操作函数morphologyEx()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 执行高级形态学变换。 该函数可以使用腐蚀和膨胀作为基本操作来执行高级形态学变换。 任何操作都可以原地进行。在处理多通道图像时&#xff0c;…...

Python入门到精通6:CSS网页美化入门1

CSS&#xff08;层叠样式表&#xff09;是网页设计的核心语言之一&#xff0c;它让我们的网页从单调的结构变得生动美观。今天&#xff0c;我将带大家快速了解CSS的基础知识&#xff0c;包括基本概念、引入方式、选择器、字体与文本样式以及调试工具的使用。 1. CSS基本概念 …...

【深入C++多态:基于消息解析器的设计、实现与剖析】

深入C多态&#xff1a;基于消息解析器的设计、实现与剖析 前言多态代码示例代码结构C多态的核心知识点多态的底层机制深入剖析多态的设计模式总结 前言 在C面向对象编程中&#xff0c;多态&#xff08;Polymorphism&#xff09;是实现灵活性和扩展性的核心特性&#xff0c;允许…...

Dockerfile 文件常见命令及其作用

Dockerfile 文件包含一系列命令语句&#xff0c;用于定义 Docker 镜像的内容、配置和构建过程。以下是一些常见的命令及其作用&#xff1a; FROM&#xff1a;指定基础镜像&#xff0c;后续的操作都将基于该镜像进行。例如&#xff0c;FROM python:3.9-slim-buster 表示使用 Pyt…...

Redis--持久化

一、持久化 Redis支持RDB和AOF两种持久化机制持久化功能有效地避免因进程退出造成数据丢失问题&#xff0c; 当下次重启时利用之前持久化的文件即可实现数据恢复。 二、RDB RDB 持久化是把当前进程数据⽣成快照保存到硬盘的过程&#xff0c;触发 RDB 持久化过程分为手动触发和…...

Markdown学习

Typora下载 Typora教程 标题 井号加空格——回车即可形成标题&#xff0c;几级标题几个井号。 字体 斜体——前后各一个*&#xff0c;回车 粗体——前后各两个*&#xff0c;回车 既斜体又粗体——前后各三个*&#xff0c;回车 删除线——前后各两个~&#xff08;波浪号…...

Vulhub-DarkHole靶机通关攻略

下载链接&#xff1a;https://www.vulnhub.com/entry/darkhole-1,724/ 扫描ip arp-scan -l扫描端口 nmap 192.168.112.144 -p-扫描目录 dirsearch -u http://192.168.112.144/有一个登录页面&#xff0c;还有一个upload目录&#xff0c;但是还没有找到上传点 先注册一个用…...

UniRig ,清华联合 VAST 开源的通用自动骨骼绑定框架

UniRig是清华大学计算机系与VAST联合开发的前沿自动骨骼绑定框架&#xff0c;专为处理复杂且多样化的3D模型而设计。基于强大的自回归模型和骨骼点交叉注意力机制&#xff0c;UniRig能够生成高质量的骨骼结构和精确的蒙皮权重&#xff0c;大幅提升动画制作的效率和质量。 UniR…...

深入解析 sklearn 中的 LabelEncoder:功能、使用场景与注意事项

标题&#xff1a;深入解析 sklearn 中的 LabelEncoder&#xff1a;功能、使用场景与注意事项 摘要&#xff1a; LabelEncoder 是 sklearn 中用于类别标签编码的重要工具&#xff0c;能够将离散的类别型标签转换为模型可识别的数值格式。本文详细解析 LabelEncoder 的核心功能…...

红帽Linux网页访问问题

配置网络&#xff0c;手动配置 搭建yum仓库红帽Linux网页访问问题 下载httpd 网页访问问题&#xff1a;首先看httpd的状态---selinux的工作模式&#xff08;强制&#xff09;---上下文类型(semanage-fcontext)---selinux端口有没有放行semanage port ---防火墙有没有active---…...

Muduo库代码剖析 : EventLoop

本文初发于 “天目中云的小站”&#xff0c;同步转载于此 EventLoop 详解 EventLoop类似于Reactor模型中的反应堆(Reactor)和事件分发器(Demultiplex)的合并, 其目的在于高效的接收事件, 并正确分配给对应的事件处理器. EventLoop中有两类关键的子控件 : Channel 和 Poller. C…...

Python网络爬虫设计(一)

目录 一、网络爬虫 1、基本的爬虫 2、获取URL 3、查找网页源码关键字 4、代码实现 二、requests库 1、requests的优势和劣势 2、获取网页的其他库 &#xff08;1&#xff09;selenium库 &#xff08;2&#xff09;pyppeteer库 三、pyppeteer库 1、pyppeteer库的来历…...

GEO供应商盈达科技发布:AI信源占位白皮书​

​​副标题&#xff1a;生成式AI时代的企业认知主权争夺战​​ ​​发布日期&#xff1a;2025年4月15日​​ ​​一、范式重构&#xff1a;从流量入口到认知主权的战略迁移​​ ​​生成式AI的规则革命​​ ​​73%的用户决策​​直接依赖AI生成内容&#xff0c;但​​68%的引…...

L1-4 拯救外星人

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

业务摆渡解锁信息孤岛,重塑数字医疗未来

某三甲医院的急诊科突然亮起红灯&#xff0c;一名车祸患者被紧急送入&#xff0c;主治医师需要调取其三个月前在科研专网存储的增强CT影像。若在两年前&#xff0c;这需要两位管理员手动导出、杀毒、跨网传输&#xff0c;耗时40分钟&#xff1b;而现在&#xff0c;系统自动触发…...

OpenCV中的轮廓近似方法详解

文章目录 引言一、什么是轮廓近似&#xff1f;二、OpenCV中的轮廓近似方法2.1Douglas-Peucker算法原理2.2函数原型 三、代码示例3.1. 基本使用 四、参数选择技巧五、与其他轮廓方法的比较六、总结 引言 在计算机视觉和图像处理中&#xff0c;轮廓是物体边界的重要表示形式。Op…...

4种方法将文件映射到内存提升读写速度

背景 考虑到以下应用需求&#xff0c;常将文件映射到内容&#xff0c;以提升读写效果。 高效文件读写&#xff1a;大文件操作时&#xff0c;避免多次read/write系统调用的开销。进程间通信&#xff08;共享内存&#xff09;&#xff1a;多个进程映射同一文件&#xff0c;实现…...

367. 有效的完全平方数

给你一个正整数 num 。如果 num 是一个完全平方数&#xff0c;则返回 true &#xff0c;否则返回 false 。 完全平方数 是一个可以写成某个整数的平方的整数。换句话说&#xff0c;它可以写成某个整数和自身的乘积。 不能使用任何内置的库函数&#xff0c;如 sqrt 。 示例 1…...

Ubuntu2404装机指南

因为原来的2204升级到2404后直接嘎了&#xff0c;于是要重新装一下Ubuntu2404 Ubuntu系统下载 | Ubuntuhttps://cn.ubuntu.com/download我使用的是balenaEtcher将iso文件烧录进U盘后&#xff0c;使用u盘安装&#xff0c;默认选的英文版本&#xff0c; 安装后&#xff0c;安装…...

爬虫框架 - Coocan

安装 pip install coocan 演示...

S06-Kep的跨通道传输

每次分享一小点&#xff0c;进步都是实实在在。小编今天又来分享了&#xff01;之前我们讲到的KepServer软件&#xff0c;是一个具备强大通讯能力的软件&#xff0c;但是当你的上位软件不够灵活的时候&#xff0c;又有多个通道的数据交互的需求&#xff0c;Kep的跨通道传输就为…...

Zookeeper单机三节点集群部署(docker-compose方式)

前提: 服务器需要有docker镜像zookeeper:3.9.3 或能连网拉取镜像 服务器上面新建文件夹: mkdir -p /data/zk-cluster/{data,zoo-cfg} 创建三个zookeeper配置文件zoo1.cfg、zoo2.cfg、zoo3.cfg,配置文件里面内容如下(三个文件内容一样): tickTime=2000 initLimit=10 …...

C++| 深入剖析std::list底层实现:链表结构与内存管理机制

引言 std::list的底层实现基于双向链表&#xff0c;其设计哲学与std::vector截然不同。本文将深入探讨其节点结构、内存分配策略及迭代器实现原理&#xff0c;揭示链表的性能优势和潜在代价。 1. 底层数据结构&#xff1a;双向链表 每个std::list节点包含&#xff1a; 数据域…...

mysql数据库的线程连接数、状态 、最大并发数、缓存等参数配置

mysql数据库的线程连接数、状态 、最大并发数、缓存等参数配置 https://www.modb.pro/db/1784385883449397248 mysql数据库的线程连接数、状态 、最大并发数、缓存等参数配置 SQL命令行临时设置操作 #查看mysql数据库的线程连接数&#xff1a; mysql> show global statu…...

HarmonyOS-ArkUI V2状态-PersistenceV2:持久化存储UI状态

PersistenceV2类是一个与AppStorageV2类用法非常相似的类。因为它俩是子类和父类的关系。如果不了解AppStorageV2,可以先跳转至了解一下这个类。 HarmonyOS-ArkUI V2工具类:AppStorageV2:应用全局UI状态存储-CSDN博客 PersistenceV2相比于其父类AppStorageV2而言,它存储的…...

App测试小工具

前言 最近app测试比较多&#xff0c;每次都得手动输入日志tag&#xff0c;手动安装&#xff0c;测完又去卸载&#xff0c;太麻烦。就搞了小工具使用。 效果预览 每次测试完成&#xff0c;点击退出本次测试&#xff0c;就直接卸载了&#xff0c;usb插下一个手机又可以继续测了…...

ZEP: 一种用于智能体记忆的时序知识图谱架构

摘要 我们介绍了Zep,一种新型的智能体记忆层服务,在深度记忆检索(DMR)基准测试中,超越了现有的最先进系统MemGPT。此外,Zep在比DMR更全面、更具挑战性的评估中表现优异,这些评估更好地反映了现实世界企业应用的需求。尽管现有的基于大语言模型(LLM)的检索增强生成(R…...

800 中值定理

文章目录 前言365366367368369370371372373总结 前言 中值定理貌似是压轴题&#xff0c;但是也没什么难的&#xff0c;我一定可以拿下。 background music : 《还是分开》张叶蕾 365 构造出罗尔定理需要的 F(x) 我现在没啥问题&#xff0c;然后就是要找出两个相等的点&…...

安装fvm可以让电脑同时管理多个版本的flutter、flutter常用命令、vscode连接模拟器

打开 PowerShellfvm安装 dart pub global activate fvm安装完成后&#xff0c;如果显示FVM无法识别&#xff0c;那么需要去添加环境变量path添加这个&#xff1a;C:\Users\Administrator\AppData\Local\Pub\Cache\bin 常用命令 fvm releases 查看用户可以装的flutter版本fvm l…...

多线程、JUC——面试问题自我总结

1、创建线程有几种方式 答&#xff1a;1、通过继承Thread类&#xff0c;但需要注意的是一个类继承Thread就不能继承其他的类了 2、实现Runnable接口 3、实现Callable接口&#xff0c;重写Call方法 4、线程池 2、线程状态是怎么转换 3、实现线程的方式Callable与Runnable区别 …...

LivePortrait 使用指南:让静态照片“动”起来的魔法工具

欢迎来到涛涛聊AI,先看效果 项目地址:https://github.com/KwaiVGI/LivePortrait 在人工智能技术飞速发展的今天,静态照片的“动态化”已成为数字创意领域的热门方向。LivePortrait 凭借其高效性、可控性和逼真效果,成为用户将照片转化为动态视频的首选方案。本文将从技术原…...

Aosp13 文件应用点击apk无反应的处理

最近遇到一个问题&#xff0c;在A13上&#xff0c;打开文件管理应用时&#xff0c;点击apk 无反应或者启动安装进程后安装完成或取消安装进程&#xff0c;再次点击apk 无反应。在此记录该问题。 做一下修改&#xff1a;root/package/ providers/DownloadProvider/下 jenkinsdel…...

用python比较两个mp4是否实质相同

下面这个脚本会使用 ffmpeg 和 ffprobe 检查两个视频文件在以下方面是否“实质相同”&#xff1a; ✅ 检查内容&#xff1a; 分辨率&#xff08;宽高&#xff09;帧率视频总帧数音频轨道数量和采样率视频时长视频帧哈希&#xff08;可选&#xff09; — 对比前 N 帧的图像感知…...

jmeter中文使用手册

1. 简介 Apache J JMeter 是 100%纯 java 桌面应用程序&#xff0c;被设计用来测试 C/S 结构的软件&#xff08;例如 web 应用程序&#xff09;。它可以被用来测试包括基于静态和动态资源程序的性能&#xff0c;例如静态文件&#xff0c;Java Servlets&#xff0c;Java 对象&a…...

【Linux】系统入门

【Linux】系统初识 起源开源 闭源版本内核内核编号 Linux的安装双系统(不推荐)WindowsLinuxvmware虚拟机vitualbox操作系统的镜像centos 7/ubuntu云服务器租用 Linux的操作lsmkdir 文件名pwdadduser userdel -rrm文件名cat /proc/cpuinfolinux支持编程vim code.c./a.out 运行程…...

DP34 【模板】前缀和 -- 前缀和

目录 一&#xff1a;题目 二&#xff1a;算法原理 三&#xff1a;代码实现 一&#xff1a;题目 题目链接&#xff1a;【模板】前缀和_牛客题霸_牛客网 二&#xff1a;算法原理 三&#xff1a;代码实现 #include <iostream> #include <vector> using namespac…...

2025年机动车授权签字人考试题库及答案

一、单选题 1、汽车一般由发动机、(  )、车身、电气和电子设备四大部分组成。 A、底盘 B、变速箱 C、离合器 D、驾驶室 答案&#xff1a; A 2、轮式汽车的驱动形式常用符号"nm"表示,其中n代表车轮总数,m代表 (  )。 A、…...

【项目】构建高性能多线程内存池:简化版 tcmalloc 实现指南

00 引言 在高并发应用中&#xff0c;频繁的小块内存申请与释放不仅会带来性能瓶颈&#xff0c;还容易导致内存碎片问题。为此&#xff0c;内存池技术应运而生&#xff0c;而 tcmalloc&#xff08;Thread-Caching Malloc&#xff09;作为 Google 开源的高性能内存分配器&#x…...

C++23 Lambda 表达式上的属性:P2173R1 深度解析

文章目录 一、背景与动机&#xff08;一&#xff09;Lambda 表达式的发展历程&#xff08;二&#xff09;属性的重要性&#xff08;三&#xff09;P2173R1 提案的动机 二、语法与使用&#xff08;一&#xff09;属性的放置位置1. 普通 Lambda 表达式2. 泛型 Lambda 表达式3. 多…...

libaom 码率控制实验:从理论到实践的深度探索

libaom 码率控制模式介绍 在 libaom 中定义了四种码率控制模式&#xff0c;分别是 VBR、CBR、CQ、Q&#xff1b;枚举类型会被用在编码器配置结构体 aom_codec_enc_cfg 中&#xff0c;通过 rc_end_usage 字段来设置编码器的码率控制策略。具体应用范围如下&#xff1a; AOM_VBR…...