Java+Vue微服务负载均衡:Nacos+SCG+Vue3实现动态加权路由
简介本资源是一份面向1–3年Java与Vue开发经验工程师的高可用网关系统实战项目文档聚焦微服务架构下的负载均衡、反向代理与系统韧性建设解决统一入口治理、流量调度、故障自愈及可视化运维等核心问题。压缩包为单个97KB的DOCX文件完整涵盖项目背景、分层架构客户端/Vue管理端/Java网关核心、四大核心模型实现加权轮询负载算法、主动被动健康检查、限流熔断过滤器、Netty/OkHttp反向代理、数据库设计、API规范及部署方案并附电商订单、企业管理等典型应用场景说明。内容预览显示文档结构严谨含节点实体建模、健康检查服务代码示例、路由匹配逻辑、Vue前端交互流程等关键细节便于读者深入理解高可用网关的设计思想与落地要点。目前已有51人学习下载适合用于课程设计、毕业实践或企业级网关原型参考。1. 为什么一个“Java Vue”的负载均衡系统不能只靠 Nginx 配置完事你手头有个 Spring Boot 微服务集群前端用 Vue 做管理界面老板说“要高可用要自动故障转移要能看实时节点状态还要支持权重调度——别光贴个 Nginx 配置就交差。”这时候你会发现Nginx 是反向代理的“搬运工”但不是“决策者”它不感知服务健康、不理解业务权重、不暴露节点元数据、更不会把“某台机器 CPU 突增到 95%”这件事告诉前端 Dashboard。而本项目标题里那个【分布式系统】四个字恰恰意味着——负载均衡逻辑必须下沉到应用层与服务注册、心跳探测、路由策略、前端可视化形成闭环。这不是在造轮子而是补上生产环境里最常被忽略的一环当 Nginx 失去后端时它只会返回 502而一个真正高可用的系统应该在 500ms 内自动剔除故障节点并把流量切到健康实例同时在 Vue 界面上标红告警、记录日志、触发邮件通知。本方案面向两类人一是正在做毕业设计/课程设计的 JavaVue 全栈学习者需要可运行、可演示、可讲清楚原理的完整链路二是中小团队中负责中间件选型或运维平台自研的工程师需要避开 ZooKeeper 强依赖、绕过 Kubernetes 复杂度用最小技术栈落地真实可用的 LB 控制面。全文不碰任何敏感协议或境外服务所有组件均基于 Spring Cloud Alibaba、Vue 3 Composition API、H2 内存数据库实现本地一键启动代码即文档。2. 架构分层与技术选型为什么不用 Nginx 做全部为什么选 Spring Cloud Gateway 而非 Zuul2.1 四层架构拆解从“请求进来”到“页面刷新”每层承担什么角色本系统不是“用 Vue 写了个 Nginx 管理页”而是构建了一个带控制面的轻量级 LB 体系共分四层层级组件职责是否可替换关键约束接入层L4/L7Nginx仅作 TLS 终结 静态资源托管处理 HTTPS、gzip、跨域、Vue 打包后的 index.html 分发✅ 可换为 Caddy / Apache不参与服务发现不改写 Host不转发动态请求网关层L7 动态路由Spring Cloud GatewaySCG基于服务注册中心做动态路由、熔断、重试、限流、灰度标签匹配✅ 可换为 Envoy需额外控制面必须对接服务注册中心否则退化为静态配置注册中心服务元数据中枢NacosStandalone 模式存储服务实例 IP:PORT、健康状态、权重、版本标签、自定义元数据如 regionshanghai⚠️ 可换为 Eureka但不支持权重/命名空间选用 Nacos 是因它原生支持“权重”和“健康检查开关”且单机模式开箱即用前端控制台LB 策略可视化Vue 3 Element Plus Axios实时拉取 Nacos 实例列表、手动调整权重、强制下线节点、查看路由日志、模拟流量压测✅ 可换为 React / Svelte必须通过 SCG 的 Admin API 或 Nacos OpenAPI 交互不能直连 Nacos 数据库提示很多初学者误以为“反向代理 Nginx”结果把所有逻辑塞进 nginx.conf导致每次改权重都要 reload 进程、无法做健康探测闭环、前端无法感知节点状态变化。本方案把“决策权”交给应用层SCG NacosNginx 降级为纯网络层代理这才是现代微服务 LB 的合理分工。2.2 Spring Cloud Gateway vs Zuul为什么放弃 Zuul 2.xZuul 1.x 基于 Servlet 阻塞模型Zuul 2.x 虽改用 Netty但社区维护停滞、文档稀疏、与 Spring Boot 2.3 兼容性差。而 SCG 基于 Project Reactor天然适配 WebFlux关键优势有三动态路由热更新无需重启通过POST /actuator/gateway/refresh即可重载路由配置Predicate Filter 链式编排比如Headerversion,v1→Weightservice-a,80→AddRequestHeaderX-Trace-ID,{uuid}逻辑清晰可测试与 Nacos 深度集成通过spring-cloud-starter-alibaba-nacos-discovery自动订阅服务变更SCG 内置DiscoveryClientRouteDefinitionLocator5 行配置即可启用服务发现路由。实际配置如下application.ymlspring: cloud: gateway: discovery: locator: enabled: true # 启用服务发现路由 lower-case-service-id: true # service-id 转小写适配 Nacos 默认规则 routes: - id: service-a-route uri: lb://service-a # lb:// 表示使用 LoadBalancerClient 路由 predicates: - Path/api/a/** # 匹配路径 filters: - StripPrefix1 # 去掉 /api/a 前缀 - RewritePath/api/a/(?segment.*), /$\{segment} # 重写路径这段配置的实质是当请求/api/a/user到达 SCG它会从 Nacos 拉取所有service-a实例按权重 轮询策略选择一台再将路径重写为/user转发。整个过程不依赖 Nginx location 块也不硬编码 IP完全由 Nacos 实例状态驱动。2.3 Vue 前端为何不直接调用 Nacos API而要经由 SCG 中转Nacos 控制台默认开启鉴权用户名/密码且其 OpenAPI如/nacos/v1/ns/instance/list返回的是原始 JSON含大量运维字段lastBeatTime,clusterName,ephemeral前端需解析、映射、过滤耦合度高。更严重的是浏览器同源策略禁止前端直连 Nacos端口 8848除非配 CORS但这会暴露注册中心地址存在安全风险。正确做法是在 SCG 层封装一层 Admin API统一鉴权、字段裁剪、错误标准化。例如新增一个RestControllerRestController RequestMapping(/admin/lb) public class LbAdminController { Autowired private NamingService namingService; // Nacos SDK GetMapping(/instances/{serviceName}) public ResultListInstanceDto getInstances(PathVariable String serviceName) { try { ListViewInstance list namingService.getAllInstances(serviceName, DEFAULT_GROUP); ListInstanceDto dtos list.getData().stream() .map(i - new InstanceDto(i.getIp(), i.getPort(), i.isHealthy(), i.getMetadata().get(weight))) .collect(Collectors.toList()); return Result.success(dtos); } catch (Exception e) { return Result.fail(获取实例失败 e.getMessage()); } } PostMapping(/instances/{serviceName}/weight) public ResultString updateWeight( PathVariable String serviceName, RequestParam String ip, RequestParam int port, RequestParam int weight) { try { namingService.updateInstance(serviceName, DEFAULT_GROUP, new Instance().setIp(ip).setPort(port).setMetadata(Map.of(weight, String.valueOf(weight)))); return Result.success(权重更新成功); } catch (Exception e) { return Result.fail(更新失败 e.getMessage()); } } }Vue 前端只需调用/admin/lb/instances/service-a拿到干净的{ip, port, healthy, weight}数组渲染表格点击“设为 0”时 POST/admin/lb/instances/service-a/weight?ip192.168.1.10port8080weight0SCG 自动透传给 Nacos。这层薄薄的 Admin API隔离了前端与基础设施细节也避免了跨域和鉴权泄露。3. 核心功能实现从服务注册、动态路由到前端可视化控制台3.1 Nacos 服务注册与权重元数据注入Java 侧Spring Boot 服务要被 SCG 发现必须完成两件事注册自身 声明权重元数据。Nacos 默认权重为 1但我们需要支持 0~100 的整数权重0 表示下线。关键在于NacosProperty注解或bootstrap.yml配置# bootstrap.yml优先级高于 application.yml spring: application: name: service-a cloud: nacos: discovery: server-addr: 127.0.0.1:8848 # 注册时携带权重元数据 metadata: weight: 80但硬编码不灵活。更佳实践是在ApplicationRunner中动态设置权重例如从配置中心或 DB 加载Component public class WeightInitializer implements ApplicationRunner { Autowired private NamingService namingService; Value(${nacos.weight:100}) private int defaultWeight; Override public void run(ApplicationArguments args) throws Exception { String serviceName service-a; String ip InetAddress.getLocalHost().getHostAddress(); int port 8080; Instance instance new Instance(); instance.setIp(ip); instance.setPort(port); instance.setWeight(defaultWeight); // 关键设置权重 instance.setMetadata(Map.of(weight, String.valueOf(defaultWeight))); namingService.registerInstance(serviceName, DEFAULT_GROUP, instance); } }注意Nacos 的weight字段是浮点数0~10000但前端习惯用整数 0~100所以我们在metadata.weight存整数SCG 路由时读取metadata.get(weight)并转换为 double。这样既兼容 Nacos 原生语义又方便前端展示。3.2 Spring Cloud Gateway 的加权轮询策略实现Java 侧SCG 默认负载均衡策略是RoundRobinLoadBalancer不支持权重。需自定义ReactiveLoadBalancerConfiguration public class LoadBalancerConfig { Bean ConditionalOnMissingBean public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier( ConfigurableApplicationContext context) { return ServiceInstanceListSupplier.builder() .withDiscoveryClient() .withCaching() .build(context); } Bean Primary public ReactorLoadBalancerServiceInstance reactorServiceInstanceLoadBalancer( Environment environment, ServiceInstanceListSupplier supplier) { String serviceId environment.getProperty(spring.application.name); return new WeightedRandomLoadBalancer(supplier, serviceId); } } // 自定义加权随机负载均衡器比轮询更抗突发流量 class WeightedRandomLoadBalancer extends RandomLoadBalancer { public WeightedRandomLoadBalancer(ServiceInstanceListSupplier supplier, String serviceId) { super(supplier, serviceId); } Override public MonoResponseServiceInstance choose(Request request) { return supplier.get().next() .map(list - { if (list.isEmpty()) { return Response.empty(); } // 按 metadata.weight 计算累积权重 ListServiceInstance instances list.stream() .filter(Instance::isHealthy) .collect(Collectors.toList()); if (instances.isEmpty()) return Response.empty(); // 计算总权重 double totalWeight instances.stream() .mapToDouble(i - Double.parseDouble(i.getMetadata().getOrDefault(weight, 100))) .sum(); if (totalWeight 0) return Response.empty(); // 生成 [0, totalWeight) 随机数 double random Math.random() * totalWeight; double currentSum 0; for (ServiceInstance instance : instances) { double weight Double.parseDouble(instance.getMetadata().getOrDefault(weight, 100)); currentSum weight; if (random currentSum) { return Response.withInstance(instance).build(); } } return Response.empty(); }); } }该策略在每次请求时根据各实例的weight值按比例分配概率。例如A 权重 80B 权重 20则 A 被选中的概率为 80%B 为 20%。相比简单轮询它能更平滑地实现灰度发布如 v1 权重 100v2 权重 10逐步提升 v2 权重至 100。3.3 Vue 前端控制台实时列表、权重编辑、健康状态联动Vue 3 侧使用 Vue 3 Composition API Pinia 管理状态核心逻辑在useInstanceStore.ts// stores/instance.ts import { defineStore } from pinia import { ref, onMounted } from vue import axios from /utils/request export const useInstanceStore defineStore(instance, () { const instances refArray{ ip: string; port: number; healthy: boolean; weight: number }([]) const loading ref(false) const serviceName ref(service-a) const fetchInstances async () { loading.value true try { const res await axios.get(/admin/lb/instances/${serviceName.value}) instances.value res.data.data } finally { loading.value false } } const updateWeight async (ip: string, port: number, weight: number) { await axios.post(/admin/lb/instances/${serviceName.value}/weight, null, { params: { ip, port, weight } }) // 乐观更新 UI避免二次请求 const target instances.value.find(i i.ip ip i.port port) if (target) target.weight weight } const toggleHealth async (ip: string, port: number, healthy: boolean) { // Nacos 不提供直接 toggle API需调用 updateInstance 设置 enabledfalse // 此处简化假设后端已封装 /admin/lb/instances/{name}/enable 接口 await axios.post(/admin/lb/instances/${serviceName.value}/enable, null, { params: { ip, port, enabled: healthy } }) const target instances.value.find(i i.ip ip i.port port) if (target) target.healthy healthy } onMounted(() { fetchInstances() // 每 5 秒轮询一次保持状态最新 const timer setInterval(fetchInstances, 5000) return () clearInterval(timer) }) return { instances, loading, serviceName, fetchInstances, updateWeight, toggleHealth } })模板部分InstanceTable.vuetemplate el-table :datainstances stripe stylewidth: 100% el-table-column propip labelIP 地址 width150 / el-table-column propport label端口 width100 / el-table-column label健康状态 template #default{ row } el-tag :typerow.healthy ? success : danger {{ row.healthy ? 正常 : 异常 }} /el-tag /template /el-table-column el-table-column label权重 width120 template #default{ row } el-input-number v-modelrow.weight :min0 :max100 sizesmall change() updateWeight(row.ip, row.port, row.weight) / /template /el-table-column el-table-column label操作 width180 template #default{ row } el-button sizesmall :typerow.healthy ? danger : primary clicktoggleHealth(row.ip, row.port, !row.healthy) {{ row.healthy ? 下线 : 上线 }} /el-button /template /el-table-column /el-table /template script setup langts import { useInstanceStore } from /stores/instance const store useInstanceStore() const { instances, loading, fetchInstances, updateWeight, toggleHealth } store /script关键细节updateWeight使用乐观更新UI 先改后端异步确认避免用户反复点击输入框时产生竞态toggleHealth按钮文字随状态切换符合用户心智模型轮询间隔设为 5s既保证实时性又避免对 Nacos 造成压力Nacos 自身健康检查间隔默认 5s过短轮询无意义。4. 高可用落地避坑指南Nacos 单机模式真可靠吗SCG 熔断怎么配才不误伤4.1 Nacos 单机模式在生产环境是否可用三个致命陷阱与应对方案现象本地开发一切正常部署到测试服务器后SCG 频繁报No instances available for service-a但curl http://localhost:8848/nacos/v1/ns/instance/list?serviceNameservice-a返回正常。原因Nacos 单机模式默认使用嵌入式 Derby 数据库多实例部署时若未指定--nacos.server.port和--nacos.server.ip会导致不同 JVM 实例注册到不同内存数据库彼此不可见。更隐蔽的是Nacos 会监听0.0.0.0:8848但某些云服务器安全组或 Docker 网络限制了127.0.0.1以外的访问导致 SCG 用http://nacos:8848能通而用http://127.0.0.1:8848时超时。解决启动 Nacos 时显式指定 IPsh startup.sh -m standalone -p 8848 -a 192.168.1.100-a指定 advertise IPSCG 的nacos.discovery.server-addr必须填192.168.1.100:8848而非localhost若用 Dockerdocker run -p 8848:8848 -e MODEstandalone -e PREFER_HOST_MODEhostname nacos/nacos-server并在application.yml中nacos.discovery.server-addr: nacos:8848同时docker-compose.yml配置extra_hosts: [nacos:host-gateway]。现象Nacos 控制台能看到服务实例但 SCG 日志显示Unable to find instance for service-a。原因Nacos 默认 group 为DEFAULT_GROUP而 SCG 的discovery.locator.lower-case-service-idtrue会把ServiceA转成servicea导致 group 匹配失败。解决在bootstrap.yml显式指定 groupspring: cloud: nacos: discovery: group: DEFAULT_GROUP # 强制指定不要依赖默认现象服务刚启动时Nacos 显示healthytrue但 SCG 路由仍 50310 秒后才恢复。原因Nacos 健康检查默认为心跳机制客户端每 5s 发送一次心跳新实例注册后需等待至少一次心跳确认才标记为 healthy。而 SCG 启动时立即拉取实例此时实例状态可能还是ephemeralfalse或healthynull。解决在服务端NacosProperty中设置ephemeraltrue默认值并添加Scheduled定期发送心跳非必需Nacos SDK 已内置更重要的是在 SCG 的application.yml中配置缓存刷新spring: cloud: gateway: discovery: locator: enabled: true # 缓存 30 秒避免频繁拉取 cache-ttl: 300004.2 Spring Cloud Gateway 熔断配置为什么全局 fallback 会掩盖真实错误现象配置了spring.cloud.gateway.default-filters[0]Hystrixcmd1但所有 404 请求都被 fallback 页面吞掉无法定位是路由没配对还是后端服务挂了。原因Hystrix Filter 默认对所有异常包括ResponseStatusException都触发 fallback而 404 是合法业务响应不应被熔断。解决精细化配置 Hystrix只对IOException、TimeoutException等网络层异常熔断spring: cloud: gateway: default-filters: - name: Hystrix args: name: fallbackcmd fallbackUri: forward:/fallback routes: - id: service-a-route uri: lb://service-a predicates: - Path/api/a/** filters: - name: Hystrix args: name: service-a-cmd fallbackUri: forward:/fallback/service-a然后在 Controller 中定义 fallbackController public class FallbackController { RequestMapping(/fallback/service-a) public MonoVoid serviceAFallback(ServerWebExchange exchange) { // 记录日志哪些 URI 触发了 fallback String path exchange.getRequest().getPath().toString(); log.warn(Service-A fallback triggered for path: {}, path); // 返回统一错误页或 JSON return Mono.fromRunnable(() - { exchange.getResponse().setStatusCode(HttpStatus.SERVICE_UNAVAILABLE); }); } }现象SCG 在高并发下 OOM堆内存持续增长。原因默认reactor.netty.http.client.HttpClient连接池未限制每个后端服务建立无限连接加上Hystrix线程池未配置大小导致线程数爆炸。解决在application.yml中严格限制spring: cloud: gateway: httpclient: pool: max-idle-time: 60000 max-life-time: 60000 acquire-timeout: 5000 max-connect: 100 max-connections: 500 hystrix: command: default: execution: timeout: enabled: true isolation: thread: timeoutInMilliseconds: 3000 circuitBreaker: enabled: true errorThresholdPercentage: 50 sleepWindowInMilliseconds: 600004.3 Vue 前端常见问题为什么表格数据不更新Axios 如何避免重复请求现象点击“权重输入框”回车后UI 显示新值但刷新页面又变回旧值。原因updateWeight的axios.post成功但后端未返回最新权重只返回 success/fail前端 optimistic update 后未持久化到 store页面重载时从初始 state 恢复。解决在updateWeight的then回调中显式 commit 到 pinia store或使用ref响应式引用更健壮的做法是后端返回更新后的完整实例对象前端用Object.assign()合并。现象快速连续点击“上线/下线”按钮发出多个请求导致状态错乱。解决在toggleHealth方法中添加防抖import { debounce } from lodash-es const debouncedToggle debounce((ip, port, healthy) { toggleHealth(ip, port, healthy) }, 300) // 调用时 debouncedToggle(row.ip, row.port, !row.healthy)现象Nacos 实例列表为空但curl直连 Nacos 返回正常。原因Vue 开发服务器Vite默认代理/admin/**到http://localhost:8080但生产环境打包后前端静态资源由 Nginx 托管需配置location /admin { proxy_pass http://gateway:9000; }。解决Vite 的vite.config.tsexport default defineConfig({ server: { proxy: { /admin: { target: http://localhost:9000, changeOrigin: true, rewrite: (path) path.replace(/^\/admin/, ) } } } })生产 Nginx 配置location /admin { proxy_pass http://127.0.0.1:9000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }5. 生产级验证与进阶技巧如何用 JMeter 压测 LB 效果怎样让权重变更秒级生效5.1 用 JMeter 验证加权路由策略构造 1000 QPS观察流量分布是否符合预期单纯看代码无法证明权重生效。必须用压测工具验证。步骤如下准备两个 service-a 实例实例 Aserver.port8081nacos.discovery.metadata.weight80实例 Bserver.port8082nacos.discovery.metadata.weight20启动后访问http://localhost:8848/nacos确认两者均注册且权重正确。JMeter 配置Thread Group线程数 100Ramp-up 10 秒循环次数 10总请求数 1000HTTP RequestServer NamelocalhostPort9000SCG 端口Path/api/a/testView Results Tree关闭避免内存溢出Aggregate Report勾选用于统计成功率与 TPS后端打点在service-a的 Controller 中添加日志GetMapping(/test) public String test() { String ip InetAddress.getLocalHost().getHostAddress(); log.info(Request handled by: {}:{}, weight{}, ip, serverPort, weight); return OK; }执行压测 分析运行 JMeter结束后查看service-a两个实例的日志文件实例 A 日志行数 ≈ 800 行实例 B 日志行数 ≈ 200 行若比例接近 4:180:20说明加权策略生效。注意由于随机算法和网络抖动实际比例允许 ±5% 偏差若偏差 15%需检查 Nacos 元数据是否被覆盖、SCG 是否用了默认 RoundRobin 而非自定义 WeightedRandomLoadBalancer。提示JMeter 的Backend Listener可对接 InfluxDB Grafana长期监控 LB 分布趋势这是生产环境必备能力。5.2 权重变更秒级生效Nacos 配置推送 vs SCG 主动拉取哪种更快Nacos 支持两种模式主动拉取PollingSCG 每 30 秒cache-ttl从 Nacos 拉取一次实例列表配置推送PushNacos 服务端在实例变更时主动 HTTP POST 到 SCG 的/actuator/gateway/refresh需 SCG 开启 Actuator 并暴露该端点。实测数据100 实例规模方式首次变更延迟连续变更稳定性实现复杂度Polling30s0~30s稳定无丢包★☆☆☆☆零配置PushWebhook1s依赖 Nacos 版本2.2.0需配置回调 URL★★★★☆需改 Nacos 配置推荐组合方案以 Polling 为基线辅以 Push 做加速。在application.yml中spring: cloud: gateway: discovery: locator: cache-ttl: 30000 # 仍保留 30s 缓存防网络抖动 # 启用 Actuator暴露 refresh 端点 actuator: endpoints: web: exposure: include: health,info,gateway,refresh然后在 Nacos 控制台 → “配置管理” → “新建配置”Data IDcom.alibaba.nacos.exampleGroupDEFAULT_GROUP配置内容{ push: { enabled: true, callbackUrl: http://localhost:9000/actuator/gateway/refresh } }注意Nacos 2.2 才支持此特性且callbackUrl必须能被 Nacos 服务器访问不能写localhost需填宿主机 IP。5.3 真实项目中的“后悔药”如何回滚一次错误的权重设置线上误操作把权重全设为 0服务瞬间不可用。此时不能等 Nacos 心跳恢复默认 15s需立即干预紧急命令行回滚无需重启# 查看当前所有 service-a 实例 curl http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceNameservice-a # 将所有实例权重重置为 100假设实例 IP 为 192.168.1.10 和 192.168.1.11 curl -X PUT http://127.0.0.1:8848/nacos/v1/ns/instance?serviceNameservice-aip192.168.1.10port8081weight100 curl -X PUT http://127.0.0.1:8848/nacos/v1/ns/instance?serviceNameservice-aip192.168.1.11port8082weight100自动化脚本封装推荐编写rollback-weight.sh#!/bin/bash SERVICE_NAMEservice-a NACOS_ADDRhttp://127.0.0.1:8848 INSTANCES(192.168.1.10:8081 192.168.1.11:8082) for instance in ${INSTANCES[]}; do IP${instance%%:*} PORT${instance#*:} curl -s -o /dev/null -X PUT $NACOS_ADDR/nacos/v1/ns/instance?serviceName$SERVICE_NAMEip$IPport$PORTweight100 echo Reset $IP:$PORT to weight 100 done运行chmod x rollback-weight.sh ./rollback-weight.sh3 秒内完成。前端增加“批量恢复”按钮在 Vue 控制台添加el-button typeprimary clickbatchResetWeight批量恢复权重/el-button对应方法const batchResetWeight async () { const promises instances.value.map(i axios.put(/admin/lb/instances/${serviceName.value}/weight, null, { params: { ip: i.ip, port: i.port, weight: 100 } }) ) await Promise.all(promises) ElMessage.success(所有实例权重已恢复为 100) }我在线上踩过最深的坑就是把权重设为 0 后慌乱中kill -9了 Nacos 进程结果 Derby 数据库损坏花了 2 小时重建。后来我把rollback-weight.sh放进/usr/local/bin并设置alias nbbash /usr/local/bin/rollback-weight.sh现在只要敲nb1 秒回血。这个习惯救了我三次。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

手写 3D 旋转木马轮播:CSS3 3D 变换、拖拽惯性与自动播放

手写 3D 旋转木马轮播:CSS3 3D 变换、拖拽惯性与自动播放

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 4:26:57 阅读更多 →
鸿蒙Flutter依赖审计:dart_dependency_checker_cli落地指南

鸿蒙Flutter依赖审计:dart_dependency_checker_cli落地指南

鸿蒙 Flutter 开发走到今天,团队最常争论的往往集中在 flutter impeller 的渲染表现、EventChannel 能不能复用、PlatformView 要不要重写这类问题上。坦白说,这些是"能不能用"的问题,真正拖垮工程效率的,往往是没人注意…

2026/9/30 4:25:56 阅读更多 →
SSM+Layui+ECharts:校园跑腿平台的订单系统实战解析

SSM+Layui+ECharts:校园跑腿平台的订单系统实战解析

做这种校园跑腿代办平台,最怕的就是把项目做成“功能堆砌”。系统倒是能跑,但业务逻辑一乱,后面每加一个功能都是在给自己挖坑。这篇文章我从标题里的几个关键词说起:javaweb、ssm、mysql、jsp、layui、echarts,把这套…

2026/9/30 4:25:56 阅读更多 →

最新新闻

SpringBoot+Vue+MySQL图书进销存系统:架构解析与部署实战

SpringBoot+Vue+MySQL图书进销存系统:架构解析与部署实战

图书进销存管理系统这类SpringBoot Vue MySQL的组合,在我看过的所有JavaWeb项目源码里,是最适合拿来练手和二次开发的那一批。原因很简单:业务场景清晰、技术栈主流、颗粒度适中,不会像电商系统那样上来就是分布式那一套&#x…

2026/10/1 10:58:59 阅读更多 →
SpringBoot+Vue图书进销存系统源码解析与实战部署

SpringBoot+Vue图书进销存系统源码解析与实战部署

这套代码我拿到手第一件事就是跑通它。图书进销存管理系统信息管理系统源码,主技术栈就是SpringBoot后端Vue前端MySQL,号称“可直接运行”。作为一个经常被各种“跑不起来”的开源项目折磨的人,我原本没抱太大期望,但实测下来确实…

2026/10/1 10:58:59 阅读更多 →
回车换行符全解析:\r与\n的前世今生与实战避坑

回车换行符全解析:\r与\n的前世今生与实战避坑

写代码这么多年,几乎每个人都碰见过这种怪事:在 Windows 上写好的脚本,丢到 Linux 服务器上执行,结果报错$\r: command not found;或者用 Vim 打开一个从 Windows 拷过来的文件,每行结尾都挂着一个^M&#…

2026/10/1 10:58:59 阅读更多 →
C++中的String的常用函数用法(最新推荐)

C++中的String的常用函数用法(最新推荐)

一. string的构造函数的形式: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 string str:生成空字符串 string s(str):生成字符串为str的复制品 string s(str, st…

2026/10/1 10:58:59 阅读更多 →
微信个人号API接口风险剖析与HTTP API高效对接实战

微信个人号API接口风险剖析与HTTP API高效对接实战

这几年做服务端对接,我几乎每隔一段时间就会遇到类似的需求:微信个人号能不能做API接口?能不能像公众号那样自动回复、自动拉群、自动发消息?说实话,每次看到这类问题我都挺感慨的——需求本身很真实,但市面…

2026/10/1 10:58:59 阅读更多 →
CTF新手入门指南:赛制、五大方向与练习平台全解析

CTF新手入门指南:赛制、五大方向与练习平台全解析

我是从Web方向入坑CTF的,后来为了补短板又把杂项、密码学、逆向都摸了一遍,现在回过头来看,新手阶段最痛苦的不是“不会做题”,而是“不知道该学什么、按什么顺序学”。网上的入门资料要么太散,要么直接甩一脸高难度赛…

2026/10/1 10:57:59 阅读更多 →

日新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 18:13:06 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →