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

K8S Ingress 实现金丝雀(灰度)发布

假设有如下三个节点的 K8S 集群:

k8s31master 是控制节点

k8s31node1、k8s31node2 是工作节点

容器运行时是 containerd

一、场景分析

阅读本文,默认您已经安装了 Ingress Nginx。

1)A/B 测试

A/B 测试基于用户请求的元信息将流量路由到新版本,这是一种基于请求内容匹配的灰度发布策略。只有匹配特定规则的请求才会被引流到新版本,常见的做法包括基于 HTTP Header 和Cookie。基于 HTTP Header 方式,例如 User-Agent 的值为 Android 的请求(来自安卓系统的请求)可以访问新版本,其他系统仍然访问旧版本。基于 Cookie 方式,Cookie 中通常包含具有业务语义的用户信息,例如普通用户可以访问新版本,VIP 用户仍然访问旧版本。

如下图所示,某服务当前版本为v1,现在新版本v2要上线。希望安卓用户可以尝鲜新功能,其他系统用户保持不变。

通过在监控平台观察旧版本与新版本的成功率、RT对比,当新版本整体服务符合预期后,即可将所有请求切换到新版本v2,最后为了节省资源,可以逐步下线到旧版本v1。

在 K8S 中,可以利用 Ingress Nginx 基于 Header 或 Cookie 进行流量切分的策略来实现 A/B 测试发布。业务使用 Header 或 Cookie 来标识不同类型的用户,我们通过配置 Ingress 来实现让带有指定 Header 或 Cookie 的请求被转发到新版本,其它的仍然转发到旧版本,从而实现将新版本灰度给部分用户。

2)金丝雀发布

金丝雀发布是将少量的请求引流到新版本上,因此部署新版本服务只需极小数的实例。验证新版本符合预期后,逐步调整流量权重比例,使得流量慢慢从老版本迁移至新版本,期间可以根据设置的流量比例,对新版本服务进行扩容,同时对老版本服务进行缩容,使得底层资源得到最大化利用。

如下图所示,某服务当前版本为 v1,现在新版本 v2 要上线。为确保流量在服务升级过程中平稳无损,采用金丝雀发布方案,逐步将流量从老版本迁移至新版本。

 在 K8S 中,可以利用 Ingress Nginx 基于权重进行流量切分的策略来实现金丝雀发布。先切一部分的流量到新版本,然后对新版本进行监控,等观察一段时间稳定后再逐渐加大新版本的流量比例直至完全替换旧版本,最后再平滑下线旧版本,从而实现流量的定向分配。

二、注解介绍

Ingress Nginx 是一个 K8S Ingress 工具,支持配置 Ingress Annotations 来实现不同场景下的灰度发布和测试。

  • 前提:
# 注解的键和值只能是字符串。其他类型,如布尔值或数值,必须加引号,例如:"true"、"false"、"100"。
# 开启灰度发布
nginx.ingress.kubernetes.io/canary: "true"
  •  Ingress Nginx Annotations 支持以下几种 Canary 规则:

nginx.ingress.kubernetes.io/canary-by-header:利用请求头,通知 Ingress 将请求路由到 Canary Ingress 中指定的服务。当请求头部设置为 always 时,请求将被路由到金丝雀版本。当头部设置为 never 时,请求永远不会被路由到金丝雀版本。对于任何其他值,头部将被忽略,请求将根据优先级与其他金丝雀规则进行比较。

nginx.ingress.kubernetes.io/canary-by-header-value:利用请求头值,通知 Ingress 将请求路由到 Canary Ingress 中指定的服务。当请求头设置为该值时,请求将被路由到金丝雀版本。对于任何其他头值,将忽略该头,并按照优先级与其他金丝雀规则进行比较。此注解必须配合使用 nginx.ingress.kubernetes.io/canary-by-header。这个注解是nginx.ingress.kubernetes.io/canary-by-header 的扩展,允许自定义请求头值而不是使用硬编码值。如果未定义 nginx.ingress.kubernetes.io/canary-by-header 注解,则它没有任何效果。

nginx.ingress.kubernetes.io/canary-by-header-pattern: 这个注解的作用与 canary-by-header-value 相同,但它使用的是 PCRE 正则表达式匹配。注意,当设置了 canary-by-header-value 时,这个注解将被忽略。如果给定的正则表达式在请求处理过程中导致错误,该请求将被认为不匹配。

nginx.ingress.kubernetes.io/canary-by-cookie:利用 cookie,通知 Ingress 将请求路由到 Canary Ingress 中指定的服务。当 cookie 值设置为 always 时,请求将始终路由到金丝雀版本。当 cookie 设置为 never 时,请求永远不会路由到金丝雀版本。对于任何其他值,将忽略 cookie,并根据优先级将请求与其他金丝雀规则进行比较。

nginx.ingress.kubernetes.io/canary-weight:整数(0-)百分比的随机请求将会被路由到金丝雀 Ingress 中指定的服务。权重为 0 表示该金丝雀规则不会将任何请求发送到金丝雀 Ingress 中的服务。权重为 <weight-total> 表示所有请求都将发送到 Ingress 中指定的备用服务。 <weight-total> 默认为 100,可以通过 nginx.ingress.kubernetes.io/canary-weight-total 进行增加。

nginx.ingress.kubernetes.io/canary-weight-total:流量的总权重。如果未指定,默认为 100。

金丝雀规则的评估顺序遵循优先级

优先级顺序如下:按头部信息金丝雀 -> 按Cookie金丝雀 -> 权重金丝雀

三、实验准备

  • 镜像下载

[root@k8s31node1 ~]# ctr -n=k8s.io images pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/openresty/openresty:latest
[root@k8s31node1 ~]# ctr -n=k8s.io images tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/openresty/openresty:latest  docker.io/openresty/openresty:latest[root@k8s31node2 ~]# ctr -n=k8s.io images pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/openresty/openresty:latest
[root@k8s31node2 ~]# ctr -n=k8s.io images tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/openresty/openresty:latest  docker.io/openresty/openresty:latest
  •  部署 v1

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-v1
spec:replicas: 1selector:matchLabels:app: nginxversion: v1template:metadata:labels:app: nginxversion: v1spec:containers:- name: nginximage: "openresty/openresty:latest"imagePullPolicy: IfNotPresentports:- name: httpprotocol: TCPcontainerPort: 80volumeMounts:- mountPath: /usr/local/openresty/nginx/conf/nginx.confname: configsubPath: nginx.confvolumes:- name: configconfigMap:name: nginx-v1
---
apiVersion: v1
kind: ConfigMap
metadata:labels:app: nginxversion: v1name: nginx-v1
data:nginx.conf: |-worker_processes  1;events {accept_mutex on;multi_accept on;use epoll;worker_connections  1024;}http {ignore_invalid_headers off;server {listen 80;location / {access_by_lua 'local header_str = ngx.say("nginx-v1")';}}}
---
apiVersion: v1
kind: Service
metadata:name: nginx-v1
spec:type: ClusterIPports:- port: 80protocol: TCPname: httpselector:app: nginxversion: v1

该 yml 定义了三个资源 ConfigMap、Deployment、Service。

  • ConfigMap 定义了一个 nginx.conf 配置文件,使用 lua 脚本输出 nginx-v1。
  • Deployment 定义了一个 Pod,里面运行 openresty 它是一个封装了 nginx+lua 的 web 服务器。Pod 有两个标签 app: nginx、version: v1。
  • Service 代理了 Deployment 运行的 Pod。

部署 v2

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-v2
spec:replicas: 1selector:matchLabels:app: nginxversion: v2template:metadata:labels:app: nginxversion: v2spec:containers:- name: nginximage: "openresty/openresty:latest"imagePullPolicy: IfNotPresentports:- name: httpprotocol: TCPcontainerPort: 80volumeMounts:- mountPath: /usr/local/openresty/nginx/conf/nginx.confname: configsubPath: nginx.confvolumes:- name: configconfigMap:name: nginx-v2
---
apiVersion: v1
kind: ConfigMap
metadata:labels:app: nginxversion: v2name: nginx-v2
data:nginx.conf: |-worker_processes  1;events {accept_mutex on;multi_accept on;use epoll;worker_connections  1024;}http {ignore_invalid_headers off;server {listen 80;location / {access_by_lua 'local header_str = ngx.say("nginx-v2")';}}}
---
apiVersion: v1
kind: Service
metadata:name: nginx-v2
spec:type: ClusterIPports:- port: 80protocol: TCPname: httpselector:app: nginxversion: v2

 创建 v1 ingress

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx
spec:ingressClassName: nginxrules:- host: canary.example.comhttp:paths:- path: /          pathType:  Prefixbackend:  #配置后端服务service:name: nginx-v1port:number: 80

 对外暴露域名 canary.example.com 访问。

修改本机 hosts

192.168.40.20 canary.example.com 

 浏览器访问

四、实战

1)nginx.ingress.kubernetes.io/canary-by-header

  • 创建 v2 ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:annotations:nginx.ingress.kubernetes.io/canary: "true" # 开启金丝雀nginx.ingress.kubernetes.io/canary-by-header: "Canary"name: nginx-canary
spec:ingressClassName: nginxrules:- host: canary.example.comhttp:paths:- path: /pathType:  Prefixbackend:  #配置后端服务service:name: nginx-v2port:number: 80

现在系统里面有两个 ingress,一个 v1 版本,一个 v2 金丝雀版本。 

注意:

ingress 要 ADDRESS 那一栏出来才能访问。

curl -H "Host: canary.example.com" -H "Canary: always" 192.168.40.20

请求头参数 Canary 匹配 always,走金丝雀版本服务。

请求头参数 Canary 不匹配 always,走 v1 服务。

2) nginx.ingress.kubernetes.io/canary-by-header-value

删掉上一个 ingress,以免干扰下面实验。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:annotations:nginx.ingress.kubernetes.io/canary: "true"nginx.ingress.kubernetes.io/canary-by-header: "Canary"nginx.ingress.kubernetes.io/canary-by-header-value: "v2"name: nginx-canary
spec:ingressClassName: nginxrules:- host: canary.example.comhttp:paths:- path: /pathType:  Prefixbackend:  #配置后端服务service:name: nginx-v2port:number: 80

 请求头参数 Canary 匹配 v2,走金丝雀版本服务。

curl -H "Host: canary.example.com" -H "Canary: v1" 192.168.40.20

 3) nginx.ingress.kubernetes.io/canary-by-header-pattern

删掉上一个 ingress,以免干扰下面实验。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:annotations:nginx.ingress.kubernetes.io/canary: "true"nginx.ingress.kubernetes.io/canary-by-header: "Canary"nginx.ingress.kubernetes.io/canary-by-header-pattern: "v2|v3" # 匹配v2或v3name: nginx-canary
spec:ingressClassName: nginxrules:- host: canary.example.comhttp:paths:- path: /pathType:  Prefixbackend:  #配置后端服务service:name: nginx-v2port:number: 80

 请求头参数 Canary 匹配 v2 或 v3,走金丝雀版本服务。

curl -H "Host: canary.example.com" -H "Canary: v1" 192.168.40.20

 4)nginx.ingress.kubernetes.io/canary-by-cookie

删掉上一个 ingress,以免干扰下面实验。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:annotations:nginx.ingress.kubernetes.io/canary: "true"nginx.ingress.kubernetes.io/canary-by-cookie: "Canary"name: nginx-canary
spec:ingressClassName: nginxrules:- host: canary.example.comhttp:paths:- path: /pathType:  Prefixbackend:  #配置后端服务service:name: nginx-v2port:number: 80

cookie 参数 Canary 匹配 always,走金丝雀版本服务。

cookie 参数 Canary 不匹配 always,走 v1 服务。

curl -H "Host: canary.example.com" -H "Cookie: Canary=always" 192.168.40.20

5)nginx.ingress.kubernetes.io/canary-weight

 删掉上一个 ingress,以免干扰下面实验。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:annotations:nginx.ingress.kubernetes.io/canary: "true"nginx.ingress.kubernetes.io/canary-weight: "10"name: nginx-canary
spec:ingressClassName: nginxrules:- host: canary.example.comhttp:paths:- path: /pathType:  Prefixbackend:  #配置后端服务service:name: nginx-v2port:number: 80

10%的流量打到金丝雀服务。

for i in {1..10}; do curl -H "Host: canary.example.com" 192.168.40.20; done;

五、金丝雀比较

实现金丝雀发布的方式有很多,从Java程序员的角度来看,就有:

基于 Spring Cloud Gateway 路由断言工厂、基于 Nginx、基于 K8S Deployment 伪金丝雀、基于 Ingress Nginx 注解、基于 Istio 流量切分。

基于 Spring Cloud Gateway 路由断言工厂:路由规则变化很难做到实时响应,要实现实时响应代码实现复杂。

基于 Nginx:要有很多的配置。

基于 K8S Deployment 伪金丝雀:没有实现流量的切分。

基于 Istio 流量切分:技术栈门槛高。需要对于服务网格的一整套有所了解。

综上来看,基于 Ingress Nginx 注解 是配置最简单的方式了。

相关文章:

K8S Ingress 实现金丝雀(灰度)发布

假设有如下三个节点的 K8S 集群&#xff1a; ​ k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、场景分析 阅读本文&#xff0c;默认您已经安装了 Ingress Nginx。 1&#xff09;A/B 测试 A/B 测试基于用户请求的元信息将流量路由…...

Python笔记:在环境变量中增加了dll加载路径,python提示DLL加载失败

在环境变量中增加了dll加载路径&#xff0c;python提示DLL加载失败 1.问题描述 from PySide2 import QtCore 提示如下错误 ImportError: DLL load failed while importing QtCore: 找不到指定的模块。 2.问题原因 在Python3.8文档中的What’s New In Python 3.8找到如下说明…...

WinFrom 使用 LiveCharts 实现动态折线图

上方是Winfrom使用LiveCharts 插件实现的动态折线图&#xff0c;下面是实现步骤。 一、创建新项目 我这里使用的是.Net Framework4.6.1版本 二、添加引用包 这样就代表安装完成了 三、引用控件 四、逻辑代码 using LiveCharts.Defaults; using LiveCharts.Wpf; using Syst…...

Deep Learning(手写字识别 - CNN)

Deep Learning&#xff08;手写字识别&#xff09; 数据集&#xff08;MNIST&#xff09;基于 PyTorch 深度学习框架使用 CNN 算法进行手写字识别案例参考教程 数据集&#xff08;MNIST&#xff09; 数据集 Github 官网&#xff08;注&#xff1a;不知为何官网无法直接下载数据…...

HDD 安全擦除:何时以及如何在 Windows PC 上安全擦除硬盘

HDD 安全擦除是一种从硬盘驱动器 (HDD) 中永久删除所有数据的方法&#xff0c;其方式几乎无法恢复。那么&#xff0c;什么时候需要在 Windows 11/10/8/7 上安全擦除硬盘驱动器&#xff1f;如何安全地擦除硬盘驱动器&#xff1f;幸运的是&#xff0c;所有的答案都在本指南中。继…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】附录-B. 错误代码与解决方案

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 附录B. PostgreSQL错误代码与解决方案速查表一、错误代码分类速查表二、常见错误代码详解三、错误排查方法论四、错误预防最佳实践五、典型错误场景解决方案六、官方资源与工…...

3DMAX脚本病毒Spy CA查杀方法

什么是Spy CA病毒&#xff1f; Spy CA是一种新型病毒&#xff0c;可以与从在线资源或3D商店下载的第三方3D模型一起下载该病毒。 该病毒是一种Maxscript代码&#xff0c;写入对象的自定义属性&#xff0c;并在打开场景、合并模型或操纵对象时执行。 通过对带有该病毒的场景做…...

联排半孔PCB如何进行SMT贴片?

在印刷电路板业务中&#xff0c;有两种将元件安装到电路板上的主要方法:联排半孔安装和表面安装。联排半孔安装是较老的技术&#xff0c;要求电路板制造商在PCB上钻孔并将引线插入孔中。最近&#xff0c;表面安装技术已经接管了该领域。 联排半孔元件 联排半孔元件有两种引线&a…...

CSS Grid布局:从入门到实战

CSS Grid布局&#xff1a;从入门到实战 一、初识Grid布局 还在为网页布局发愁吗&#xff1f;Flexbox虽然好用&#xff0c;但当遇到复杂布局时&#xff0c;CSS Grid才是真正的王者。Grid布局是CSS中最强大的二维布局系统&#xff0c;它就像一张无形的网格纸&#xff0c;让我们…...

小说所有设定(v3.0 preview)

设定以json格式提供&#xff1a; {"2y": {"2y_jsl": {"精神力的具体能力": {"学习能力组": {"瞬间掌握知识": "可以瞬间掌握所有知识&#xff0c;无需传统学习过程。","直接读取信息": "能直接…...

主题切换方案

方案一 CSS :root 选择器匹配文档的根元素。在 HTML 文档中&#xff0c;根元素就是 <html> 标签 1、定义颜色变量 可在公共样式文件里面定义 :root {--primary-color: #007bff; //定义颜色变量 } 2、使用 JavaScript 修改 CSS 变量 document.documentElement.styl…...

一个日志量突增的问题分析处理经历

问题描述 周一早上&#xff0c;还是和往常一样的巡检。通过告警日志&#xff0c;发现了生产区集群上的一个实例周末出现了异常。 图片 1 Alert_With_Checkpoint_log 如图&#xff0c;周六下午15时开始&#xff0c;数据库在线联机日志组疯狂切换&#xff0c;检查点发生的频率也…...

C#中的dynamic与var:看似相似却迥然不同

在C#编程的世界里&#xff0c;var和dynamic这两个关键字常常让初学者感到困惑。它们看起来都在定义变量时省略了显式类型声明&#xff0c;但实际上它们的工作方式和应用场景有着天壤之别。今天&#xff0c;让我们一起揭开这两个关键字的神秘面纱。 var&#xff1a;编译时的类型…...

VS Code 新旧版本 Remote-SSH 内网离线连接服务器方法(版本 ≤ 1.78.x 及 ≥ 1.79.0)

文章目录 前言版本概览目录结构模型迭代 旧版&#xff08;版本 ≤ 1.78.x&#xff09;离线部署流程1. 问题描述2. 原理说明3. 离线部署步骤 新版&#xff08;版本 ≥ 1.79.0&#xff09;离线部署流程1. 目录结构变化2. 全局设置调整3. 离线部署步骤 常见问题 & 排查总结与建…...

【unity游戏开发——编辑器扩展】使用EditorGUI的EditorGUILayout绘制工具类在自定义编辑器窗口绘制各种UI控件

注意&#xff1a;考虑到编辑器扩展的内容比较多&#xff0c;我将编辑器扩展的内容分开&#xff0c;并全部整合放在【unity游戏开发——编辑器扩展】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 文章目录 前言常用的EditorGUILayout控件专栏推荐完结 前言 EditorG…...

310. 最小高度树

题目 树是一个无向图&#xff0c;其中任何两个顶点只通过一条路径连接。 换句话说&#xff0c;任何一个没有简单环路的连通图都是一棵树。 给你一棵包含 n 个节点的树&#xff0c;标记为 0 到 n - 1 。给定数字 n 和一个有 n - 1 条无向边的 edges 列表&#xff08;每一个边都…...

SpringBoot中配置绑定到bean中

一、回顾value注解 SpringBoot中我们该如何将applicaton.properties中的数据绑定到bean中呢&#xff1f;在之间我们是可以通过value注解&#xff0c;在SpringBoot自动启动后&#xff0c;会自动的去相应的路径中去寻找applicaton.properties配置文件&#xff0c;然后将相应的值…...

Linux下的c/c++开发之操作Redis数据库

C/C 操作 Redis 的常用库 在 C/C 开发中操作 Redis 有多种方式&#xff0c;最主流的选择是使用第三方客户端库。由于 Redis 官方本身是使用 C 编写的&#xff0c;提供的 API 非常适合 C/C 调用。常见的 Redis C/C 客户端库包括&#xff1a; hiredis&#xff1a;官方推荐的轻量…...

通过SMTP协议实现Linux邮件发送配置指南

一、环境准备与基础配置 1. SMTP服务开通&#xff08;以qq邮箱为例&#xff09; 登录qq邮箱网页端&#xff0c;进入「设置」-「POP3/SMTP/IMAP」 开启「SMTP服务」并获取16位授权码&#xff08;替代邮箱密码使用&#xff09; 记录关键参数&#xff1a; SMTP服务器地址&#…...

数学复习笔记 8

前言 成为一个没有感情的刷题机器就可以变得很强了。 逆矩阵的运算 随便算一下就算出来了&#xff0c;没啥难的。主要是用天然可交换的矩阵来算。有三个天然可交换的矩阵&#xff0c;某矩阵和单位阵&#xff0c;该矩阵和它的伴随矩阵&#xff0c;该矩阵和它的逆矩阵。一定要…...

【证书与信任机制​】自签名证书的风险与适用场景​​

关于 自签名证书的风险与适用场景 的详细解析&#xff0c;以及在内网测试中安全使用自签名证书的实践指南&#xff1a; 一、自签名证书的核心风险 1. 信任缺失与安全警告 • 浏览器/操作系统不信任&#xff1a;自签名证书未被权威CA签发&#xff0c;客户端默认视为“不安全”&a…...

[python] Python单例模式:__new__与线程安全解析

一 实例的创建过程 我们之前了解过在构造一个类的实例化对象时,会默认调用__init__方法&#xff0c;也就是类的初始化也叫构造函数&#xff0c;但其实在调用__init__方法前会首先调用__new__方法&#xff08;只有在py3新式类才有&#xff09;。即下面 __new__(): 创建实例 作…...

【SSL证书系列】操作系统如何保障根证书的有效性和安全

操作系统通过多层次的安全机制和技术手段保障根证书的有效性和安全性&#xff0c;防止篡改、伪造或滥用。以下是核心保障措施&#xff1a; 1. 根证书的存储与隔离 • 受保护的存储区域 根证书存储在操作系统的受信任根证书存储区&#xff08;如Windows的“受信任的根证书颁发机…...

毕业论文,如何区分研究内容和研究方法?

这个问题问得太好了&#xff01;&#x1f60e; “研究内容”和“研究方法”经常被初学者&#xff08;甚至一些老油条&#xff09;混淆&#xff0c;尤其写论文开题报告时&#xff0c;一不小心就“内容”和“方法”全混在一块儿&#xff0c;连导师都看懵。 今天就来给大家一文讲…...

《Effective Python》第2章 字符串和切片操作——深入理解 Python 中 __repr__ 与 __str__

引言 本文基于学习《Effective Python》第三版 Chapter 2: Strings and Slicing 中的 Item 12: Understand the Difference Between repr and str When Printing Objects 后的总结与延伸。在 Python 中&#xff0c;__repr__ 和 __str__ 是两个与对象打印密切相关的魔术方法&am…...

C及C++的SOAP协议库

一.gSOAP gSOAP 是一个功能强大的开源工具包&#xff0c;专为 C 和 C 设计&#xff0c;用于快速开发基于 SOAP 协议的 Web 服务和客户端。 1.协议支持 SOAP 版本&#xff1a;完整支持 SOAP 1.1/1.2 规范&#xff0c;包括消息格式、编码规则和错误处理。 传输协议&#xff1a…...

推荐一个Winform开源的UI工具包

从零学习构建一个完整的系统 推荐一个开源、免费的适合.NET WinForms 控件的套件。 项目简介 Krypton是一套开源的.Net组件&#xff0c;用于快速构建具有丰富UI交互的WinForms应用程序。 丰富的UI控件&#xff0c;提供了48个基础控件&#xff0c;如按钮、文本框、标签、下拉…...

【Linux内核】内存管理之虚拟内存详解

目录 一、Linux 虚拟内存概述 二、虚拟内存的基本概念 1. 地址空间 2. 页表 3. 页面 三、虚拟内存的管理机制 1. 页面分配与回收 2. 页面置换 3. 内存映射 四、虚拟内存的保护机制 1. 访问权限 2. 写时复制 五、虚拟内存的优化技术 1. 大页 2. 透明大页 3. 内存…...

upload-labs通关笔记-第5关 文件上传之.ini绕过

目录 一、ini文件绕过原理 二、源码审计 三、渗透实战 1、查看提示 2、制作.user.ini文件 &#xff08;1&#xff09;首先创建一个文本文件 &#xff08;2&#xff09;保存文件名为.user.ini 2、制作jpg后缀脚本 &#xff08;1&#xff09;创建一个文本文件 &#xf…...

入门OpenTelemetry——部署OpenTelemetry

OpenTelemetry 部署模式 OpenTelemetry Collector 按部署方式分为 Agent 和Gateway 模式。 Agent 模式 在 Agent 模式下&#xff0c;OpenTelemetry 检测的应用程序将数据发送到与应用程序一起驻留的&#xff08;收集器&#xff09;代理。然后&#xff0c;该代理程序将接管并…...

构建现代化WPF应用:数据驱动开发与高级特性解析

启动时默认打开哪个界面是在App.xaml的StartupUri属性中设置。 Window标签 x:Class起到了部分类的作用&#xff0c;让XAML与CS文件做关联&#xff0c;起到了映射的作用。 xmlns是XML NameSpace的简称&#xff0c;起到了命名控件的作用&#xff0c;与代码中命名空间不同的是&a…...

MATLAB实现振幅调制(AM调制信号)

AM调制是通信专业非常重要的一个知识点。今天我们使用MATLAB编程实现AM调制。 我们实现输入一个载波信号的频率与调制信号的频率后&#xff0c;再输入调幅度&#xff0c;得到已调信号的波形与包络信号的波形&#xff0c;再使用FFT算法分析出已调信号的频谱图。 源代码&#x…...

loss = -F.log_softmax(logits[:, -1, :], dim=1)[0, irrational_id]

loss = -F.log_softmax(logits[:, -1, :], dim=1)[0, irrational_id] 解释这行代码 loss = -F.log_softmax(logits[:, -1, :], dim=1)[0, irrational_id] 的具体含义和背后的数学原理。 1. 代码拆解与功能 这行代码的核心是计算负对数似然损失(Negative Log Likelihood Los…...

NSSCTF [HNCTF 2022 WEEK4]

题解前的吐槽&#xff1a;紧拖慢拖还是在前段时间开始学了堆的UAF(虽然栈还没学明白&#xff0c;都好难[擦汗])&#xff0c;一直觉得学的懵懵懂懂&#xff0c;不太敢发题解&#xff0c;这题算是入堆题后一段时间的学习成果&#xff0c;有什么问题各位师傅可以提出来&#xff0c…...

基于springboot+vue的医院门诊管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat12开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.3.9 系统展示 系统登录 系统首…...

大模型越狱:技术漏洞与安全挑战——从原理到防御

近年来&#xff0c;随着大模型能力的飞速提升&#xff0c;其安全性问题日益受到关注。其中&#xff0c;“大模型越狱”&#xff08;Model Jailbreaking&#xff09;成为热议焦点——指通过特定手段绕过模型的安全限制&#xff0c;诱导其生成有害、违法或超出设计范围的内容。本…...

Linux 常用命令 -hostnamectl【主机名控制】

简介 hostnamectl 命令中的 “hostname” 顾名思义&#xff0c;指的是计算机在网络上的名称&#xff0c;“ctl” 是 “control” 的缩写&#xff0c;意味着控制。hostnamectl 命令用于查询和修改系统主机名以及相关的设置。它通过与 systemd 系统管理器交互&#xff0c;允许用…...

《Python星球日记》 第72天:问答系统与信息检索

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、问答系统概述1.问答系统的工作原理2. 问答系统的典型应用场景 二、问答系统…...

VUE3 -综合实践(Mock+Axios+ElementPlus)

目录 前言 目标 1.工程创建 2.Mock 2.1 配置Mock 扩 展 2.2 定义模拟数据 2.3 创建Mock服务器 3.导入ElementPlus 4.表格页面搭建 5.动态路由跳转 6.详情页面的制作 前言 基于前文 VUE3详细入门&#xff0c;我们对VUE3的基本使用有了初步的了解&#xff0c;下…...

Qt原型模式实现与应用

在Qt中实现原型模式&#xff08;Prototype Pattern&#xff09;可以通过以下步骤完成。该模式的核心是通过克隆现有对象来创建新对象&#xff0c;而非通过传统的构造函数。以下是详细说明和示例&#xff1a; 1. 原型模式的核心概念 目的&#xff1a;避免重复初始化对象的高成本…...

语音识别-2

上一篇关于语音识别, 虽然能用,但在系统适配,机器适配方面,速度,性能等还是有优化的地方.所以这篇是关于这些的. 1.蓝牙优化 A2DP:是一种单向的高品质音频数据传输链路,通常用于播放立体声音乐;SCO: 则是一种双向的音频数据的传输链路,该链路只支持8K及16K单声道的音频数据…...

ElasticSearch深入解析(十二):聚合——分桶聚合、指标聚合、管道子聚合

文章目录 一、分桶聚合1. 分桶聚合的核心逻辑与核心类型2. 分桶聚合的高级特性 二、指标聚合1. 指标聚合的核心逻辑与基础类型&#xff08;1&#xff09;基础统计指标&#xff08;单值输出&#xff09;&#xff08;2&#xff09;复合统计指标&#xff08;多值输出&#xff09; …...

互联网大厂Java求职面试:AI内容生成平台下的高并发架构设计与性能优化

互联网大厂Java求职面试&#xff1a;AI内容生成平台下的高并发架构设计与性能优化 场景背景&#xff1a; 郑薪苦是一名经验丰富的Java开发者&#xff0c;他正在参加一家匿名互联网大厂的技术总监面试。这家公司专注于基于AI的内容生成平台&#xff0c;支持大规模用户请求和复杂…...

论MCU如何在Fatfs中使用Flash接口的方法

前提&#xff1a; MCU移植了FS&#xff0c;如FATFSOSFMount工具 OSFMount或者其他磁盘工具用于挂载.img镜像&#xff0c;可格式化文件系统打开并放入实际使用的文件 步骤 1. cmd命令建立空.img镜像&#xff0c;以下为12MB fsutil file createnew fat.img 120000002. OSFMo…...

Python+Selenium爬虫:豆瓣登录反反爬策略解析

1. 引言 在当今互联网时代&#xff0c;数据抓取&#xff08;爬虫&#xff09;技术广泛应用于数据分析、市场调研、自动化测试等领域。然而&#xff0c;许多网站采用动态加载技术&#xff08;如Ajax、React、Vue.js等框架&#xff09;来渲染页面&#xff0c;传统的**<font s…...

nt!MiDispatchFault函数分析之第一次循环前后的变化

第一部分&#xff1a;nt!MiDispatchFault函数分析之第一次循环之前 1: kd> !pte 0x002bf810 VA 002bf810 PDE at C0300000 PTE at C0000AFC contains 7B314867 contains 00000000 pfn 7b314 ---DA--UWEV not valid 1: kd> dd C0000AFC…...

JMeter性能测试工具使用

JMeter是一款强大的性能测试工具&#xff0c;由Java编写&#xff0c;小巧轻便&#xff0c;最关键的是开源免费&#xff0c;现在已经成了主流的性能测试工具。 下面介绍一下基本的安装使用、高级功能及可视化实时图表展示&#xff0c;带你们感受一下JMeter的世界~ 1、安装 1.…...

Windows 环境下安装 Node 和 npm

安装 Node.js 和 npm https://nodejs.org/zh-cn/download 执行 fnm install 22 之后&#xff0c;执行 node 或 npm 提示找不到命令 fnm env 看环境变量 找到 node 和 npm 命令在 C:\Users\HUAWEI\AppData\Roaming\fnm\node-versions\v22.15.0\installation 目录下&#xff0…...

开发指南112-样式的优先级别

在前端样式设置里&#xff0c;界面元素一般会多个地方进行定义和影响。一般而言&#xff0c;CSS样式的优先级如下&#xff1a; ‌1、内联样式‌&#xff1a;style属性中定义的样式&#xff0c;具有最高的优先级。 ‌2、ID选择器‌&#xff1a;通过ID选择器指定的样式&#xff…...

单向通信机制EventSource

EventSource 是浏览器提供的一种实现服务器推送 简称 SSE 基于 HTTP 协议的单向通信机制 可以通过服务器将实时数据推送到客户端 而不需要客户端不断发起请求EventSource 和 WebSocket 都可以实现服务器向客户端的实时数据推送&#xff0c;但它们有不同的适用场景&#xff1a;E…...