Vercel反向代理实战:基于Serverless Functions构建安全API网关

news2026/5/16 5:48:35
1. 项目概述一个反向代理的轻量级解决方案最近在折腾个人项目部署时遇到了一个挺典型的问题前端应用托管在 Vercel 上但需要安全地调用一些部署在其他地方比如家里的 NAS或者某个有严格 IP 白名单限制的后端服务的 API。直接在前端代码里写死内网地址或者特定域名显然不行一来不安全二来也受限于浏览器的同源策略。这时候一个轻量、灵活的反向代理就成了刚需。我找到了一个名为gaboolic/vercel-reverse-fast的开源项目。顾名思义它是一个设计用于 Vercel 平台的反向代理工具核心目标就是“快”。这个项目没有复杂的配置和沉重的依赖它基于 Node.js利用 Vercel 的 Serverless Functions 能力实现了一个高性能的请求转发中间件。你可以把它理解为一个部署在 Vercel 边缘网络上的“智能路由器”它接收来自浏览器的请求然后帮你转发到真正的目标服务器再把响应原样返回整个过程对前端应用是透明的。它特别适合哪些场景呢首先是开发调试当你本地跑着一个后端服务localhost:3001而前端在 Vercel 上预览时可以用它来代理 API 请求避免跨域问题。其次是集成第三方服务有些老旧的 API 可能没有 CORS 头或者你不想在前端暴露其真实地址和密钥用它做一层中转和清洗就很合适。再者就是文章开头提到的连接受保护的内网资源或特定环境的后端它充当了一个安全的网关。这个项目的魅力在于其“简洁”和“专注”。它不试图做一个全功能的 API 网关而是解决在 Vercel 生态下前端应用灵活、安全地对接多后端源这一个具体痛点。接下来我会详细拆解它的设计思路、如何快速上手、核心配置的每一个细节以及我在实际使用中踩过的坑和总结的优化技巧。2. 核心设计思路与架构解析2.1 为什么选择 Vercel Serverless Functions 作为载体vercel-reverse-fast的核心基石是 Vercel 的 Serverless Functions。这个选择背后有非常务实的考量。首先是无服务器架构带来的运维简化你不需要关心服务器的配置、扩缩容或监控Vercel 全包了。这对于前端开发者或个人项目来说极大地降低了后端基础设施的复杂度。其次是性能与成本Vercel 的 Functions 在全球拥有边缘节点能够以极低的延迟启动和执行并且在其慷慨的免费额度内对于中小流量的反向代理需求几乎是零成本。更重要的是Serverless Functions 与 Vercel 的前端托管服务是天作之合。你的前端应用Next.js, React, Vue 等和这个反向代理函数可以部署在同一个项目中共享环境变量、同属一个域名下管理起来非常方便。代理路径比如/api/proxy/*可以无缝地集成到你的应用路由中对使用者来说就像在调用自己的 API 一样自然。这个架构也决定了项目的轻量化方向。一个 Serverless Function 有执行时长和内存的限制因此代理逻辑必须高效、快速避免复杂的计算和阻塞操作。vercel-reverse-fast的代码库非常精简主要依赖 Node.js 原生的http/https模块或者轻量级的node-fetch库来实现请求转发没有引入臃肿的 Web 框架这确保了冷启动速度和运行效率。2.2 反向代理的核心工作流剖析这个项目的核心逻辑是一个经典的 HTTP 反向代理。我们来拆解一下当一个请求到达时它内部是如何工作的请求拦截与解析函数首先会接收到一个完整的 HTTP 请求对象。它会解析请求的路径、方法GET、POST等、请求头Headers和请求体Body。这里的关键是它需要根据预设的规则判断这个请求是否应该被代理以及应该转发到哪个目标target服务器。目标重写与请求构造这是代理的核心步骤。函数会根据配置将原始请求的 URL 路径进行重写。例如前端请求/api/proxy/users配置规则可能是将所有以/api/proxy开头的请求转发到https://my-backend.com/api。那么函数就会将路径重写为https://my-backend.com/api/users。同时它会精心处理请求头一些敏感的、来自浏览器的头如Host通常会被替换成目标服务器的地址而像Authorization、Content-Type等关键头则会保留或根据配置调整。请求转发与流式处理构造好新的请求后函数会使用http/https模块或fetch向目标服务器发起请求。这里的一个优化点是“流式处理”Streaming。优秀的代理不会等待目标服务器返回完整响应后再吐给客户端而是采用管道Pipe的方式将目标服务器的响应流直接连接到客户端的响应流。这样做的好处是内存占用极低不需要缓存整个响应体并且能够显著降低延迟实现“边收边发”这也是其名称中“fast”的一个体现。响应头处理与错误处理收到目标服务器的响应后代理函数会处理响应头。同样它可能需要过滤或修改一些头信息如Set-Cookie的域名然后再将其返回给客户端。在整个过程中健全的错误处理机制至关重要。包括网络超时、目标服务器不可达、SSL证书错误等都需要被捕获并转化为对前端友好的 HTTP 错误状态码如 502 Bad Gateway, 504 Gateway Timeout而不是让函数本身崩溃。2.3 配置驱动的灵活性设计vercel-reverse-fast通常通过一个配置文件如vercel.json或一个独立的proxy.config.js来定义代理规则。这种配置驱动的设计提供了极大的灵活性。一个典型的配置可能包含多个路由规则每条规则都指定了匹配路径source、目标地址target、以及各种细粒度的选项。{ rewrites: [ { source: /api/external/:path*, destination: https://api.example.com/:path* }, { source: /graphql, destination: https://my-graphql-server.com/v1/graphql } ] }你可以为不同的后端服务设置不同的路径前缀也可以对特定路径进行精确匹配。高级配置还可以包括超时时间设置、请求头重写、路径重写、SSL证书验证开关等。这种设计意味着你无需修改代码只需更新配置就能轻松地添加、移除或修改代理规则适应项目不同阶段的需求变化。3. 从零开始的详细部署与配置指南3.1 项目初始化与环境准备假设你已经有一个部署在 Vercel 上的前端项目例如 Next.js。如果没有你需要先初始化一个。这里我们以集成vercel-reverse-fast到现有 Next.js 项目为例。首先在你的项目根目录下安装必要的依赖。虽然vercel-reverse-fast可能作为一个独立包发布但其核心逻辑简单很多时候你可以直接复制其核心函数代码到你的项目中以减少依赖。更常见的做法是在项目的api/目录Vercel Serverless Functions 的约定目录下创建一个代理接口。# 进入你的项目目录 cd your-vercel-project # 如果你打算使用一个封装好的包假设存在可以安装 # npm install vercel-reverse-proxy # 但更常见的做法是手动创建代理函数接下来在项目根目录创建vercel.json配置文件如果不存在。这个文件是 Vercel 项目配置的核心。3.2 编写核心代理函数在pages/api/对于 Next.js Pages Router或app/api/对于 Next.js App Router目录下创建一个文件例如proxy/[...path].js。这个文件路径决定了代理的 API 路由[...path].js是一个 catch-all 路由会匹配/api/proxy/后面的所有路径。// pages/api/proxy/[...path].js import { createProxyMiddleware } from http-proxy-middleware; // 或者使用轻量级方案 // 注意为了极致轻量和避免额外依赖我们可以使用 Node.js 原生模块或微框架。 // 下面是一个使用 node-fetch 和 http 模块的简化示例。 export default async function handler(req, res) { // 1. 定义你的目标服务器基础 URL const TARGET_BASE_URL process.env.TARGET_API_URL || https://your-real-backend.com; // 2. 获取请求的路径和查询参数 const { path, query } req.query; // Next.js 会将 catch-all 参数解析为数组 const pathname Array.isArray(path) ? path.join(/) : path; const searchParams new URLSearchParams(query || req.url.split(?)[1] || ).toString(); // 3. 构建目标 URL const targetUrl new URL(pathname, TARGET_BASE_URL); if (searchParams) { targetUrl.search searchParams; } // 4. 设置 fetch 选项复制关键的请求头和请求体 const fetchOptions { method: req.method, headers: {}, }; // 复制请求头但移除一些代理相关的头并可能添加认证头 const headersToForward [authorization, content-type, user-agent]; headersToForward.forEach(header { if (req.headers[header]) { fetchOptions.headers[header] req.headers[header]; } }); // 如果需要可以在这里注入静态的认证头例如 API Key // fetchOptions.headers[x-api-key] process.env.BACKEND_API_KEY; if (req.method ! GET req.method ! HEAD) { // 根据请求体类型处理这里假设是 JSON 或文本 const contentType req.headers[content-type] || ; if (contentType.includes(application/json)) { fetchOptions.body JSON.stringify(req.body); } else if (contentType.includes(text/) || contentType.includes(form-)) { // 注意处理 FormData 或流式 body 需要更复杂的逻辑 fetchOptions.body req.body; } } // 5. 设置超时和代理选项 const controller new AbortController(); const timeoutId setTimeout(() controller.abort(), 10000); // 10秒超时 fetchOptions.signal controller.signal; try { // 6. 向目标服务器发起请求 const response await fetch(targetUrl.toString(), fetchOptions); // 7. 将目标服务器的响应头复制给客户端 for (const [key, value] of response.headers.entries()) { // 过滤掉一些不应该传递的头如 content-encoding 如果前端直接处理的话 if (![content-encoding, transfer-encoding].includes(key.toLowerCase())) { res.setHeader(key, value); } } // 8. 设置状态码并流式传输响应体 res.status(response.status); // 如果响应是可读流则进行管道传输 if (response.body) { const reader response.body.getReader(); while (true) { const { done, value } await reader.read(); if (done) break; res.write(value); } res.end(); } else { const text await response.text(); res.send(text); } } catch (error) { console.error(Proxy error:, error); // 9. 错误处理 if (error.name AbortError) { res.status(504).json({ error: Gateway Timeout }); } else { res.status(502).json({ error: Bad Gateway, details: error.message }); } } finally { clearTimeout(timeoutId); } } export const config { api: { bodyParser: { sizeLimit: 4mb, // 根据需求调整请求体大小限制 // 对于非 JSON 数据可能需要禁用 bodyParser // bodyParser: false, }, }, };注意以上是一个高度简化的示例用于说明原理。在实际生产环境中你需要处理更多边界情况如流式请求体文件上传、WebSocket 代理、更精细的请求头处理、响应头重写特别是 Cookie 和重定向、重试逻辑等。gaboolic/vercel-reverse-fast项目的价值就在于它已经较为完善地处理了这些细节。3.3 Vercel 项目配置与部署核心函数写好后我们需要在vercel.json中配置路由以确保所有到/api/proxy/*的请求都被正确路由到这个 Serverless Function而不是被 Next.js 的页面路由处理。{ functions: { pages/api/proxy/[...path].js: { maxDuration: 10 // 函数最大执行时间单位秒可根据需要调整 } }, rewrites: [ // 如果你的函数路径不同可能需要重写规则。 // 但 Next.js 的 /pages/api/* 结构通常不需要额外重写。 ] }接下来就是部署。将你的代码推送到连接到 Vercel 的 Git 仓库如 GitHubVercel 会自动检测并部署。你也可以使用 Vercel CLI 在本地进行预览部署# 安装 Vercel CLI npm i -g vercel # 在项目根目录登录并部署 vercel login vercel部署成功后你的代理就生效了。前端应用现在可以向https://your-vercel-app.vercel.app/api/proxy/some-endpoint发送请求这个请求会被安全地转发到你在代码中配置的TARGET_BASE_URL例如https://your-real-backend.com/some-endpoint。4. 高级配置与性能优化实战4.1 环境变量与多目标管理在实际项目中你很可能需要根据环境开发、预览、生产代理到不同的后端地址。硬编码目标 URL 是极不推荐的。最佳实践是使用 Vercel 的环境变量。你可以在 Vercel 项目设置的Environment Variables面板中分别给 Production、Preview、Development 环境设置不同的TARGET_API_URL。这样你的代理函数代码无需修改就能自动适应不同环境。对于更复杂的场景需要代理到多个不同的后端服务你可以通过解析请求路径的前缀来实现。例如/api/proxy/service-a/*-https://service-a.example.com/*/api/proxy/service-b/*-https://service-b.example.com/*这可以通过在代理函数中解析req.query.path数组的第一个元素来实现路由判断或者维护一个简单的路由映射表。4.2 请求/响应头与 Cookie 的精细控制请求头处理是代理中的关键也是容易出错的地方。请求头转发默认情况下浏览器自动添加的Host、Connection等头需要被重写或移除。Origin和Referer头通常需要被过滤或修改为目标服务器的域名否则可能引发 CORS 问题或导致目标服务器拒绝请求。像Authorization、X-API-Key这类认证头必须安全地转发。一种安全的做法是在代理函数中从环境变量读取凭证然后动态添加到转发请求中而不是让前端直接发送这样可以避免前端暴露敏感信息。响应头处理目标服务器返回的Set-Cookie头可能包含Domain或Path属性这些属性是针对目标服务器域名的。如果直接返回给浏览器Cookie 可能无法正确设置或读取。通常需要在代理层重写Set-Cookie头中的Domain为你的 Vercel 应用域名或移除该属性并确保Secure、HttpOnly、SameSite等属性符合你的安全要求。同样Location头用于重定向也需要将其中的目标服务器域名替换为你的代理域名。4.3 超时、重试与熔断机制Serverless Function 有严格的超时限制默认 10 秒可配置延长。如果后端服务响应慢很容易导致代理函数超时返回 504 错误。设置合理的超时在向目标服务器发起请求时必须设置一个比函数超时时间更短的超时控制例如 8 秒这样你才能捕获超时错误并返回一个友好的 504而不是让函数执行超时。实现重试逻辑对于网络抖动或目标服务临时不可用可以加入简单的重试机制。但重试需要谨慎特别是对非幂等的 POST、PUT 请求。通常只为 GET 请求或配置了重试 idempotency key 的请求添加重试。简易熔断思想虽然实现完整的熔断器如 Circuit Breaker在 Serverless 环境中稍显复杂但可以记录连续失败次数。如果短时间内对同一目标的失败次数超过阈值可以暂时快速失败直接返回 502避免持续冲击已经故障的后端并定期尝试恢复。4.4 缓存策略与性能提升对于 GET 请求尤其是返回内容不经常变化的接口引入缓存可以极大提升响应速度、降低后端负载和函数执行次数从而节省成本。你可以在代理函数中实现一个简单的内存缓存注意Serverless 环境每次冷启动内存是隔离的因此更适用于短时间、高频请求的预热或利用 Vercel 自身的边缘网络缓存。更推荐的做法是使用外部高速缓存服务如 RedisUpstash 提供了 Serverless Redis但这样会增加复杂性和成本。一个折中的方案是利用 HTTP 缓存头。代理函数可以解析目标服务器返回的Cache-Control、ETag、Last-Modified等头并原样传递给前端浏览器。同时在代理函数内部对于相同的请求 URL可以在内存中短暂缓存响应例如 5-10 秒这能有效应对短时间内完全相同的重复请求。5. 安全加固与生产环境注意事项5.1 防止代理滥用与 SSRF 攻击反向代理最严重的安全风险之一是服务器端请求伪造SSRF。如果代理的目标地址可以由用户输入控制例如通过请求参数指定攻击者就可能利用你的代理作为跳板去攻击内网服务或进行端口扫描。绝对禁止永远不要设计允许用户自由指定完整目标 URL 的代理。安全实践白名单机制在代码或环境变量中预定义允许代理的目标主机名hostname列表。收到请求后解析出目标主机名并与白名单比对不匹配则立即返回 403 Forbidden。路径重写只允许用户控制路径path和查询参数query目标协议http/https和域名domain由配置固定。这就是我们上面示例采用的方式。输入验证与净化即使使用路径重写也要对用户传入的路径片段进行严格的验证防止路径遍历攻击如../../../etc/passwd。5.2 认证与授权集成代理层是一个集中处理认证的理想位置。API 密钥/令牌注入将后端服务所需的 API Key 保存在 Vercel 的环境变量中。代理函数在转发请求前自动将此密钥添加到请求头如X-API-Key。这样前端代码完全不需要知道这个密钥提高了安全性。JWT 验证与传递如果前端使用 JWT 进行用户认证代理函数可以先验证 JWT 的有效性签名、过期时间验证通过后再将 JWT 或从中提取的用户信息如 user_id以特定头如X-User-ID的形式传递给后端服务。这为后端服务提供了一层信任边界。基于路径的权限控制你可以在代理函数中实现简单的路由级权限检查。例如只有认证用户才能访问/api/proxy/admin/*路径下的接口。5.3 日志记录与监控在生产环境中必须对代理的访问和错误进行日志记录。结构化日志使用console.log或console.error输出结构化的 JSON 日志。Vercel 会自动收集这些日志并可以在其 Dashboard 中查看。记录的关键信息应包括时间戳、请求 ID可从req.headers[x-vercel-id]获取、客户端 IP、请求方法、路径、目标 URL、响应状态码、处理耗时、以及任何错误信息。错误告警在 Vercel 项目设置中可以配置告警规则例如当 5xx 错误率超过一定阈值时通过邮件、Slack 等渠道通知你。性能监控关注 Vercel 函数仪表板中的指标如调用次数、执行时长、内存使用量、冷启动次数。异常的性能数据可能预示着配置问题或后端服务性能下降。5.4 CORS 问题的终极解决跨域资源共享CORS是前端开发中的常见难题。使用反向代理的一个巨大优势就是可以彻底规避浏览器 CORS 限制。因为对于浏览器来说所有请求都是发往同一个源你的 Vercel 应用域名不存在跨域问题。在代理函数中你通常不需要设置复杂的 CORS 响应头如Access-Control-Allow-Origin。因为请求是同源的。但是如果你的代理函数本身也需要被其他域名的前端直接调用不推荐这会让代理暴露那么你仍需在代理函数的响应中添加适当的 CORS 头。6. 常见问题排查与调试技巧6.1 问题速查表问题现象可能原因排查步骤返回 404 Not Found1. 代理函数路由未正确配置。2. 请求路径与函数捕获路径不匹配。3. 目标服务器上该路径不存在。1. 检查pages/api/proxy/[...path].js文件是否存在且位置正确。2. 在本地使用vercel dev运行查看函数日志。3. 直接在代理函数内打印req.url和构建出的targetUrl确认拼接正确。4. 用 curl 或 Postman 直接测试目标 URL 是否可达。返回 502 Bad Gateway1. 目标服务器无法访问宕机、网络问题。2. 目标服务器返回了无效响应。3. 代理函数内部抛出未捕获的异常。1. 检查目标服务器地址环境变量是否正确。2. 检查目标服务是否正在运行且端口开放。3. 查看 Vercel 函数日志寻找具体的错误堆栈信息。4. 检查代理函数中是否有语法错误或运行时错误如未处理的 Promise rejection。返回 504 Gateway Timeout1. 目标服务器响应时间过长超过了代理函数或 fetch 的超时设置。2. 网络延迟极高。1. 增加fetch的超时时间但要小于 Vercel 函数的maxDuration。2. 优化后端服务性能。3. 考虑为耗时接口实现异步处理或在前端添加加载提示。请求体丢失或解析错误1. Next.js API Route 的bodyParser配置冲突。2. 代理函数未正确处理非 JSON 请求体如 FormData, 文件流。1. 检查export const config中的bodyParser设置。对于文件上传可能需要bodyParser: false并手动处理流。2. 在代理函数中打印req.headers[content-type]和req.body的类型确保匹配。Cookie 或 Session 失效1. 代理未正确转发Set-Cookie头。2.Set-Cookie头的Domain、Path、Secure属性与代理域名不兼容。1. 在代理函数中打印响应头检查Set-Cookie是否存在且内容正确。2. 在代理层重写Set-Cookie头移除或修改Domain属性确保Secure在 HTTPS 下为 true。内存不足错误 (OOM)1. 代理函数尝试缓存或处理过大的响应体。2. 流式处理未正确实现导致整个响应体被读入内存。1. 确保使用流式响应response.body.pipeTo或for await...of。2. 检查 Vercel 函数的内存配置必要时升级套餐。3. 对于已知的大响应考虑在前端或代理层进行分页或压缩。6.2 本地开发与调试心得在本地开发时使用vercel dev命令可以启动一个高度模拟生产环境的本地服务器。这是调试代理问题最有效的方式。日志输出在代理函数的关键节点如收到请求、构建目标 URL、发起 fetch 前、收到响应后使用console.log输出详细信息。这些日志会实时显示在vercel dev的终端里。环境变量在项目根目录创建.env.local文件定义你的TARGET_API_URL等本地环境变量。vercel dev会自动加载它们。网络工具配合使用浏览器的开发者工具Network 标签页和 Postman对比直接请求目标服务器和通过代理请求的差异重点关注请求头、响应头的不同。模拟慢速网络与错误可以临时修改代理代码人为制造超时或返回错误码测试前端应用的错误处理是否健壮。6.3 性能瓶颈分析与优化如果发现代理响应变慢可以按以下步骤排查定位延迟阶段在代理函数开始和结束处记录高精度时间戳计算总耗时。再在发起fetch前后记录时间戳计算网络往返耗时。如果总耗时长但网络耗时短问题可能在函数逻辑本身如果网络耗时长问题在目标服务器或网络链路。检查冷启动Serverless Function 的冷启动会带来额外的延迟通常 100ms-几秒。观察 Vercel 日志中的冷启动标记。对于要求低延迟的 API可以通过设置更短的函数超时时间、减小部署包体积、或使用更高性能的运行时如 Edge Functions来缓解。也可以配置一个定时任务如每分钟调用一次来“保温”函数。优化依赖与代码确保代理函数没有引入不必要的重型依赖。使用 Tree Shaking。对于核心的转发逻辑定期 review 代码看是否有可优化的循环或计算。6.4 应对后端服务变更当后端服务地址或 API 路径需要变更时你只需要更新 Vercel 环境变量或代理函数中的路由配置然后重新部署即可。这种解耦使得前端和后端的部署可以独立进行。为了更平滑地迁移你可以采用“蓝绿部署”策略在一段时间内同时配置新旧两个目标地址通过请求头中的一个特定标志如X-Backend-Version: v2让代理函数动态选择转发目标。前端可以先让小部分用户使用新版本头验证无误后再全面切换。这全部可以在代理层无感完成无需修改前端业务代码。经过以上从原理到实践从配置到安全从调试到优化的全面拆解gaboolic/vercel-reverse-fast所代表的这种 Vercel 反向代理模式其价值已经远超一个简单的“转发工具”。它成为了现代前端架构中一个灵活、强大且安全的“适配层”或“API 网关雏形”。它解放了前端对后端直接依赖的束缚使得技术选型、服务迁移、环境管理和安全加固都拥有了一个统一的控制点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2617278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…