基于设备指纹识别的反爬虫技术:给设备办 “身份证”
传统的封禁 IP、验证码等反爬虫手段已逐渐失效,基于设备指纹识别的反爬虫技术应运而生,成为守护数据安全的新防线。它如同给每个设备办一张独一无二的 “身份证”,精准区分正常用户与爬虫工具。
一、基础参数采集:构建设备指纹的 “骨架”
设备指纹的基础参数采集,是构建设备指纹的第一步,主要收集设备的浏览器信息、操作系统、屏幕特性等相对稳定的特征,为后续生成唯一标识奠定基础。
浏览器与操作系统信息
通过 navigator.userAgent
可获取浏览器的名称、版本以及操作系统的类型和版本等信息。这一参数能让我们初步了解用户的设备环境,例如是使用 Chrome 浏览器还是 Firefox 浏览器,操作系统是 Windows 还是 macOS。
// 获取浏览器和操作系统信息
const getBrowserAndOSInfo = () => {const userAgent = navigator.userAgent;// 对 userAgent 字符串进行简单解析,获取浏览器和操作系统信息let browserName = 'Unknown';let osName = 'Unknown';if (userAgent.indexOf('Chrome') > -1) {browserName = 'Chrome';} else if (userAgent.indexOf('Firefox') > -1) {browserName = 'Firefox';}if (userAgent.indexOf('Windows') > -1) {osName = 'Windows';} else if (userAgent.indexOf('Macintosh') > -1) {osName = 'macOS';}return { browserName, osName };
};
屏幕分辨率与时区
屏幕分辨率反映了用户设备屏幕的大小和显示精度,通过 screen.width
和 screen.height
获取。不同时区的用户访问网站时,服务器接收到的请求时间会有所差异,通过 Intl.DateTimeFormat().resolvedOptions().timeZone
可获取设备所在时区,这有助于分析用户的地理位置信息。
// 获取屏幕分辨率与时区
const getScreenAndTimezoneInfo = () => {const screenWidth = screen.width;const screenHeight = screen.height;const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;return { screenWidth, screenHeight, timezone };
};
二、高级指纹生成:打造设备指纹的 “独特标识”
Canvas 指纹
Canvas 是 HTML5 提供的一个绘图区域,不同设备在渲染 Canvas 图形时会因显卡驱动、抗锯齿算法等因素产生细微差异。我们可以在 Canvas 上绘制一些图形,然后将绘制结果转化为一个哈希值,这个哈希值即为 Canvas 指纹。为了增加抗伪造能力,可以在绘制过程中加入一些随机因素,如随机像素偏移。
// 获取 Canvas 指纹
const getCanvasFingerprint = () => {const canvas = document.createElement('canvas');const ctx = canvas.getContext('2d');// 设置 Canvas 尺寸canvas.width = 300;canvas.height = 200;// 绘制随机图形(包括随机像素偏移)ctx.fillStyle = '#FF0000';ctx.fillRect(10 + Math.random() * 5, 10 + Math.random() * 5, 50, 50);ctx.font = '16px Arial';ctx.fillStyle = '#0000FF';ctx.fillText('Hello, Fingerprint!', 70 + Math.random() * 3, 70 + Math.random() * 3);// 获取 Canvas 内容的 Base64 编码字符串const data = canvas.toDataURL();return data;
};
WebGL 指纹
WebGL 是一种基于浏览器的 3D 绘图技术,它可以访问设备的显卡信息。通过 WebGL,我们可以获取显卡的渲染器名称、厂商等信息,这些信息在不同设备上具有较高的唯一性。同时,还可以利用 WebGL 的计算特性,执行一些简单的计算任务,进一步增加指纹的复杂度。
// 获取 WebGL 指纹
const getWebGLFingerprint = () => {const canvas = document.createElement('canvas');const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');if (!gl) {return { renderer: 'No WebGL support', vendor: 'No WebGL support' };}const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);const vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);// 执行简单的 WebGL 计算任务,获取计算特性const computeResult = performWebGLComputation(gl);return { renderer, vendor, computeResult };function performWebGLComputation(gl) {// 创建一个简单的着色器程序const vertexShaderSource = `attribute vec4 aVertexPosition;void main() {gl_Position = aVertexPosition;}`;const fragmentShaderSource = `precision mediump float;void main() {gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);}`;const vertexShader = gl.createShader(gl.VERTEX_SHADER);gl.shaderSource(vertexShader, vertexShaderSource);gl.compileShader(vertexShader);const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);gl.shaderSource(fragmentShader, fragmentShaderSource);gl.compileShader(fragmentShader);const shaderProgram = gl.createProgram();gl.attachShader(shaderProgram, vertexShader);gl.attachShader(shaderProgram, fragmentShader);gl.linkProgram(shaderProgram);// 执行绘图操作,获取计算结果(此处仅为示例,实际计算可更复杂)const positionBuffer = gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);const positions = new Float32Array([0.0, 0.0, 0.0, 0.5, 0.5, 0.0]);gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);const vertexPositionAttribute = gl.getAttribLocation(shaderProgram, 'aVertexPosition');gl.enableVertexAttribArray(vertexPositionAttribute);gl.vertexAttribPointer(vertexPositionAttribute, 2, gl.FLOAT, false, 0, 0);gl.useProgram(shaderProgram);gl.drawArrays(gl.TRIANGLES, 0, 3);// 获取绘图结果的哈希值作为计算特性的一部分const pixels = new Uint8Array(4 * 1 * 1);gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixels);return pixels[0].toString() + pixels[1].toString() + pixels[2].toString() + pixels[3].toString();}
};
三、行为特征融合:捕捉设备的 “动态特征”
除了设备的硬件和软件信息外,用户在使用设备时的行为特征也能为设备指纹提供重要补充。通过监听 mousemove、keydown 等事件,我们可以捕捉到用户与设备交互的模式,这些模式对于区分人机操作具有重要意义。
鼠标移动(mousemove)事件
用户在页面上移动鼠标时,会产生一连串的 mousemove 事件。我们可以记录鼠标的位置变化、移动速度以及停留时间等信息。正常用户的鼠标移动通常是比较自然和不规则的,而爬虫模拟的鼠标移动可能呈现出固定的模式或异常的速度。
// 监听 mousemove 事件并记录鼠标行为特征
let mouseMoveData = {path: [], // 鼠标移动轨迹speed: [] // 鼠标移动速度
};
document.addEventListener('mousemove', (event) => {const x = event.clientX;const y = event.clientY;const timestamp = Date.now();// 记录鼠标位置mouseMoveData.path.push({ x, y, timestamp });// 计算鼠标移动速度if (mouseMoveData.path.length > 1) {const prevPosition = mouseMoveData.path[mouseMoveData.path.length - 2];const deltaX = x - prevPosition.x;const deltaY = y - prevPosition.y;const deltaTime = timestamp - prevPosition.timestamp;const speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY) / (deltaTime / 1000); // 速度单位:像素/秒mouseMoveData.speed.push(speed);}// 限制数据长度,避免内存占用过多if (mouseMoveData.path.length > 100) {mouseMoveData.path.shift();}if (mouseMoveData.speed.length > 50) {mouseMoveData.speed.shift();}
});
键盘按下(keydown)和释放(keyup)事件
用户在输入文本时,按键的顺序、每个键的按压时长以及按键间隔等特征都能反映其操作习惯。我们可以通过监听 keydown 和 keyup 事件来记录这些信息。例如,不同用户在输入相同的密码时,按键节奏可能截然不同,这为区分正常用户和爬虫提供了有力依据。
// 监听 keydown 和 keyup 事件并记录键盘行为特征
let keyboardData = {keySequence: [], // 按键序列keyPressDurations: [] // 按键按压时长
};
document.addEventListener('keydown', (event) => {const key = event.key;const timestamp = Date.now();// 记录按键按下时间keyboardData.keySequence.push({ key, timestamp, releaseTime: null });
});
document.addEventListener('keyup', (event) => {const key = event.key;const timestamp = Date.now();// 查找对应的按键按下记录for (let i = keyboardData.keySequence.length - 1; i >= 0; i--) {if (keyboardData.keySequence[i].key === key && keyboardData.keySequence[i].releaseTime === null) {keyboardData.keySequence[i].releaseTime = timestamp;// 计算按键按压时长const pressDuration = timestamp - keyboardData.keySequence[i].timestamp;keyboardData.keyPressDurations.push(pressDuration);break;}}// 限制数据长度if (keyboardData.keySequence.length > 100) {keyboardData.keySequence.shift();}if (keyboardData.keyPressDurations.length > 50) {keyboardData.keyPressDurations.shift();}
});
四、设备指纹的应用场景
跨平台账号管理
在跨境电商平台中,设备指纹技术可以防止恶意用户通过创建虚假账号来进行欺诈活动。平台可以结合设备指纹、IP 地理信息和用户时区等多维度数据,对注册和登录的账号进行风险评估。如果发现一个账号在短时间内从不同设备指纹的设备登录,或者设备指纹与 IP 地理信息、时区不匹配,平台可以采取额外的验证措施,如发送验证码到绑定的手机号码,确保账号的安全性。
金融风控
银行系统在用户登录、转账等关键操作时,利用设备指纹技术可以有效识别异常设备登录。例如,如果一个用户的账号突然从一个从未使用过的设备登录,且该设备的指纹特征与之前常用的设备差异较大,系统可以暂时冻结该账号或要求用户进行身份验证。同时,结合用户的行为特征,如输入密码的键盘敲击模式、鼠标操作习惯等,可以进一步判断是否为用户本人操作,防范账号盗用和欺诈交易风险。
在线游戏反外挂
在线游戏行业一直受到外挂程序的困扰,这些外挂程序通常会模拟正常玩家的操作来获取不公平的优势。通过设备指纹识别技术,游戏平台可以对玩家的设备进行唯一标识,监测玩家的游戏行为是否与设备指纹对应的正常玩家行为模式相符。如果发现某个设备指纹的玩家频繁出现异常的游戏行为,如超高速移动、精准射击(不符合正常人类反应时间)等,平台可以对该账号进行封禁或限制,维护游戏的公平性和平衡性。
五、设备指纹技术的优势与挑战
优势
高准确性 :设备指纹能够综合多种硬件和软件特征,生成具有高度唯一性的标识,有效地区分不同设备,减少了误判的可能性。
难以伪造 :由于设备指纹涉及大量复杂的特征,包括硬件渲染差异、行为习惯等,爬虫很难完全模拟和伪造一个真实的设备指纹,从而提高了反爬虫的效果。
动态更新 :行为特征融合使得设备指纹可以根据用户的操作实时动态更新,即使爬虫获取了某个设备的静态指纹信息,在下一次请求时,由于行为特征的变化,仍然可以被识别出来。
挑战
浏览器限制与隐私问题 :随着浏览器隐私保护措施的加强,某些设备指纹采集技术可能会受到限制。例如,一些浏览器会禁止访问精确的硬件信息或对 Canvas 渲染结果进行干扰,这可能会影响设备指纹的准确性。同时,设备指纹技术涉及到收集用户的设备信息,可能会引发用户对隐私泄露的担忧,因此在使用该技术时需要充分考虑用户隐私保护,确保数据的合法收集和使用。
性能开销 :采集和处理设备指纹信息,尤其是高级指纹生成和行为特征融合部分,可能会对设备的性能产生一定影响。在一些低性能设备上,可能会导致页面加载变慢或卡顿。因此,需要优化算法和代码,尽量减少对设备性能的影响,确保用户体验不受损害。
设备指纹识别技术作为反爬虫领域的重要手段,为我们守护互联网数据安全提供了强大的支持。然而,它并非完美无缺,在实际应用中需要不断应对各种挑战,如浏览器限制、隐私保护和性能优化等。通过合理地使用设备指纹技术,并结合其他反爬虫手段,我们可以在保护数据安全的同时,为用户提供一个安全、可靠的网络环境。
相关文章:
基于设备指纹识别的反爬虫技术:给设备办 “身份证”
传统的封禁 IP、验证码等反爬虫手段已逐渐失效,基于设备指纹识别的反爬虫技术应运而生,成为守护数据安全的新防线。它如同给每个设备办一张独一无二的 “身份证”,精准区分正常用户与爬虫工具。 一、基础参数采集:构建设备指纹的…...
公开模型一切,优于DeepSeek-R1,英伟达开源Llama-Nemotron家族
在大模型飞速发展的今天,推理能力作为衡量模型智能的关键指标,更是各家 AI 企业竞相追逐的焦点。 但近年来,推理效率已成为模型部署和性能的关键限制因素。 基于此,英伟达推出了 Llama-Nemotron 系列模型(基于 Meta …...
CI/CD面试题及答案
一、CI/CD 基础概念 1. 什么是 CI/CD?CI 和 CD 的区别是什么? 答案: CI(持续集成):开发人员提交代码后,自动构建并运行测试,确保代码集成无冲突。CD(持续交付 / 部署&am…...
解决 Ubuntu DNS 无法解析问题(适用于虚拟机 长期使用)
解决 Ubuntu DNS 无法解析问题 在使用 Ubuntu 虚拟机(尤其是在国内)时,经常会遇到这样的错误: Temporary failure resolving cn.archive.ubuntu.com但是此时又能成功 ping 通 IP,这说明网络是正常的,问题…...
如何通过C# 获取Excel单元格的数据类型
在处理 Excel 文件时,了解单元格的数据类型有助于我们正确地解析和处理数据。Free Spire.XLS 是一款功能强大且免费的.NET 组件,支持高效地操作 Excel 文件,包括读取单元格类型。本文将详细介绍如何使用 Free Spire.XLS 来获取 Excel 单元格的…...
Spring Boot初级教程:从零搭建企业级Java应用
一、Spring Boot是什么?为什么学它? 定义:Spring Boot是Spring框架的轻量级快速开发工具,基于“约定优于配置”原则,简化Spring应用的搭建与部署。核心优势: 零配置起步:内置Tomcat/Jetty,无需手动部署Web服务器。自动装配:自动扫描依赖、注入Bean,减少XML/注解冗余代…...
IBM BAW(原BPM升级版)使用教程第六讲
一、事件:Undercover Agent 在 IBM Business Automation Workflow (BAW) 中,Undercover Agent (UCA) 是一个非常独特和强大的概念,旨在实现跨流程或系统的事件处理和触发机制。Undercover Agent 主要用于 事件驱动的流程自动化,它…...
[250509] x-cmd 发布 v0.5.11 beta:x ping 优化、AI 模型新增支持和语言变量调整
目录 X-CMD 发布 v0.5.11 beta📃Changelog🧩 ping🧩 openai🧩 gemini🧩 asdf🧩 mac✅ 升级指南 X-CMD 发布 v0.5.11 beta 📃Changelog 🧩 ping 调整 x ping 默认参数为 bing.com&a…...
Web前端VSCode如何解决打开html页面中文乱码的问题(方法2)
Web前端—VSCode如何解决打开html页面中文乱码的问题(方法2) 1.打开VScode后,依次点击 文件 >> 首选项 >> 设置 2.打开设置后,依次点击 文本编辑器 >> 文件(或在搜索框直接搜索“files.autoGuessEnc…...
打造专属AI好友:小智AI聊天机器人详解
打造专属AI好友:小智AI聊天机器人详解 在当下的科技热潮中,AI正迅速改变着我们的生活,成为了科技领域的新宠。而今,借助开源项目的力量,你可以亲手打造一个智能小助手——小智AI聊天机器人。它不仅是一个技术探索的窗…...
Spring,SpringMVC,SpringBoot,SpringCloud的区别
Spring Spring 是一个基础框架,为 Java 应用提供了 IoC(控制反转)和 AOP(面向切面编程)功能。其主要特点如下: IoC 容器:借助依赖注入,降低了组件间的耦合度。AOP 支持:…...
从投入产出、效率、上手难易度等角度综合对比 pytest 和 unittest 框架
对于选择python作为测试脚本开发的同学来说,pytest和python unittest是必需了解的两个框架。那么他们有什么区别?我们该怎么选?让我们一起来了解一下吧! 我们从投入产出、效率、上手难易度等角度综合对比 pytest 和 unittest 框架…...
无人机电池储存与操作指南
一、正确储存方式 1. 储存电量 保持电池在 40%-60% 电量(单片电压约3.8V-3.85V)存放,避免满电或空电长期储存。 满电存放会加速电解液分解,导致鼓包;**空电**存放可能引发过放(电压低于3.0V/片会永久…...
CSS实现图片垂直居中方法
html <div class"footer border-top-row"><div class"footer-row"><span class"footer-row-col01">制单人:{{ printData[pageIndex - 1].rkMaster.makerName}}<img :src"getPersonSignImgSrc(printData[pa…...
多账号管理与自动化中的浏览器指纹对抗方案
多账号管理与自动化中的浏览器指纹对抗方案 在日常的开发工作中,如果你曾涉及自动化脚本、多账号运营、数据抓取,或是在安全研究方向摸爬滚打过,应该对“浏览器指纹识别”这几个字不会陌生。 指纹识别:不是你以为的那种“指纹”…...
[6-1] TIM定时中断 江协科技学习笔记(45个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 TRGO是“Trigger Output”的缩写,中文意思是“触发输出”。在STM32微控制器中,TRGO是一个非常重要的功能,它允许定时器(Timer)在特定事件发生时输出一个触发信号。这个触发信号可以用…...
Flutter 3.29.3 花屏问题记录
文章目录 Flutter 3.29.3 花屏问题记录问题记录解决尝试解决 Flutter 3.29.3 花屏问题记录 问题记录 flutter版本3.29.3,代码大致为: ShaderMask(shaderCallback: (Rect bounds) {return LinearGradient(begin: Alignment.topCenter,end: Alignment.bo…...
[Windows] 希捷(Seagate)硬盘官方检测工具 - SeaTools(1.4.0.7)
[Windows] 希捷(Seagate)硬盘官方检测工具 - SeaTools 链接:https://pan.xunlei.com/s/VOPpN9A3Tn_rVktEMu6Lg9q9A1?pwdh8rz# 希望能修复好硬盘...
YOLOv8目标检测性能优化:损失函数改进的深度剖析
文章目录 YOLOv8 简介损失函数在 YOLOv8 中的关键作用SlideLoss 的原理与应用原理代码实例 FocalLoss 分类损失函数的优化原理代码实例 SlideLoss 与 FocalLoss 在 YOLOv8 中的协同作用实验结果与分析 YOLOv8 简介 YOLO(You Only Look Once)系列目标检测…...
docker 日志暴露方案 (带权限 还 免费 版本)
接到了一个需求,需求的内容是需要将测试环境的容器暴露给我们的 外包同事,但是又不能将所有的容器都暴露给他们。 一开始,我分别找了 Portainer log-pilot dpanel 它们都拥有非常良好的界面和容器情况可视化。 但,缺点是&am…...
水印云:AI赋能,让图像处理变得简单高效
水印云是一款基于超强AI技术的图像处理工具,提供丰富的图像编辑功能,将复杂的图像处理极简化,真正实现简单高效的图像处理。无论是去除水印、智能抠图、添加水印,还是提升画质,水印云都能轻松应对,满足不同…...
使用 ECharts GL 实现交互式 3D 饼图:技术解析与实践
一、效果概览 本文基于 Vue 3 和 ECharts GL,实现了一个具有以下特性的 3D 饼图: 立体视觉效果:通过参数方程构建 3D 扇形与底座动态交互:支持点击选中(位移效果)和悬停高亮(放大效果ÿ…...
allure生成测试报告(搭配Pytest、allure-pytest)
文章目录 前言allure简介allure安装软件下载安装配置环境变量安装成功验证 allure运行流程allure装饰器函数基本说明装饰器函数使用allure.attach 命令行运行利用allure-pytest生成中间结果json 查看测试报告总览页面每个tab页的说明类别页面测试套图表页面时间刻度功能页面包 …...
一场陟遐自迩的 SwiftUI + CoreData 性能优化之旅(下)
概述 自从 SwiftUI 诞生那天起,我们秃头码农们就仿佛打开了一个全新的撸码世界,再辅以 CoreData 框架的鼎力相助,打造一款持久存储支持的 App 就像探囊取物般的 Easy。 话虽如此,不过 CoreData 虽好,稍不留神也可能会…...
java的输入输出模板(ACM模式)
文章目录 1、前置准备2、普通输入输出API①、输入API②、输出API 3、快速输入输出API①、BufferedReader②、BufferedWriter 案例题目描述代码 面试有时候要acm模式,刷惯leetcode可能会手生不会acm模式,该文直接通过几个题来熟悉java的输入输出模板&…...
浏览器自动化与网络爬虫实战:工具对比与选型指南
浏览器自动化与网络爬虫实战:工具对比与选型指南 摘要 在当今数字化时代,浏览器自动化和网络爬虫技术已成为数据收集与测试的重要工具。本文深入剖析了多种主流浏览器自动化工具和爬虫框架的特点、优缺点及其适用场景,包括 Selenium、Puppe…...
“双非” “退伍” “材料” “学验证” 拿到Dream Offer
大家好,我是2024年路科验证V2X春季班的学员。在春季班的课上完后,觉得自己的基础大部分已经被路科给弥补了,但是很多课程中关于框架的搭建和一些细节还是不够扎实,有所欠缺,于是又重修了秋季班的课程。这两次课程给我的…...
python 上海新闻爬虫, 上观新闻 + 腾讯新闻
1. 起因, 目的: 继续爬上海新闻, 增加新闻来源。昨天写了: 东方网 澎湃新闻今天增加2个来源: 上观新闻 腾讯新闻此时有4个来源,我觉得已经差不多了。 2. 先看效果 3. 过程: 代码 1, 上观新闻 这里也有一个有趣的…...
【LUT技术专题】ECLUT代码解读
目录 原文概要 1. 训练 2. 转表 3. 测试 本文是对ECLUT技术的代码解读,原文解读请看ECLUT。 原文概要 ECLUT通过EC模块增大网络感受野,提升超分效果,实现SRLUT的改进,主要是2个创新点: 提出了一个扩展卷积&…...
Wsl2 网络模式介绍
每个模式说明参考下面连接 使用 WSL 访问网络应用程序 | Microsoft Learn...
项目高压生存指南:科学重构身体与认知系统的抗压算法
引言:压力重构的工程学思维 在项目管理的高压熔炉中,优秀从业者与普通执行者的核心差异不在于抗压能力的高低,而在于是否掌握压力管理的系统化算法。本文摒弃传统的鸡汤式减压建议,从人体工程学、神经科学和认知心理学角度&#…...
Java设计模式之工厂方法模式:从入门到精通
1. 工厂方法模式概述 1.1 定义与核心思想 工厂方法模式(Factory Method Pattern) **定义:**是一种创建型设计模式,它定义了一个用于创建对象的接口,但让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 **核心思想:**工厂模式的核心思想是将对象的创建…...
生成自定义的androidjar文件具体操作
在Androidsdk目录下的platform找到对应的api的android源码包路径,如android-32拷贝里面的android.jar文件到目录,如 C:\Users\xxxxxxx\Desktop\android\new_android_jar,然后解压android.jar到目录new_android_jar下。在编译后的aosp源码中找…...
在一台CentOS服务器上开启多个MySQL服务
1. 创建目录 mkdir -p /data/mysql3307/{data,tmp,logs} # 赋权 chown -R mysql:mysql /data/mysql3307 chmod -R 750 /data/mysql3307 2.修改 /etc/my.cnf ,添加[mysqld3307]实例配置组 [mysqld3307] # MySQL服务的端口 port 3307 # 套接字文件存放路径 socket /…...
相机的方向和位置
如何更好的控制相机按照我们需要来更好的观察我们需要的地貌呢? 使用 // setview瞬间到达指定位置,视角//生成position是天安门的位置var position Cesium.Cartesian3.fromDegrees(116.397428,39.90923,100)viewer.camera.setView({//指定相机位置destination: position, 在…...
云原生架构下的微服务通信机制演进与实践
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:通信机制是微服务架构的基础 随着软件系统复杂度的提升,“单体架构 → 微服务架构 → 云原生架构”逐步成为企业数字化转型的演进主线。而在微服务架构中,“服务间通信机制”决定了系统的稳定性…...
Git标签删除脚本解析与实践:轻松管理本地与远程标签
Git 标签删除脚本解析与实践:轻松管理本地与远程标签 在 Git 版本控制系统中,标签常用于标记重要的版本节点,方便追溯和管理项目的不同阶段。随着项目的推进,一些旧标签可能不再需要,此时就需要对它们进行清理。本文将通过一个完整的脚本,详细介绍如何删除本地和远程的 …...
5G让媒体传播更快更智能——技术赋能内容新时代
5G让媒体传播更快更智能——技术赋能内容新时代 在5G时代,媒体传播已经不再是传统的“电视纸媒网站”模式,而是演变成超低延迟、高速传输、智能交互的全新生态。无论是直播、短视频、VR/AR内容还是AI驱动的个性化推荐,5G的高速连接能力都在让…...
数字IC前端学习笔记:锁存器的综合
相关阅读 数字IC前端专栏https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482 锁存器是一种时序逻辑,与寄存器相比面积更小,但它的存在会使静态时序分析(STA)变得更加复杂,因此懂得什么样的设计会综合出…...
Spring Boot快速开发:从零开始搭建一个企业级应用
Spring Boot快速开发:从零开始搭建一个企业级应用 在当今的软件开发领域,Spring Boot已经成为构建企业级应用的首选框架之一。它不仅简化了Spring应用的初始搭建以及开发过程,还提供了许多开箱即用的功能,使得开发者能够快速地构…...
ATH12K驱动框架架构图
ATH12K驱动框架架构图 ATH12K驱动框架架构图(分层描述)I. 顶层架构II. 核心数据结构层次关系III. 主要模块详解1. 核心模块 (Core)2. 硬件抽象层 (HAL)3. 无线管理接口 (WMI)4. 主机目标通信 (HTC)5. 复制引擎 (CE)6. MAC层7. 数据路径 (DP)IV. 关键数据流路径1. 发送数据流 …...
数字信号处理|| 离散序列的基本运算
一、实验目的 (1)进一步了解离散时间序列时域的基本运算。 (2)了解MATLAB语言进行离散序列运算的常用函数,掌握离散序列运算程序的编写方法。 二、实验涉及的MATLAB子函数 (1)find 功能:寻找非零元素的索…...
集成管理工具Gitlab
GitLab 是一个功能强大的开源代码托管和协作平台,集成 GitLab 可以显著提升团队的开发效率。下面我将为你介绍如何集成 GitLab,包括安装配置和基本使用流程。 一、GitLab 安装与配置 GitLab 有多种安装方式,推荐使用官方 Omnibus 包安装&am…...
2025 年数维杯数学建模 C 题完整论文代码模型:清明时节雨纷纷,何处踏青不误春
《2025 年数维杯数学建模 C 题完整论文代码模型》 C题完整论文 一、问题重述 1.1 问题背景 2025 年第十届数维杯大学生数学建模挑战赛 C 题,将我们带入“清明时节雨纷纷,何处踏青不误春”的诗意情境。清明节,这个处于每年 4 月 4 日至 6 …...
2025数维杯数学建模C题完整限量论文:清明时节雨纷纷,何处踏青不误春?
2025数维杯数学建模C题完整限量论文:清明时节雨纷纷,何处踏青不误春? 清明节,在每年 4 月 4 日至 6 日之间,既是自然节气,也是我国重要 的传统节日,承载着中华民族千年的文化记忆与情感寄托。此…...
POSE识别 神经网络
Pose 识别模型介绍 Pose 识别是计算机视觉领域的一个重要研究方向,其目标是从图像或视频中检测出人体的关键点位置,从而估计出人体的姿态。这项技术在许多领域都有广泛的应用,如动作捕捉、人机交互、体育分析、安防监控等。 Pose 识别模型的…...
Missashe高数强化学习笔记(随时更新)
Missashe高数强化学习笔记 说明:这篇笔记用于博主对高数强化课所学进行记录和总结。由于部分内容写在博主的日记博客里,所以博主会不定期将其重新copy到本篇笔记里。 第一章 函数极限连续 第二章 一元函数微分学 第三章 一元函数积分学 第一节 不定…...
如何从极狐GitLab 容器镜像库中删除容器镜像?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 从容器镜像库中删除容器镜像 (BASIC ALL) 您可以从您的容器镜像库中删除容器镜像。 要基于特定标准自动删除容器镜像&#x…...
出现在‘{‘的段错误
今天在运行程序时,程序因段错误退出了,于是使用gdb调试。 部分输出如下: [New Thread 0x7fffc88be6c0 (LWP 47902)] [New Thread 0x7fffc80bd6c0 (LWP 47903)] [New Thread 0x7…...
【C++设计模式之Observer观察者模式】
Observer观察者模式 模式定义动机(Motivation)结构(Structure)应用场景一(气象站)实现步骤1.定义观察者接口2.定义被观察者(主题)接口3.实现具体被观察者对象(气象站)4.实现具体观察者(例如:显示屏)5.main.cpp中使用示例6.输出结果7. 关键点 …...