新闻详情

新闻详情

首页 / 资讯中心 / 详情

基于Nacos的轻量级分布式任务调度:替代XXL-JOB的优雅实践

发布时间:2026/9/26 12:23:36来源:尧图网络
基于Nacos的轻量级分布式任务调度:替代XXL-JOB的优雅实践
前一阵老同事跟我抱怨他们项目里挂着XXL-JOB为了几十个定时任务专门维护了一套调度中心MySQL、执行器、控制台页面全得伺候着。尤其是微服务化之后每个服务都想塞自己的任务后台页面一个月也点不了几次却要专门养一套调度平台怎么看都别扭。我就跟他说你们已经在用Nacos做注册中心和配置中心了为什么不把任务调度这块也做轻点顺着这个思路我给他设计了一套基于Nacos的优雅调度方案跑了半年多整体体验比XXL-JOB清爽不少。这篇文章就把这套方案的设计思路、核心实现和踩坑记录完整写出来给正在纠结要不要“扔掉”XXL-JOB的团队一个参考。这篇文章适合三类人一是任务量不算大、但不想为调度单独维护一套系统的中小团队二是已经在用Nacos做注册和配置、想顺手把调度能力长在现有基础设施上的同学三是对分布式任务调度的内部机制感兴趣、想搞明白“为什么能跑”的开发者。不管你是后端开发还是架构师读完都能直接照着落地或者至少能帮你判断这个方案到底适不适合你的场景。1. 先聊聊为什么要动 XXL-JOB 的念头1.1 XXL-JOB 到底“重”在哪XXL-JOB 本身很优秀企业里用得也广这是事实。调度中心、执行器、任务管理、告警、日志、路由策略、分片广播该有的功能全都有。但“全”也意味着“重”。我见过太多项目实际在跑的定时任务不超过二十个却照样要部署一套XXL-JOB调度中心背后再挂一个专用MySQL库还要考虑调度中心的高可用、执行器的接入配置、权限账号等等。这些运维成本摊到每一个任务头上就非常不划算了。另外一个问题是开发和调试链路长。你在业务服务里写一个定时任务得先引入XXL-JOB的SDK实现它的Handler接口然后去调度中心后台页面手动注册任务、填Cron表达式、设置路由策略、启动任务。改一次Cron还得登录控制台操作完还要等调度中心刷新。这套流程在项目早期还能接受一旦任务数量上来维护成本是成倍增长的。还有一个容易让人忽略的点XXL-JOB调度中心本身也是一个需要升级、打补丁、监控的系统。调度中心挂了所有任务全停这跟“轻量”一点关系都没有。对很多中小团队来说为了二十个任务养一个关键基础设施风险其实是被放大了的。1.2 轻量调度方案要解决的三件事我当时给自己定了三个目标算是替代XXL-JOB的最低标准。第一个目标是零额外部署调度能力要长在现有业务服务里不引入新的独立组件。第二个目标是配置要能热更新改Cron、调参数、启停任务不能老让我上控制台点鼠标最好改配置就能生效。第三个目标是分布式环境下不能重复执行多实例部署是常态同一个任务同一时刻只能被一个节点真正执行。这三个目标其实指向同一个答案一套自研的、基于注册中心和配置中心的轻量调度框架。Nacos 恰好同时具备注册中心和配置中心两种能力天然就是我们需要的底座。于是方案就清晰了执行器节点注册到Nacos任务配置存放在Nacos配置中心调度器通过监听配置和服务实例的变化来触发任务。整套东西没有一台额外的调度服务器没有一套额外的数据库完全站在现有的基础设施之上。2. 为什么偏偏是 Nacos不是别的2.1 Nacos 的两个核心能力正好对路先简单拆一下Nacos它本质上是“注册中心 配置中心”二合一。注册中心负责服务实例的管理服务启动时把自己注册进去其它服务通过它发现对方实例下线能自动摘除。配置中心负责配置的集中管理与推送配置改了之后客户端能实时感知不用重启服务。这两个能力放在调度场景里简直是对口定制的。执行器就是普通服务天然要被注册中心管理任务的Cron表达式、超时时间、重试次数、负责人这些元数据本质上就是配置天然应该放在配置中心。我之前也想过用Redis的延迟队列或者直接自己写数据库任务表来做但无一例外都需要额外维护一套状态存储而Nacos方案把这些全部吃进现有组件里几乎零额外依赖。还有一个实际的好处是环境隔离。Nacos有命名空间Namespace的概念dev、test、prod各用一个Namespace任务配置天然隔离。我在测试环境随便折腾任务参数永远不会误伤生产。这一点在XXL-JOB里虽然也能做但你要么搭多套环境要么自己维护一套复杂的权限模型Nacos属于顺手就解决了。2.2 Nacos 与 Consul、Zookeeper 的取舍热搜词里很多人搜“consul和nacos的区别”说明不少团队在注册中心选型上犹豫过。确实Consul和Zookeeper也都能做服务发现但要是拿来做调度底座差距就出来了。Consul的服务发现能力很强也有KV存储但它的配置管理体验一般与Spring Cloud的集成不如Nacos原生。Zookeeper的强一致性是优势可它并没有面向配置中心场景做优化你在Zookeeper上改一个配置还要自己实现监听逻辑和数据版本管理。Nacos是阿里开源之后经过大量生产环境验证的对Spring Boot开发者最友好控制台也自带配置编辑、版本回滚、监听查询省掉很多自己造轮子的时间。调度场景还有一个微妙的点我们需要的不光是“发现服务”还需要“获取最新任务配置”和“感知配置变更”。这两个功能在Nacos里是同一套体系Data ID Group Listener而在Consul或Zookeeper上你得分别从KV和Watch两块拼凑复杂度就上去了。所以我的结论很直接如果只是选注册中心三者各有千秋但要做“注册 配置 动态感知”的综合底座Nacos目前是最顺手的。2.3 整体架构调度器、执行器与配置中心怎么配合整套方案里有三个角色说完你们就懂了。角色一是调度器Scheduler可以理解为一个常驻在业务服务里的调度线程池它负责读配置、算时间、选节点、发请求。角色二是执行器Executor就是真正执行任务逻辑的业务服务它启动时把自身注册到Nacos并提供一个HTTP接口接收任务请求。角色三是Nacos本身它同时扮演“通讯录”和“任务档案库”两个角色。任务触发的主流程是这样的调度器在启动时从Nacos配置中心拉取任务配置列表本地维护一个“时间轮 定时扫描”的下一触发时间队列到点了调度器从Nacos注册中心获取对应执行器服务的实例列表按负载均衡策略选一个实例发起HTTP调用执行器收到请求后校验幂等真正跑业务逻辑再把结果返给调度器。因为调度器本身也是可以多实例部署的所以触发前需要抢锁或靠数据库兜底去重避免两个调度器同时触发同一个任务这一点后面专门展开。为什么这个架构“优雅”因为它把原来XXL-JOB里独立的调度中心角色直接降维成了业务服务里的一个模块。调度器无状态挂了重新拉起就行因为任务配置都持久化在Nacos里执行器节点弹性伸缩增加一个实例就自动被调度器发现下线就自动被摘除不需要人工维护节点列表。3. 核心设计注册、配置、触发、幂等一个都不能少3.1 执行器节点如何注册与感知执行器端要做的事情很纯粹就是把自身作为一个普通微服务注册到Nacos。这里用的是Nacos的临时实例ephemeraltrue模式每隔5秒发一次心跳。如果某个实例挂了Nacos会在15秒内把它标记为不健康调度端就能自动避开它。这里有个细节值得注意调度器不应该每次触发任务时都实时调接口查服务列表而是应该通过Nacos的订阅机制本地维护一份实例缓存。Nacos客户端提供了EventListener接口实例列表变化时主动推给订阅方这样调度器能即时感知又不用频繁请求Nacos服务器。用这种方式执行器从启动注册到能被调度器选中整个过程基本在秒级比手动维护节点列表可靠得多。负载均衡策略方面我在方案里默认实现了轮询和随机两种。因为很多执行器实例性能有差异后面还可以根据Nacos的权重配置权重默认1做加权随机这个跟老项目里用Ribbon做负载均衡是一个思路。对于任务量大的场景还可以用一致性哈希按任务ID固定打到指定实例上方便缓存复用实现成本也不高。3.2 任务配置如何存放与热更新任务配置我放在Nacos配置中心使用YAML格式Data ID的规则是schedule-tasks-${spring.profiles.active}.yamlGroup统一用DEFAULT_GROUP。配置内容大概长这样tasks: - taskId: order_timeout_close name: 订单超时关闭 cron: 0 0/5 * * * ? executorService: task-executor executorMethod: closeTimeoutOrder timeoutMs: 30000 retryCount: 2 enabled: true每个任务的字段都有明确含义taskId是全局唯一标识cron是触发表达式executorService是执行器的服务名executorMethod是执行器端的方法名timeoutMs是超时时间retryCount是失败重试次数enabled控制是否启用。之所以不用简单的“固定间隔秒数”是因为真实业务里“每天凌晨两点跑报表”“每个整点清一次缓存”这类需求太常见Cron是最通用的表达方式。热更新实现起来也不复杂。调度器启动时第一次拉取配置同时注册一个Nacos配置监听器。一旦Nacos控制台里有人修改了配置并发布监听器会立刻被触发调度器在本地把任务列表重新加载一遍。改Cron、加任务、停任务全部通过改配置完成业务服务完全不用重启。我在实际使用中特别依赖这一点有一次报表任务的执行时间要推后半小时我直接在Nacos控制台改了配置几秒钟后调度效果就变了体验比登XXL-JOB后台再手动编辑任务好太多。3.3 触发器怎么避免重复执行多实例部署最怕的就是重复调度。调度器如果也部署了两个实例到点之后两个实例都去触发同一个任务业务逻辑就被执行了两遍。解决这个问题有几个层次。第一层是减少触发窗口的竞争调度器内部把“下一次触发时间”的计算做得足够精确但两个实例各自的时钟总有偏差不能完全靠这个。第二层是触发前做一个分布式互斥常见做法是Redis的setnx锁或者MySQL的行锁。由于这套方案主打“不引入额外组件”我更推荐在有数据库兜底的场景下用一张任务执行记录表来天然去重。我的做法是调度器触发任务前先给本次触发生成一个批次ID由taskId 时间窗口组成请求执行器时带上批次ID。执行器端在执行业务逻辑前把批次ID写入数据库的一张独立去重表字段上建唯一索引。如果插入成功说明是第一次执行如果插入冲突说明其它节点已经执行过了直接返回“重复触发”。这样哪怕两个调度器同时触发真正执行业务的只有一个节点。当然如果你的团队里有现成的Redis也可以用Redis做锁性能更好但本质上都是“触发前先PK”的思路。幂等设计必须放在执行器端调度器端的锁做得再好也无法100%保证网络超时引发的那种“请求发出去但没收到响应然后重试”的边界情况只有执行器端有能力做最终兜底。3.4 执行结果、失败重试与负载均衡执行器收到调度请求后业务逻辑跑完会返回一个标准结果结构是否成功、执行耗时、错误信息。调度器端收到结果后根据配置的retryCount决定是否重试。重试时不会选择刚才失败的同一个实例而是摘掉坏节点换个实例再试等于同时实现了失败重试和负载均衡。超时的处理也很关键。HTTP调用不能无限等下去我建议调度器对每次调用设置一个Future超时时间默认30秒。如果超过timeoutMs还没返回直接判断本次触发失败按重试策略处理。这里有个坑超时后业务逻辑可能还在另一个线程里继续跑所以重试时一定要确保执行器端幂等否则同一条数据会被处理两次。我在生产环境遇到过典型的案例一个扣库存任务超时了调度器重试执行器没有做幂等校验结果库存被多扣了一次。后来把批次ID去重机制加上这个坑才算填平。分片广播和动态分片在XXL-JOB里是核心卖点但在轻量方案里我暂时没有实现完整版。如果你的场景需要大任务拆分比如“把全量用户数据按ID区间拆成10片10个实例各跑一片”可以在调度器触发时下发“当前实例总数和当前分片序号”执行器根据自己的序号取对应数据。实际上Nacos的服务列表本身就提供了实例数量和索引实现分片只需要在触发请求里加两个字段真要做的难度并不高。4. 落地实操Spring Boot 集成与关键代码4.1 版本选择与环境准备踩过的坑先说先说版本选择这块真的坑很多。Nacos 2.x相比1.x变化很大尤其在通信协议上客户端和服务端版本差异过大会出现各种莫名其妙的问题。我建议服务端直接用Nacos 2.2.3或2.3.2这两个版本稳定性在社区里验证得比较多。别一上来就追最新版我见过有人用2.5.x版本在ARM环境的盒子上起不来的情况排查半天是版本兼容问题换回2.3.2立刻就好了。数据库方面Nacos 2.x的元数据存储默认需要MySQL内置脚本在MySQL 8.0上没有问题但你要是用MySQL 8.4.x就得稍微留意下驱动兼容和建表脚本执行。我平时都是先手动执行官方提供的nacos-mysql.sql建表脚本再启动Nacos避免自动初始化时权限不足导致建表失败。Windows本地开发时直接用startup.cmd -m standalone启动单机模式日志和配置都看一眼启动输出第一次经常会因为端口被占用或者没有配置JDK路径起不来。另外注意Nacos 2.x的客户端不仅连接8848端口做HTTP底层还会用gRPC协议走9848端口。防火墙如果只放行8848客户端能连上控制台但注册和订阅时会报错这是一个非常容易忽略的问题。如果你在公司内网环境一定要把9848端口一并放开。4.2 引入依赖与配置文件我们用的是Spring Boot 2.7.x Spring Cloud Alibaba 2021.x这套组合对应Nacos client 2.x。如果你们的Spring Boot版本更高记得选对应的Spring Cloud Alibaba版本版本不配套时配置中心的很多新特性会失效。dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId /dependency dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-config/artifactId /dependencyapplication.yml里核心配置就这几项spring: application: name: order-service cloud: nacos: discovery: server-addr: 127.0.0.1:8848 namespace: prod group: DEFAULT_GROUP config: server-addr: 127.0.0.1:8848 namespace: prod group: DEFAULT_GROUP file-extension: yaml shared-configs: ->Component public class ScheduleBootstrap implements ApplicationRunner { private final ScheduledExecutorService scheduler Executors.newScheduledThreadPool(4); private volatile MapString, TaskDefinition taskMap new ConcurrentHashMap(); Override public void run(ApplicationArguments args) { loadAndListenConfig(); scheduler.scheduleWithFixedDelay(this::scanAndTrigger, 1, 1, TimeUnit.SECONDS); } private void scanAndTrigger() { long now System.currentTimeMillis(); taskMap.forEach((taskId, task) - { if (!task.isEnabled()) return; long nextTriggerTime CronExpression.nextTime(task.getCron(), now); if (nextTriggerTime now) { triggerTask(task, now); } }); } }触发方法里要生成批次ID、选实例、发HTTP、处理结果。我把选实例的逻辑放在Nacos里做订阅缓存自己维护一份健康实例列表不实时查Nacos保障触发链路的高性能。private void triggerTask(TaskDefinition task, long triggerTime) { String batchId task.getTaskId() triggerTime; ListInstance instances instanceCache.get(task.getExecutorService()); if (instances.isEmpty()) { log.warn(执行器服务 {} 无可用实例, task.getExecutorService()); return; } Instance target loadBalance.select(instances, task.getTaskId()); TaskTriggerRequest request new TaskTriggerRequest(task, batchId); boolean success invoke(target, request); int retry 0; while (!success retry task.getRetryCount()) { instances.remove(target); target loadBalance.select(instances, task.getTaskId()); success invoke(target, request); retry; } }这里用触发时间戳作为批次ID的一部分非常实用。同一个任务在同一个时间窗口只会有一个合法的批次ID后面的重试、幂等、日志追踪全都可以围绕这个ID展开。4.4 执行器端核心实现幂等与业务执行执行器端更简单本质上就是把一个HTTP接口暴露给调度器使用。接口收到请求后先拿批次ID做幂等校验通过之后反射调用具体的方法最后返回统一格式的执行结果。RestController RequestMapping(/internal/task) public class TaskExecutorController { PostMapping(/trigger) public TaskTriggerResponse trigger(RequestBody TaskTriggerRequest request) { if (!idempotentChecker.tryMark(request.getBatchId())) { return TaskTriggerResponse.duplicated(); } try { Object executor applicationContext.getBean(request.getExecutorMethod()); Method method executor.getClass().getMethod(request.getExecutorMethod()); method.invoke(executor); return TaskTriggerResponse.success(); } catch (Exception e) { log.error(任务执行异常, taskId{}, batchId{}, request.getTaskId(), request.getBatchId(), e); return TaskTriggerResponse.failure(e.getMessage()); } } }幂等检查我用的是一张简单的数据库表字段只有主键批次ID和创建时间。这个表会越来越大所以我写了一个定时清理任务只保留最近7天的批次记录。关于幂等有一点要提醒如果业务方法本身需要操作数据库最好把幂等检查写入和业务操作放在同一个数据库事务里否则存在“幂等标记写成功了但业务还没跑完重试请求来了发现标记已经存在就直接返回”的窗口期导致任务实际没执行。我当时把幂等表插入和业务主流程放在同一个事务方法里才彻底解决这个问题。4.5 动态更新任务改配置就是改调度整套方案最直观的体验就是修改任务配置不用重启服务。比如我要新增一个“清理临时文件”的任务只需要在Nacos控制台编辑schedule-tasks-prod.yaml在tasks列表末尾加一段配置然后发布。调度器端的监听器会在几秒内收到配置变更通知重新加载任务列表新任务立即生效。为了在代码里能看到配置是否真的刷新了我每次重新加载配置时会打印一条日志EventListener public void onConfigChange(RefreshScopeRefreshedEvent event) { log.info(任务配置已刷新, 当前任务数: {}, taskMap.size()); }日志输出了新任务数说明这次更新已经生效。停用任务更简单把任务的enabled改成false再发布即可。我个人的经验是这种“配置即调度”的写法耗时短、不易出错比去XXL-JOB后台填表单更舒服特别适合一天改好几次参数的业务场景。5. 常见问题与排查技巧实录5.1 明明只触发一次为什么任务还是被重复执行我遇到最多的一个问题就是调度器只有一个实例Cron也没写错但任务还是被重复执行。排查下来发现问题根本不在调度端而在执行器的HTTP接口被其它调用方误触发了或者执行器内部有同样的定时器逻辑。这类“幽灵重复”最好定位的方法就是看批次ID把批次ID打进业务日志和数据库记录看看相同批次的请求是从哪里发出来的。如果确定是调度器多实例重复触发那就需要检查触发的分布式互斥是否生效。页面会给出两个方向第一确认执行器端的幂等表索引是否真的建立成功索引没建的话并发插入不会冲突会直接穿透第二确认两个调度器实例是不是用了不同的Nacos Namespace如果Namespace不一致它们各自的配置读取和触发链路都是互相隔离的自然也不会共享任何互斥信息。5.2 服务明明下线了调度器还在往它发包Nacos的实例摘除不是实时的临时实例需要等心跳超时默认15秒才会被标记为不健康。如果业务服务被强杀比如kill -9Nacos感知到节点消失可能需要一点时间这期间调度器还是会尝试调用它HTTP连接超时后才换下一个实例。所以我的建议是执行器优雅停机时先从Nacos反注册使用PreDestroy调用deregisterService把服务列表变更的时间从十几秒缩短到秒级这样生产发布时的无效调用会少非常多。还有一个容易忽略的情况执行器只配置了注册中心没有配配置中心导致它在Nacos上是“有服务但无配置”的半边状态。如果执行器的进程没有任何Nacos配置依赖问题不大但只要配置中心初始化失败整个Spring容器都可能启动失败注册自然也就没了。日志里看到Nacos连接相关异常时优先检查配置中心的服务地址和网络连通性别在业务代码里排查。5.3 连不上 Nacos几个被问烂但又确实常见的坑网络不通、地址写错、端口只放了8848没放9848这种属于基础问题日志里一般能直接看到连接异常。除此之外还有个隐蔽的坑是用户名密码。Nacos默认账号是nacos/nacos很多人一开始没改后期生产环境改了密码但服务里配置的还是旧密码看起来“不报错”实际很多操作静默失败。所以不管用不用身份认证都建议在配置里显式写上账号密码起码让问题暴露得早一点。顺便说一句最近社区里关于Nacos安全讨论比较多如果你在生产环境暴露了Nacos控制台记得赶紧做三件事改掉默认账号密码、升级到修复了默认密钥身份认证绕过漏洞的版本、必要的话给控制台加访问白名单。这个和调度本身没有直接关系但Nacos一旦被入侵你的任务配置和节点列表就全暴露了安全底线还是要守住。5.4 数据库适配与升级时的版本兼容团队在适配MySQL 8.4时踩过坑。直接运行某个Nacos旧版本的自动建库脚本会因为数据库驱动太旧直接报错。我的建议是Nacos服务端升级到2.2.3以上并手动执行当前版本自带的建表脚本不要用旧的残留库结构硬扛。另外一个容易搞混的点是Nacos控制台里有几套配置来源历史版本、Beta发布、灰度发布这些功能用多了之后你改的配置到底哪个版本生效控制台一定要看清楚“当前生效版本”的提示不然会遇到“改了配置没反应”的假象。最后再分享一点个人经验如果你所在的团队已经全面上了Nacos而且对任务调度确实没有那种硬性的后台管理需求这套方案会给你带来实实在在的清爽感。但我也要说句公道话它毕竟不是要全盘替代XXL-JOB如果任务量很大、需要复杂的路由策略、要精细化的调度日志和告警、要支持多团队审批流程那老老实实继续用XXL-JOB才是对的。轻量方案的优势在于简单代价是很多重型能力得自己补这是取舍不是谁比谁好。我个人在这套方案里最受益的一点是把“调度”这个本来独立的基础设施融汇到了团队已经很熟悉的Nacos体系里。新同学上手时只需要理解“注册中心里找节点、配置中心里找任务”这一个模型就能快速排查问题。如果你也想动这个手我建议先用两个不重要的任务试试水把幂等、超时、重试这些关键链路在测试环境里压一压确认稳定了再逐步迁移。祝顺利。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

WPF ProgressBar 垂直温度计实现:ControlTemplate 与动画 2026/9/26 13:17:56

WPF ProgressBar 垂直温度计实现:ControlTemplate 与动画

简介:本资源面向WPF开发者与UI控件学习者,聚焦如何借助ProgressBar控件实现垂直温度计效果,解决默认水平进度条难以满足仪表类界面需求的问题。内容围绕Orientation属性设置、ControlTemplate自定义模板、Path与ScaleTransform动态指针、动画…

阅读更多 →
急速搜索劫持:从捆绑安装到彻底清理的完整指南 2026/9/26 13:17:48

急速搜索劫持:从捆绑安装到彻底清理的完整指南

1. 电脑上莫名其妙出现的“急速搜索”到底是什么来头前几天帮一个朋友处理电脑问题,他跟我说:“桌面上突然多了个‘急速搜索’的图标,我根本没装过这东西,删了之后重启又回来了。”我远程连过去一看,任务栏右下角还挂着…

阅读更多 →
老胡的周刊(第195期):TaoToken 统一 Key 接入 Cline 的 settings.json 配置骨架 2026/9/26 13:17:41

老胡的周刊(第195期):TaoToken 统一 Key 接入 Cline 的 settings.json 配置骨架

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

阅读更多 →
Tripo×World Labs黑客松:AI生成3D模型与场景的实战全解析 2026/9/26 13:17:41

Tripo×World Labs黑客松:AI生成3D模型与场景的实战全解析

Tripo 和 World Labs 一起办 3D 黑客松这个消息,我第一反应是:3D 生成赛道终于要动真格的了。过去两年,我们见过了太多“生成一张图”的AI比赛,也见过了不少“生成一个模型”的Demo展示,但让做 3D 模型的人和做 3D 世界…

阅读更多 →
文件式与交互式运行:从五个程序实例看后台密码处理 2026/9/26 13:17:41

文件式与交互式运行:从五个程序实例看后台密码处理

文件式和交互式,这两个词听起来像是教材里才会出现的概念,但我发现很多写了两三年脚本的人,其实也没完全搞明白它们到底意味着什么。最近在群里又看到有人问“shell脚本放在后台执行,还要交互式输入密码怎么处理”,这个…

阅读更多 →
SpringBoot+Vue3前后端分离商城系统实战:从数据库设计到部署上线 2026/9/26 13:17:40

SpringBoot+Vue3前后端分离商城系统实战:从数据库设计到部署上线

去年接了一个服装批发客户的单子,需求很直接:要做一套商城系统,前端能展示商品、加购物车、下单,后台要管商品、订单、库存和会员,还得留出以后接优惠券、拼团这些营销功能的余地。我最终选了SpringBoot Vue3这套组合…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉