轻量级容器编排工具Herdctl:填补Docker Compose与K8s之间的空白
1. 项目概述从容器到集群的轻量级管理工具如果你和我一样长期在容器化和微服务架构的领域里摸爬滚打那你一定对docker和docker-compose这两个名字再熟悉不过了。它们几乎是单体容器和多容器应用编排的“标准答案”。然而当我们把视野从单机扩展到多节点、从小型项目扩展到需要协调多个服务的集群环境时事情就开始变得复杂起来。Kubernetes无疑是这个领域的王者但它的学习曲线陡峭配置复杂对于小型团队、边缘计算场景或者只是想快速验证一个分布式应用原型的开发者来说显得有些“杀鸡用牛刀”。正是在这种背景下我注意到了edspencer/herdctl这个项目。它的名字就很有意思——“herd”是“牧群”的意思而ctl是“控制”的缩写。顾名思义这是一个用来管理“一群”容器的工具。简单来说herdctl是一个轻量级的命令行工具它允许你使用一个类似docker-compose.yml的声明式配置文件通常是herd.yml将你的多容器应用部署到一个由多台机器组成的“集群”中。它底层依然基于 Docker但通过 SSH 和 Docker API 的巧妙结合实现了跨主机的容器编排、服务发现和负载均衡让你无需搭建完整的 K8s 集群就能享受到类似的多机部署体验。这个工具的核心价值在于它的“轻量”和“直接”。它没有etcd、kube-apiserver这些重量级组件不需要你预先配置复杂的网络插件或存储卷。你只需要在目标机器上安装好 Docker 并开启远程 API 访问或通过 SSH 隧道然后用一个你熟悉的YAML文件描述你的应用herdctl就能帮你把服务分发到指定的机器上运行并自动处理好服务间的网络互通。这对于快速搭建开发测试环境、部署中小型应用、或是作为学习分布式系统概念的入门工具都有着极高的实用价值。2. 核心架构与工作原理拆解要理解herdctl的强大之处我们必须先抛开它看看在它出现之前我们是如何笨拙地管理多机 Docker 的。通常我们会写一堆shell脚本用ssh命令依次登录到各个服务器手动执行docker run或docker-compose up。这种方式不仅容易出错而且服务发现、健康检查、负载均衡都需要自己额外实现维护成本极高。herdctl的出现正是为了系统性地解决这些问题。2.1 设计哲学简单即美herdctl的设计哲学非常明确在保持 Docker 原生体验的基础上提供最小化的集群抽象。它没有引入全新的概念体系而是巧妙地扩展了docker-compose的模型。如果你会写docker-compose.yml那么你几乎可以零成本上手herd.yml。这种低学习门槛是它最大的优势之一。它的核心目标不是取代Kubernetes而是在Docker Compose和Kubernetes之间填补一个重要的空白地带。对于那些觉得Compose不够用仅限于单机而K8s又太重的场景herdctl提供了一个恰到好处的解决方案。2.2 核心组件与交互流程herdctl的架构可以理解为一种“中心化协调分布式执行”的模式。整个系统主要由三部分组成herdctl客户端这是你本地使用的命令行工具。它负责解析你的herd.yml配置文件并根据配置与集群中的各个节点进行通信。herd.yml配置文件这是整个系统的“蓝图”。它定义了所有服务容器、这些服务应该运行在哪些目标主机节点上、以及服务之间的依赖关系和网络规则。目标节点集群中实际运行 Docker 容器的主机。每个节点都需要安装 Docker并且允许herdctl通过某种方式如 Docker TLS 或 SSH连接到其 Docker 守护进程。它们之间的工作流程我画了一个简单的示意图来帮助理解[本地开发机] | | 执行 herdctl up | v [ herdctl 客户端 ] | 1. 解析 herd.yml | 2. 计算部署计划 | | 通过 SSH / Docker TLS | v v v [节点A: 主机1] [节点B: 主机2] [节点C: 主机3] | | | | 3. 创建网络 | 3. 创建网络 | 3. 创建网络 | 4. 拉取镜像 | 4. 拉取镜像 | 4. 拉取镜像 | 5. 启动容器 | 5. 启动容器 | 5. 启动容器 | | | v v v [服务Web] [服务API] [服务DB] | | | -------------------------------- | v [Overlay网络内互通]流程详解步骤1 2计划阶段。当你在本地执行herdctl up -f herd.yml时客户端会首先读取并解析配置文件。它会根据每个服务定义的deploy.hosts字段计算出哪个服务应该被部署到哪台机器上。这个阶段是纯逻辑计算不涉及任何远程操作。步骤3网络准备。这是关键一步。为了让不同主机上的容器能够像在同一台主机上一样通过服务名互相访问herdctl需要在所有相关的节点上创建一个相同的Docker Overlay 网络。这个网络是跨主机的虚拟网络容器加入后就仿佛接入了同一个局域网。herdctl会确保这个网络在所有指定节点上都存在。步骤4 5执行阶段。接下来herdctl会通过 SSH 或 Docker TLS 安全地连接到每一台目标主机。在每台主机上它会执行一系列 Docker 命令检查并拉取所需的镜像然后以正确的配置环境变量、卷挂载、网络等启动容器。所有容器都会加入到步骤3创建的同一个 Overlay 网络中。2.3 与 Docker Compose 和 Swarm 的对比为了更清晰地定位herdctl我们可以把它和 Docker 生态中另外两个编排工具做个简单对比特性Docker ComposeDocker Swarm ModeHerdctl编排范围单机集群内置于 Docker Engine集群学习曲线极低中等低兼容 Compose 语法架构复杂度无纯客户端工具中等需初始化 Swarm有 Manager/Worker 节点概念低无中心管理节点纯客户端协调服务发现通过共享网络容器名作为主机名内置 DNS 轮询服务名作为虚拟 IP通过共享的 Docker Overlay 网络容器名或服务名作为主机名配置方式docker-compose.ymldocker stack deploy(兼容 Compose 文件 v3)herd.yml(高度兼容 Compose 语法)适用场景本地开发、测试、单机部署生产级轻量集群、需要 Docker 原生集成快速搭建多机开发/测试环境、中小型应用部署、边缘计算从对比可以看出herdctl在易用性上更接近Compose在能力上则瞄准了Swarm的部分核心功能跨主机网络和服务发现但实现方式更加轻量和直接。它不需要你docker swarm init没有 Raft 共识协议的开销对于不需要 Swarm 高级特性如秘密管理、配置管理、滚动更新的场景来说herdctl往往更快捷。注意herdctl创建的 Overlay 网络其驱动就是 Docker 自带的overlay驱动。这意味着这个网络的性能和特性与 Docker 原生能力一致。但默认的overlay网络需要配合 KV 存储如 Consul, etcd才能实现多主机间的网络信息同步而herdctl似乎通过自己的协调机制简化了这一步这是其实现的一个巧妙之处。3. 从零开始herdctl 的完整实战部署理论讲得再多不如亲手操作一遍。下面我将以一个典型的 Web 应用栈为例带你完整走一遍使用herdctl部署一个三节点微服务集群的全过程。这个栈包含一个 Nginx 前端、一个 Python Flask API 后端和一个 PostgreSQL 数据库。3.1 环境准备与节点配置假设我们有四台机器管理机laptop(你的本地电脑安装herdctl)节点1node1(IP: 192.168.1.101) 运行 Nginx节点2node2(IP: 192.168.1.102) 运行 Flask API节点3node3(IP: 192.168.1.103) 运行 PostgreSQL第一步在所有节点上安装 Docker确保node1,node2,node3上都安装了 Docker Engine。安装方法请参考 Docker 官方文档这里以 Ubuntu 为例# 在 node1, node2, node3 上分别执行 sudo apt-get update sudo apt-get install -y docker.io sudo systemctl enable docker sudo systemctl start docker第二步配置 Docker 远程访问关键步骤为了让herdctl能从管理机远程控制节点的 Docker我们需要开启 Docker Daemon 的 TCP 端口。出于安全考虑强烈建议使用 TLS 加密。但为了演示简单我们先使用一种更直接但仅限安全内网的方法SSH 隧道。herdctl原生支持通过 SSH 连接来执行 Docker 命令这样我们就不必直接暴露 Docker 的 TCP 端口。确保管理机 (laptop) 可以通过 SSH 密钥免密登录到所有节点 (node1,node2,node3)。如果还没设置在laptop上执行ssh-keygen -t rsa # 如果已有密钥可跳过 ssh-copy-id usernode1 ssh-copy-id usernode2 ssh-copy-id usernode3请将user替换为你在节点上的实际用户名。第三步在管理机安装 herdctl在laptop上我们需要安装herdctl客户端。通常它是一个单独的二进制文件。# 假设从 GitHub Releases 下载请根据实际版本调整 wget https://github.com/edspencer/herdctl/releases/download/v0.1.0/herdctl-linux-amd64 chmod x herdctl-linux-amd64 sudo mv herdctl-linux-amd64 /usr/local/bin/herdctl # 验证安装 herdctl --version3.2 编写 herd.yml 应用蓝图这是整个部署的核心。我们在laptop上创建一个项目目录并编写herd.yml。# herd.yml version: 3.8 # 使用 Compose 文件格式版本 # 定义所有需要用到的主机节点 hosts: web-host: address: usernode1 # 通过 SSH 连接 node1 api-host: address: usernode2 # 通过 SSH 连接 node2 db-host: address: usernode3 # 通过 SSH 连接 node3 # 定义服务 services: # 1. 数据库服务 postgres: image: postgres:15-alpine environment: POSTGRES_DB: myapp POSTGRES_USER: admin POSTGRES_PASSWORD: secretpassword volumes: - postgres_data:/var/lib/postgresql/data # 部署到 db-host (node3) deploy: hosts: - db-host healthcheck: test: [CMD-SHELL, pg_isready -U admin] interval: 10s timeout: 5s retries: 5 # 2. API 后端服务 flask-api: # 假设我们有一个自定义镜像这里用公共镜像替代演示 build: ./api # Dockerfile 所在路径会在目标主机上构建 # image: myusername/flask-api:latest # 或者使用预构建的镜像 environment: DATABASE_URL: postgresql://admin:secretpasswordpostgres:5432/myapp ports: - 5000:5000 # 将容器的5000端口映射到宿主机的5000端口 depends_on: postgres: condition: service_healthy # 等待数据库健康后再启动 # 部署到 api-host (node2) deploy: hosts: - api-host # 3. Web 前端服务 (Nginx) nginx: image: nginx:alpine volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro - ./static:/usr/share/nginx/html:ro ports: - 80:80 depends_on: - flask-api # 部署到 web-host (node1) deploy: hosts: - web-host # 定义卷herdctl 会在需要该卷的每个主机上创建本地卷 volumes: postgres_data:配置文件关键点解析hosts部分这是我们区别于docker-compose.yml的地方。这里明确定义了集群中的主机并指定了连接方式userhostname表示通过 SSH。herdctl会根据这个列表去连接机器。deploy.hosts在每个服务下通过这个字段指定该服务应该运行在哪个或哪些主机上。一个服务可以指定多个主机herdctl可能会在每个主机上都启动一个实例但本例中每个服务只在一个主机上。如果没有指定deploy.hosts服务默认会跑在herdctl命令执行的本地机器上。服务发现注意flask-api服务中连接数据库的DATABASE_URLpostgres:5432。这里的postgres是服务名而不是 IP 地址。因为所有服务都连接到了herdctl创建的同一个 Overlay 网络所以它们可以通过服务名直接解析到对应容器的 IP。这是实现跨主机通信的魔法所在。depends_on与healthcheck我们使用了condition: service_healthy这要求postgres服务必须通过健康检查后才启动flask-api。这比简单的depends_on更可靠确保了 API 启动时数据库已准备就绪。构建与镜像对于flask-api我们指定了build: ./api。这意味着herdctl在部署到api-host时会先将./api目录包含 Dockerfile复制到目标主机然后在目标主机上执行docker build。这适合开发环境。对于生产环境更推荐使用预构建并推送到镜像仓库的镜像image:字段。3.3 执行部署与验证一切就绪后在laptop的项目目录下执行部署命令herdctl up -f herd.yml你会看到herdctl开始输出详细的日志解析配置读取herd.yml。连接主机依次通过 SSH 连接到node1,node2,node3。创建网络在三个节点上创建一个名为herd_default或根据项目名命名的 Overlay 网络。处理服务按依赖顺序处理每个服务。对于postgres连接到node3检查镜像拉取postgres:15-alpine创建卷postgres_data启动容器并将其连接到herd_default网络。对于flask-api等待postgres健康。然后连接到node2由于是build它会复制./api目录到node2执行docker build -t [临时镜像名] ./api然后启动容器。对于nginx连接到node1拉取nginx:alpine镜像挂载本地配置文件启动容器。部署完成后你可以使用以下命令检查状态# 查看所有节点上所有服务的状态 herdctl ps -f herd.yml # 查看特定服务的日志 herdctl logs -f herd.yml flask-api # 进入某个容器执行命令例如检查数据库 herdctl exec herd.yml postgres psql -U admin -d myapp现在你的应用已经分布在了三台机器上访问http://node1(或http://192.168.1.101) 可以看到 Nginx 服务的前端。Nginx 会将 API 请求代理到运行在node2上的flask-api服务通过 Overlay 网络内部通信flask-api:5000。flask-api则会通过 Overlay 网络连接到运行在node3上的postgres容器postgres:5432。整个过程你只需要一个配置文件一条命令。herdctl帮你隐藏了所有繁琐的 SSH 登录、命令执行和网络配置细节。4. 深入核心网络、存储与服务发现机制理解了基本操作后我们来深入看看herdctl是如何实现那些“魔法”功能的特别是跨主机网络、数据持久化和服务发现。这部分是理解其能力边界和进行故障排查的关键。4.1 跨主机 Overlay 网络详解这是herdctl最核心的技术点。Docker 原生的overlay网络驱动允许不同宿主机上的容器加入同一个虚拟网络实现二层互通。但通常这需要配合一个外部的 KV 存储如 Consul、etcd、ZooKeeper来同步网络状态哪些容器在哪些主机上IP 是什么。herdctl的实现方式更为巧妙。根据其代码和文档分析它很可能采用了以下方式网络创建当herdctl执行up命令时它首先会选择其中一个节点可能是配置文件中列出的第一个主机作为“锚点”在该节点上创建 Docker Overlay 网络。创建命令类似于docker network create -d overlay herd_project_name。网络同步关键问题来了如何让其他节点也知道这个网络并加入Docker 的 Overlay 网络驱动在 Swarm 模式下是自动同步的但在非 Swarm 模式下需要--attachable参数并依赖外部 KV 存储。我推测herdctl可能利用了 Docker 网络的可连接性attachable特性然后在每个节点上通过 SSH 执行docker network connect命令将本地的 Docker 守护进程“连接”到这个已存在的网络上。或者它可能在每个节点上都执行了docker network create命令由于网络名称和配置相同Docker 会识别为同一个网络但这需要验证。容器接入在每台主机上启动容器时herdctl通过--network herd_project_name参数将容器加入到这个 Overlay 网络中。实操心得在实际使用中你可能会遇到 Overlay 网络创建失败的问题。一个常见原因是节点之间的防火墙规则阻止了 Docker 用于 Overlay 网络通信的端口默认是 UDP 4789 端口用于 VXLAN 数据面TCP/UDP 7946 用于节点发现。确保集群内所有节点的这些端口是互通的。你可以使用telnet node2 4789或nc -vzu node2 4789来测试 UDP 端口连通性。4.2 数据卷与持久化存储策略在herd.yml中我们定义了postgres_data卷。herdctl如何处理跨主机的卷呢答案是它不处理跨主机卷的同步。herdctl遵循了 Docker 的原生卷语义。当你在配置中声明一个卷如postgres_data并且某个服务如postgres使用了它herdctl在部署该服务的目标主机上本例中是node3会检查是否存在名为herd_project_name_postgres_data的 Docker 卷。如果不存在则创建它如果存在则复用。这意味着数据是本地化的postgres的数据实际存储在node3的本地磁盘路径通常是/var/lib/docker/volumes/...上。无自动复制如果将来你把postgres服务迁移到node2上运行node2上会创建一个新的、空的postgres_data卷之前node3上的数据不会自动过来。备份与迁移需手动你需要自己负责重要数据的备份和跨主机迁移方案。对于需要共享存储的场景例如多个节点上的容器需要读写同一个数据集你有以下选择使用 NFS 或其他网络文件系统在herd.yml中使用driver-opts配置一个支持多主机挂载的卷驱动或者更简单地在每个服务的volumes中直接挂载一个 NFS 路径。services: app: image: myapp volumes: - /mnt/nfs_share/app_data:/app/data # 直接挂载 NFS 路径前提是所有节点都需要预先挂载同一个 NFS 共享目录到/mnt/nfs_share。使用云提供商提供的块存储或文件存储服务如 AWS EBS/EFS, Azure Disk/File, Google Persistent Disk并通过类似的绑定挂载方式使用。重新设计应用考虑将需要共享的状态存入外部服务如数据库如 PostgreSQL、对象存储如 MinIO或缓存如 Redis而不是依赖共享文件系统。4.3 服务发现与内部 DNS 机制服务发现是微服务架构的基石。在herdctl管理的 Overlay 网络中服务发现是如何工作的当容器加入同一个 Docker Overlay 网络后Docker 会为这个网络内置一个DNS 服务器。这个 DNS 服务器的行为如下容器名解析每个容器在网络上都有一个名称默认是容器 ID 的前缀但更常用的是通过--name或container_name指定的名字。在同一个网络中一个容器可以直接使用另一个容器的名称作为主机名来访问它。例如在flask-api容器中你可以ping postgresDNS 会将其解析为postgres容器的 IP。服务名解析herdctl以及docker-compose更进一步。它会让 Docker 的 DNS 不仅解析容器名还解析在herd.yml中定义的服务名services下的键名。这就是为什么在DATABASE_URL中我们可以直接用postgres这个服务名而不是某个具体的容器名。即使未来postgres容器被重建有了新的容器 ID 和容器名只要服务名不变连接字符串就依然有效。负载均衡如果同一个服务被部署到多个主机上在deploy.hosts中列出多个主机或者通过副本数配置Docker 内置的 DNS 会提供简单的负载均衡。对服务名的 DNS 查询会返回所有健康容器实例的 IP 地址列表客户端通常是应用代码或连接库可能会以轮询方式使用这些 IP。但请注意这不是 L4/L7 的负载均衡没有健康检查剔除机制其可靠性取决于客户端。注意事项这个基于 DNS 的服务发现是“最终一致”的。新启动的容器可能需要几秒钟时间才能在网络的 DNS 中注册。因此在启动脚本中如果你的应用立即尝试连接依赖的服务可能会失败。最佳实践是在应用代码中加入重试逻辑或者使用depends_on配合condition: service_healthy来确保依赖服务已就绪。5. 高级配置、运维与故障排查指南掌握了基础部署和核心原理后我们来看看如何更好地运维一个由herdctl管理的集群以及当问题出现时如何快速定位和解决。5.1 生产环境配置建议虽然herdctl以轻量著称但在生产环境使用时仍需谨慎配置以保障安全和稳定。使用 Docker TLS 替代 SSHSSH 隧道虽然方便但在自动化流水线和需要更高安全性的环境中配置 Docker Daemon 的 TLS 认证是更规范的做法。这需要在每个节点生成 CA 和客户端/服务端证书并配置 Docker Daemon。herdctl支持通过DOCKER_HOST和DOCKER_CERT_PATH环境变量来使用 TLS 连接。# 在管理机上设置环境变量来连接 node1 export DOCKER_HOSTtcp://node1:2376 export DOCKER_TLS_VERIFY1 export DOCKER_CERT_PATH/path/to/certs herdctl -H tcp://node1:2376 --tlsverify --tlscacertca.pem --tlscertcert.pem --tlskeykey.pem up -f herd.yml # 或者在 herd.yml 的 host 定义中直接配置 hosts: prod-host: address: tcp://node1:2376 tls: verify: true ca: /path/to/ca.pem cert: /path/to/client-cert.pem key: /path/to/client-key.pem资源限制与重启策略在herd.yml中务必为每个服务配置资源限制和重启策略防止单个容器耗尽主机资源或异常退出后无法恢复。services: flask-api: deploy: resources: limits: cpus: 1.0 memory: 512M reservations: memory: 256M restart: unless-stopped # 或 always集中化日志与监控默认情况下容器日志散落在各个节点上。生产环境需要将日志集中收集到如 ELK Stack、Loki 或云服务中。可以在herd.yml中配置 Docker 的日志驱动。services: flask-api: logging: driver: json-file options: max-size: 10m max-file: 3 # 或者使用 syslog 驱动发送到远程服务器 # driver: syslog # options: # syslog-address: tcp://log-host:514同时需要在每个节点部署监控代理如 Prometheus Node Exporter并在容器中暴露应用指标供 Prometheus 抓取。镜像管理生产环境应使用来自私有镜像仓库的、带明确版本标签的镜像而非latest标签。在herd.yml中指定完整镜像路径和标签。image: my-registry.example.com/myapp/api:v1.2.35.2 日常运维命令与技巧herdctl提供了一组与docker-compose类似但作用于集群的命令。查看状态herdctl ps会列出所有节点上所有属于本项目的容器状态比登录每台机器执行docker ps方便得多。查看日志herdctl logs -f service_name可以实时追踪某个服务在所有节点上实例的日志如果该服务有多个实例。这对于调试分布式问题非常有用。执行命令herdctl exec service_name command会在运行该服务的某个容器内执行命令。注意如果服务有多个实例它可能只会在其中一个上执行。伸缩服务herdctl本身没有内置的scale命令。如果你需要增加某个服务的实例数需要在herd.yml中修改deploy.hosts列表添加更多主机或者通过其他方式如复制服务定义来实现然后重新运行herdctl up。herdctl up是幂等的它会根据当前配置调整状态达到声明式的最终状态。更新与回滚更新应用通常涉及修改herd.yml如镜像版本并再次运行herdctl up。herdctl会执行滚动更新吗从现有资料看它可能不会像 K8s 或 Swarm 那样自动进行滚动更新。更安全的做法是先更新一部分主机修改deploy.hosts列表验证新版本。验证通过后再更新剩余主机。 回滚则是将herd.yml改回旧版本再次执行herdctl up。5.3 常见问题与排查思路实录在实际使用中你肯定会遇到各种问题。下面是我总结的一些常见故障及其排查步骤。问题1执行herdctl up失败提示 SSH 连接错误或认证失败。排查思路手动 SSH 测试在管理机上执行ssh usernode1确认是否可以免密登录。如果不行检查 SSH 密钥对、authorized_keys文件权限和服务器 SSH 配置。检查 herd.yml 中的主机定义确认address:字段的格式正确userhostname或userip。检查网络连通性确保管理机可以ping通所有节点。问题2服务启动成功但服务间无法通信例如API 连不上数据库。排查思路检查网络在 API 服务所在的容器内执行ping postgres。如果 ping 不通说明 Overlay 网络有问题。确认容器是否在同一个网络在任意节点上执行docker network inspect herd_project_name查看Containers部分确认所有相关容器都已连接到此网络。检查防火墙确认节点之间放行了 Overlay 网络所需的端口UDP 4789, TCP/UDP 7946。可以在容器内用nc -zv postgres 5432测试具体服务端口的连通性。检查服务依赖确认depends_on和健康检查配置正确。可能是数据库还没准备好API 就启动了。查看 API 容器的启动日志。问题3服务日志显示“Connection refused”或“Name does not resolve”。排查思路DNS 解析问题在出问题的容器内执行cat /etc/resolv.conf查看 DNS 服务器地址。应该是 Docker 内置的 DNS如127.0.0.11。然后执行nslookup postgres或dig postgres看是否能解析出 IP。服务是否健康使用herdctl ps或docker ps查看依赖服务如postgres的容器是否真的在运行并且健康检查通过。应用配置错误检查应用连接字符串是否正确。例如DATABASE_URL中的主机名是否就是herd.yml中定义的服务名。问题4在某个节点上执行docker ps看不到预期的容器。排查思路确认部署目标仔细检查herd.yml中该服务的deploy.hosts配置确认它是否包含当前节点。查看 herdctl 日志重新运行herdctl up并加上--verbose标志查看详细的部署过程看是否有在该节点执行命令的错误信息。节点资源检查目标节点的 Docker 磁盘空间和内存是否充足。docker system df和docker info可以帮助诊断。问题5如何清理整个集群部署解决方案使用herdctl down -f herd.yml命令。这个命令会停止所有节点上属于本项目的容器。删除这些容器。注意默认情况下它可能不会删除创建的数据卷和 Overlay 网络以防止数据丢失。如果需要彻底清理可能需要手动登录各节点执行docker volume prune和docker network prune谨慎操作。通过以上这些实战配置、运维命令和排查技巧你应该能够驾驭一个由herdctl管理的多机容器环境了。它的确在简单性和功能性之间找到了一个不错的平衡点尤其适合作为迈向更复杂编排系统之前的跳板或者作为那些“刚刚好”的分布式应用场景的长期解决方案。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2605803.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!