SeaTunnel 向远程 Zeta 集群提交作业完整指南:Docker / Kubernetes / EKS / Helm 全场景实战

发布时间:2026/11/12 6:03:10

SeaTunnel 向远程 Zeta 集群提交作业完整指南:Docker / Kubernetes / EKS / Helm 全场景实战 数据集成ETL大数据批处理流处理变更数据捕获【免费下载链接】seatunnelSeaTunnel is a multimodal, high-performance, distributed, massive data integration tool.项目地址https://gitcode.com/GitHub_Trending/se/seatunnel点击查看免费下载导读本文是 SeaTunnel 引擎Zeta远程作业提交的实战手册系统讲解如何将 SeaTunnel 作业从本地机器或 CI/CD 流水线提交到远程Zeta 集群而非仅在本地运行。内容覆盖两种核心提交方式--master客户端参数与 REST API、Docker 单节点与多节点集群、Kubernetes 三种访问方式kubectl port-forward、NodePort、LoadBalancer、ConfigMap 作业配置管理以及 Amazon EKS 上的 Helm 部署。读完本文你将掌握 Zeta 集群的网络端口规划5801 / 8080 / 8090、REST API 提交与监控接口的完整用法以及一套可直接复制的故障排查方法论。1. 前置条件向远程 Zeta 集群提交作业前需要满足以下三项基本条件需求说明SeaTunnel 客户端已安装本地拥有 SeaTunnel 目录可执行bin/seatunnel.sh集群可达提交机器能够访问 REST API 端口默认8080作业配置文件就绪HOCON.conf、JSON 或 SQL 格式的作业配置文件需要特别强调的是这里所说的远程集群必须是已经启动运行的 Zeta 集群。Zeta 引擎支持三种部署形态详见 Zeta 安装部署本地模式Local仅用于测试每个任务启动独立进程、混合集群模式Master 与 Worker 同进程、所有节点均可参与选举和分离集群模式Master 与 Worker 分离Master 只负责作业调度、REST API 与任务提交。其中分离集群模式是官方推荐的生产部署方式因为 Master 不运行同步任务负载更小、稳定性更高即使 Worker 节点宕机也不会导致 IMap 状态数据重新分布详见 分离集群模式部署。本文涉及的远程提交适用于混合集群与分离集群两种模式。2. 从本地机器向远程集群提交2.1--master参数Zeta所有 SeaTunnel Zeta 客户端命令均支持--master参数用于指定集群连接地址bin/seatunnel.sh \ --config job.conf \ --master seatunnel://192.168.1.100:5801Zeta 集群内部默认端口为5801与 REST API 端口8080不同。--master参数用于通过 Hazelcast 成员协议直接连接集群。这一点可以从发行包自带的 config/hazelcast.yaml 中得到印证hazelcast.network.port.port: 5801且auto-increment: false端口不会自动递增避免多节点端口冲突。同时该文件中join.tcp-ip.enabled: true并配置了member-list说明 Zeta 默认使用 TCP-IP 成员发现机制在 Kubernetes 部署时则切换到 Kubernetes 服务发现见 deploy/kubernetes/seatunnel/conf/hazelcast-master.yaml 中的join.kubernetes.enabled: true。Hazelcast 客户端通过 5801 端口加入集群成员组后作业会被提交给当前 Active Master 进行调度。2.2 使用 REST API推荐用于自动化场景对于 CI/CD 流水线和脚本推荐使用 REST API 提交避免在构建机或调度机上维护整套 SeaTunnel 客户端curl -X POST http://192.168.1.100:8080/submit-job \ -H Content-Type: application/json \ -d job.jsonREST API 由 Zeta 引擎内嵌的 Jetty 服务提供。这里有两个容易混淆的默认值来源需要注意详见 REST API v2 参考代码默认值enable-http false、port 8080。也就是说如果你使用精简配置文件或删除了enable-http配置Jetty 默认不会启动REST API 与 Web UI 会一起不可用发行包自带的seatunnel.yaml默认写入了enable-http: true和port: 8080。因此直接使用发行包自带配置启动时REST API 通常监听http://host:8080/。参考 config/seatunnel.yaml 中的实际配置seatunnel: engine: http: enable-http: true port: 8080 enable-dynamic-port: falseREST API 仅在作业运行于 Zeta 引擎时可用作业运行在 Flink 或 Spark 引擎上时需要使用对应引擎自身的工具提交和监控作业。3. Docker单节点提交3.1 启动已启用 REST API 的 Zeta 容器docker run -d --name seatunnel \ -p 8080:8080 \ -e ST_DOCKER_MEMBER_COUNT1 \ apache/seatunnel:versionST_DOCKER_MEMBER_COUNT是 SeaTunnel 官方 Docker 镜像约定成员数量的环境变量单节点为 1多节点集群需在所有节点上设置相同的期望成员数让各容器通过 Hazelcast 发现彼此并组成集群。3.2 从容器外部提交作业容器启动后即可在宿主机上通过 REST API 提交一个FakeSource - Console的冒烟作业curl -X POST http://localhost:8080/submit-job \ -H Content-Type: application/json \ -d { env: { job.name: test, job.mode: BATCH }, source: [{ plugin_name: FakeSource, plugin_output: fake, row.num: 10, schema: { fields: { id: int, name: string } } }], transform: [], sink: [{ plugin_name: Console, plugin_input: [fake] }] }请求成功后会返回类似{jobId: 733584788375666689, jobName: test}的 JSON 响应其中jobId是后续查询作业状态、停止作业的唯一标识。3.3 在容器内执行本地 smoke 测试docker run -d --name seatunnel \ -p 8080:8080 \ -v /path/to/your/jobs:/jobs \ apache/seatunnel:version # 在容器内执行 docker exec seatunnel \ /opt/seatunnel/bin/seatunnel.sh --config /jobs/my-job.conf --master local特别注意该命令仅适用于在容器内做快速本地 smoke 测试。它不是向远程 Zeta 集群提交作业因为--master local会在当前容器进程内本地启动作业作业生命周期与容器进程绑定。真正测试远程提交应该使用第 2 节中的--master seatunnel://host:5801或 REST API 方式。4. Docker多节点集群4.1 Docker Compose 示例用 Docker Compose 快速搭建一个 2 节点 Zeta 集群Master Worker两个容器属于同一个 bridge 网络通过 5801 端口互相发现version: 3.8 services: master: image: apache/seatunnel:version container_name: seatunnel-master ports: - 8080:8080 - 5801:5801 environment: ST_DOCKER_MEMBER_COUNT: 2 networks: - st-net worker: image: apache/seatunnel:version container_name: seatunnel-worker environment: ST_DOCKER_MEMBER_COUNT: 2 networks: - st-net depends_on: - master networks: st-net: driver: bridge启动集群docker-compose up -d向 master 提交作业curl -X POST http://localhost:8080/submit-job \ -H Content-Type: application/json \ -d job.json注意只有master容器对外暴露了 5801 和 8080 两个端口worker容器仅加入内部网络st-net这正是REST API 仅需在 Master 节点上对外暴露这一网络规划原则的体现。4.2 网络端口要求Docker端口协议用途5801TCPHazelcast 集群内部成员通信8080TCPREST API作业提交 / 监控需确保 Docker 网络中所有集群成员之间 5801 端口互通。REST API 仅需在 Master 节点上对外暴露。5. Kubernetes作业提交在 Kubernetes 上部署 SeaTunnel 后部署清单与模板见 deploy/kubernetes/seatunnelMaster 使用 StatefulSet 形态提供稳定的 Pod 名称如seatunnel-master-0有三种方式访问 Master 的 REST API。5.1 使用kubectl port-forward开发 / 临时提交将 Master Pod 的 REST 端口转发到本地# 查找 master pod kubectl get pods -n seatunnel # 转发 REST 端口 kubectl port-forward -n seatunnel \ pod/seatunnel-master-0 8080:8080在另一个终端提交作业curl -X POST http://localhost:8080/submit-job \ -H Content-Type: application/json \ -d job.jsonport-forward方式适合开发调试与临时验证但存在两个天然限制空闲超时会断开连接Pod 重建后需重新执行转发命令。5.2 使用 NodePort 服务测试 / 生产若集群通过NodePort服务暴露 Master# 获取 NodePort kubectl get svc -n seatunnel seatunnel-master-rest # 使用节点 IP 和节点端口提交 curl -X POST http://node-ip:node-port/submit-job \ -H Content-Type: application/json \ -d job.json5.3 使用 LoadBalancer 服务在云厂商托管的 Kubernetes 集群如 EKS、GKE、ACK中更推荐使用 LoadBalancerLB_IP$(kubectl get svc -n seatunnel seatunnel-master-rest \ -o jsonpath{.status.loadBalancer.ingress[0].ip}) curl -X POST http://${LB_IP}:8080/submit-job \ -H Content-Type: application/json \ -d job.json注意AWS 的 LoadBalancer 返回的是hostname而非ip此时应改用{.status.loadBalancer.ingress[0].hostname}取值详见第 7.2 节。6. Kubernetes通过 ConfigMap 管理作业配置在集群内运行作业时建议将作业配置文件以 ConfigMap 形式挂载而非打包到镜像中这样修改作业只需更新 ConfigMap 而无需重建镜像。首先创建 ConfigMap以 CDC 作业为例apiVersion: v1 kind: ConfigMap metadata: name: seatunnel-job-config namespace: seatunnel data: cdc-job.conf: | env { job.name cdc-prod job.mode STREAMING checkpoint.interval 30000 } source { MySQL-CDC { ... } } sink { ... }在 Pod spec 中挂载volumeMounts: - name: job-config mountPath: /opt/seatunnel/jobs volumes: - name: job-config configMap: name: seatunnel-job-config通过kubectl exec提交kubectl exec -n seatunnel seatunnel-master-0 -- \ /opt/seatunnel/bin/seatunnel.sh \ --config /opt/seatunnel/jobs/cdc-job.conf这种方式无需从外部网络访问 REST API直接在 Master Pod 内执行客户端命令即可适用于集群网络受限无公网/无 LoadBalancer的场景。7. Amazon EKS / Helm 部署7.1 Helm 安装SeaTunnel 官方 Helm Chart 支持一键部署 Master 与 Worker 分离架构helm repo add seatunnel https://apache.github.io/seatunnel-helm-charts helm repo update helm install seatunnel seatunnel/seatunnel \ --namespace seatunnel \ --create-namespace \ --set master.replicaCount2 \ --set worker.replicaCount4 \ --set master.service.typeLoadBalancerChart 的默认值位于 deploy/kubernetes/seatunnel/values.yaml其中master.replicas与worker.replicas默认均为2且 Master 与 Worker 均配置了基于hazelcast-port5801的 liveness/readiness 探针image.registry默认为apache/seatunnel可通过image.tag指定具体版本。7.2 EKS 获取 Load Balancer 主机名AWS EKS 的 LoadBalancer 服务通常返回 DNS 主机名而非 IPkubectl get svc -n seatunnel seatunnel-master \ -o jsonpath{.status.loadBalancer.ingress[0].hostname}以该主机名作为 API 端点export ST_HOST$(kubectl get svc -n seatunnel seatunnel-master \ -o jsonpath{.status.loadBalancer.ingress[0].hostname}) curl -X POST http://${ST_HOST}:8080/submit-job \ -H Content-Type: application/json \ -d job.json7.3 通过 Helm values 自定义资源配置生产环境通常需要为 Master 与 Worker 分别规划资源配额、副本数以及引擎级配置可以编写独立的 values 文件# values-prod.yaml master: replicaCount: 2 resources: requests: memory: 4Gi cpu: 2 limits: memory: 8Gi cpu: 4 worker: replicaCount: 8 resources: requests: memory: 8Gi cpu: 4 limits: memory: 16Gi cpu: 8 seatunnel: config: engine: backup-count: 2 queue-type: blockingqueue print-execution-info-interval: 60 http: enable-http: true port: 8080应用配置helm upgrade seatunnel seatunnel/seatunnel \ --namespace seatunnel \ -f values-prod.yaml这里的seatunnel.config.engine段最终会渲染为引擎配置并注入 Pod。其中backup-count: 2控制 Hazelcast IMap 状态数据的备份副本数直接影响集群 HA 能力与 Master 节点数量规划建议取max(1, min(5, N/2))N 为 Master 数量queue-type: blockingqueue选择 Pipeline 内部队列实现print-execution-info-interval: 60周期性打印作业执行信息的时间间隔秒http.enable-http: true/http.port: 8080启用 REST API 与 Web UI对应 config/seatunnel.yaml 中的seatunnel.engine.http配置段。8. 网络与端口要求无论采用哪种部署方式Zeta 集群涉及三个核心端口必须提前规划好防火墙、安全组与 Kubernetes NetworkPolicy端口协议使用方注意事项5801TCPHazelcast 集群成员间通信生产环境不要对外暴露8080TCPREST API生产环境建议通过认证网关暴露8090TCPWeb UI可选仅用于管理看板在 Kubernetes 中建议设置 NetworkPolicy 将 5801 端口限制在 SeaTunnel 命名空间内apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: seatunnel-internal namespace: seatunnel spec: podSelector: matchLabels: app: seatunnel ingress: - from: - namespaceSelector: matchLabels: name: seatunnel ports: - port: 5801补充说明8080 端口上的 REST API 与 Web UI 由同一个内嵌 Jetty 服务提供见 REST API v2 参考只要 Jetty 未启动两者会一起不可用。若在seatunnel.yaml中配置了enable-dynamic-port: true实际监听端口会在port到port port-range之间自动挑选此时应以启动日志SeaTunnel REST service will start on port xxx为准而不是想当然地使用 8080。9. 提交后的监控与作业生命周期管理REST API 进阶作业提交成功只是第一步。在远程集群场景下通常需要通过 REST API 持续监控作业状态与指标。以下是实际运维中最常用的几个接口完整参考见 REST API v29.1 查询作业状态# 运行中作业列表支持分页 curl http://host:8080/running-jobs?page1rows10 # 指定作业详细信息含 SourceReceivedCount / SinkWriteCount 等指标 curl http://host:8080/job-info/jobId # 已结束作业state 取值FINISHED / CANCELED / FAILED / SAVEPOINT_DONE / UNKNOWABLE curl http://host:8080/finished-jobs/FINISHED?page1rows10/job-info/:jobId返回的指标字段包括SourceReceivedCount源端接收行数、SourceReceivedQPS、SinkWriteCountSink 写入尝试行数、SinkCommittedCountcheckpoint 成功后的已提交行数等作业运行中还可返回diagnostics字段其中pipelines[].restoreCount如果持续增长而jobStatus一直是RUNNING说明作业正处于崩溃重启循环需要结合日志排查。9.2 集群与资源概览# 集群概览totalSlot / runningJobs / pendingJobs 等 curl http://host:8080/overview # Worker 资源快照totalSlots / freeSlots / cpuUsage / memUsage curl http://host:8080/resource/workers # Pending 队列诊断排查作业长时间 WAITING / PENDING 的原因 curl http://host:8080/pending-jobs?limit10prettytrue/pending-jobs是排查资源不足的利器当作业提交后长时间处于PENDING响应中的lackingTaskGroups、failureMessage如NoEnoughResourceException: slot not enough和blockingJobIds可以直接指明缺多少 Slot、被哪些作业占用。9.3 停止作业curl -X POST http://host:8080/stop-job \ -H Content-Type: application/json \ -d {jobId: 733584788375666689, isStopWithSavePoint: false, force: false}参数说明参数是否必传说明jobId是作业 IDisStopWithSavePoint否是否通过 savepoint 方式停止保存当前状态便于后续恢复force否是否强制停止忽略isStopWithSavePoint仅应在异常场景使用因为可能导致检查点数据不完整9.4 上传配置文件提交除 JSON 请求体外REST API 还支持直接上传.confHOCON、.sql、.json文件curl --location http://127.0.0.1:8080/submit-job/upload \ --form config_file/temp/fake_to_console.conf上传大小受seatunnel.engine.http.upload-max-file-size-mb默认 10 MB与upload-max-request-size-mb默认 10 MB限制超出会在解析配置之前被拒绝。注意REST API 不支持 dry-run仅 CLI 提供/submit-job还支持format参数json/hocon/sql默认json以及基于restoreMode/restoreSourceJobId/isStartWithSavePoint的作业恢复能力。10. 故障排查远程提交场景中问题往往出在网络不通、端口未开或资源不足三类。下表总结了常见现象、可能原因与修复方法现象可能原因修复方法8080 端口Connection refusedREST API 未启用或端口错误设置enable-http: true检查port配置Worker 无法加入集群防火墙阻断 5801 端口开放所有集群节点间 TCP 5801kubectl port-forward断开空闲超时或 Pod 重启重新执行 port-forward考虑改用 NodePort作业已提交但状态始终为WAITING无可用 Worker 槽位扩容 Worker 副本数或检查资源配额EKS LoadBalancer 主机名无法解析DNS 传播延迟等待 1–2 分钟用nslookup验证Helm 安装卡在pending-install上次安装失败残留执行helm rollback或helm uninstall后重试补充两个容易被忽略的排查点8080 打不开时先确认 Jetty 是否真的启动seatunnel.engine.http.enable-http或enable-https才是 REST API / Web UI 的开关仅配置hazelcast.yaml中的network.rest-api.enabled不能替代 Jetty 开关详见 REST API v2作业状态WAITING/PENDING时用/pending-jobs拿诊断信息响应中的failureMessage会直接告诉你是否NoEnoughResourceException以及具体缺哪些 TaskGroup 的 Slot。参考REST API v2 完整参考Zeta 引擎安装部署分离集群模式部署SeaTunnel 引擎配置文件示例Hazelcast 集群配置文件示例Kubernetes Helm Chart 默认值Kubernetes 部署 Master Hazelcast 配置赞分享数据集成ETL大数据批处理流处理变更数据捕获【免费下载链接】seatunnelSeaTunnel is a multimodal, high-performance, distributed, massive data integration tool.项目地址https://gitcode.com/GitHub_Trending/se/seatunnel点击查看免费下载相关推荐向远程 Zeta 集群提交 SeaTunnel 作业从 Docker 单机到 Kubernetes/EKS 的完整实战指南向远程 Zeta 集群提交 SeaTunnel 作业从 Docker 单机到 Kubernetes/EKS 的完整实战指南 本文面向需要将 SeaTunnel数据集成ETL大数据批处理流处理变更数据捕获SeaTunnel Zeta 引擎 RESTful API V2 完全指南监控、作业提交与集群运维SeaTunnel Zeta 引擎 RESTful API V2 完全指南监控、作业提交与集群运维 SeaTunnelZeta 引擎内置了一套基于 HTT数据集成ETL大数据批处理流处理变更数据捕获SeaTunnel 集群 Helm 部署实战从 Chart 安装到任务提交完整指南SeaTunnel 集群 Helm 部署实战从 Chart 安装到任务提交完整指南 SeaTunnelApache SeaTunnel是一个多模态、高性能数据集成ETL大数据批处理流处理变更数据捕获创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/11 19:29:28

Python自动回帖机器人源码解析:模拟登录、爬虫与合规实践

简介:面向有Python基础、想学习API接口调用与自动化脚本的开发者,这份资源是一套豆瓣自动回帖机器人完整源码。项目绕开网页版验证码,通过豆瓣API实现小组自动回复,支持多组回帖、定时回复及休息时间,并内置IP代理池自…

2026/11/9 1:32:56

FineReport替代迁移与校验实战:从选型到数据一致性验证

帆软的报表体系在政企、金融、制造这些行业蹲了十几年,很多公司从Excel手工台账时代就是靠它撑起月度经营分析会的。如今到了2026年,一批老用户开始不得不面对一个灵魂拷问:FineReport的授权模式、技术栈和信创适配,到底还能不能跟…

2026/11/11 8:18:19

rrweb 录制数据转视频实战:rrvideo CLI 安装、配置与实现原理

前端可观测性开发工具 【免费下载链接】rrweb record and replay the web 项目地址: https://gitcode.com/gh_mirrors/rr/rrweb 点击查看 免费下载 rrvideo 是 rrweb 官方提供的命令行工具,负责把 rrweb 录制生成的 JSON 会话数据(session e…

2026/11/12 8:04:29

孝感大悟电工证多久拿证?找工作的刚需怎么解决

孝感大悟电工证多久拿证?找工作的刚需怎么解决 你还在为没证耽误找工作发愁?尤其是像你这样急需特种作业证才能上岗的求职者,孝感大悟电工证成了你必须拿下的一张通行证。但你知道 多久拿证 、怎么高效拿到、考试难不难吗?别急,下面给你全盘托出。…

2026/11/12 8:04:29

宜都市考电工证电话最新政策解读及官方报名入口全攻略

宜都市考电工证电话最新政策解读及官方报名入口全攻略 之前考的证在外省能不能转过来?这几乎是每个打算考电工证的人都会问的问题。现在,随着国家对特种作业人员管理越来越严格,很多人发现手中的证书在老家用着顺手,但在外地办事就遇到了麻烦。特别是在宜…

2026/11/12 8:04:29

孝感大悟电工证通过率揭秘,学历不高也能考下来

孝感大悟电工证通过率揭秘,学历不高也能考下来 你是不是觉得学历不高,就报不了电工证?其实不然, 孝感大悟电工证 报考门槛并不高,关键是要找到正确的备考方法和培训机构。很多像你一样的人,因为担心学历不够,就放弃了考证,结果错失了更好的发展机会…

2026/11/12 8:04:29

电工证长得什么样?保姆级教程教你避开中介坑

电工证长得什么样?保姆级教程教你避开中介坑 你是不是也遇到过这种情况:找电工证培训,结果被各种中介坑得团团转?现在市面上培训机构鱼龙混杂,一不小心就花了冤枉钱,甚至拿到假证。这篇文章就是给那些 不知道去哪报名怕被中介坑…

2026/11/12 8:04:29

高压电工证取消吗?官方报名入口在哪?别再被中介骗了

高压电工证取消吗?官方报名入口在哪?别再被中介骗了 你是不是也担心高压电工证取消了吗?又怕去哪报名被中介坑?别急,今天我就从濮阳初学者的角度,告诉你高压电工证的真实情况、报名流程、考试内容和备考重点,还有 官方报名入口…

2026/11/12 7:59:29

北京铁科特种工怎么报名不被坑?网上查询最靠谱

北京铁科特种工怎么报名不被坑?网上查询最靠谱 不知道去哪报名怕被中介坑?很多劳务班组负责人在办理【北京铁科特种工】证书时,最头疼的就是不知道哪家靠谱、哪家是骗子。尤其是现在网上信息太多,真假难辨,一不小心就可能花冤枉钱还拿不到证。如果你也正…

2026/11/11 12:42:59

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/12 0:04:01

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘 工地太忙根本没时间复习考试?你不是一个人。作为一名在南阳卧龙区干了七八年市政公用工程的电工,我深知这个问题的现实性。电工证不仅是工作的“入场券”,更是职业发展的“通行证”,但备考过程…

2026/11/12 0:04:01

双流电工证考别怕挂科!郑州报考避坑指南全攻略

双流电工证考别怕挂科!郑州报考避坑指南全攻略 实操考试心里没底怕挂科?双流电工证考在郑州报名,很多人因为不了解流程、准备不充分,白白浪费时间和金钱。作为三门峡应届工程类毕业生,我也曾经历过这样的焦虑。今天就从零开始,手把手教你如何避开郑州报…

2026/11/12 0:04:01

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少 之前考的证在外省能不能转过来?这个问题确实让不少准备换城市工作的朋友犯了难,尤其像电工证这种实操性很强的证书,很多人担心跨省后证书能不能继续用。其实,只要符合相关流程,是可以顺利转…

2026/11/11 20:27:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/10 10:29:37

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑