0

0

PnR:具有 Go 平台抽象的配置意图驱动的容器编排

DDD

DDD

发布时间:2024-12-23 08:57:02

|

587人浏览过

|

来源于dev.to

转载

您是否曾经希望容器编排能够比静态依赖链更灵活,但又比 kubernetes 更简单?满足 pnr(提示和响应) - 一种配置驱动的方法,利用 go 强大的平台抽象功能根据实际的就绪状态而不是简单的依赖关系来编排容器。

go 平台抽象的力量

在深入探讨 pnr 之前,让我们先了解一下为什么 go 特别适合跨平台容器编排:

  1. 统一的 docker api 接口:go 的 docker 客户端库通过特定于平台的套接字连接提供跨 windowslinuxmacos 的一致接口:

    • unix系统使用/var/run/docker.sock
    • windows 使用命名管道
    • client.newclientwithopts() 函数会自动处理这些差异
  2. 原生并发支持:go 的 goroutine 和通道可实现高效的容器监控:

    • 每个容器的健康检查同时运行
    • 意图循环协调多个容器而不阻塞
    • 互斥保护状态更新可防止竞争情况
  3. 跨平台网络处理:go 的 net 包抽象了特定于平台的网络详细信息:

    • tcp 健康检查在不同操作系统上的工作方式相同
    • http 客户端处理特定于平台的 dns 解析
    • 无论平台如何,端口绑定都使用一致的语法

核心概念:配置胜于代码

pnr 通过三个关键组件来编排容器:

  1. 域配置(json)
  2. 与平台无关的健康检查
  3. 运行时状态管理

让我们看看典型的 web 堆栈的实际效果:mongodb、api 服务器和 web 客户端。

域配置结构

{
    "name": "dev_stack",
    "cpuxs": {
        "stack_startup": {
            "design_chunks": [
                {
                    "name": "mongodb",
                    "gatekeeper": {
                        "system_ready": {
                            "prompt": "is system ready?",
                            "response": ["yes"],
                            "tv": "y"
                        }
                    },
                    "flowout": {
                        "mongodb_ready": {
                            "prompt": "is mongodb ready?",
                            "response": ["yes"],
                            "tv": "y"
                        }
                    },
                    "health_check": {
                        "type": "tcp",
                        "port_key": "27017",
                        "timeout_seconds": 2,
                        "status_mapping": {
                            "success": {
                                "key": "mongodb_ready",
                                "response": ["yes"],
                                "tv": "y"
                            },
                            "failure": {
                                "key": "mongodb_ready",
                                "response": ["no"],
                                "tv": "n"
                            }
                        }
                    },
                    "container": {
                        "name": "pnr_mongodb",
                        "image": "mongo:latest",
                        "ports": {
                            "27017": "27017"
                        }
                    }
                }
            ]
        }
    }
}

与平台无关的容器管理

pnr 的核心是其与平台无关的容器管理。其工作原理如下:

func (il *containerintentionloop) execute() error {
    // create platform-specific network
    _, err := il.dockerclient.networkcreate(il.ctx, "pnr_network", types.networkcreate{})
    if err != nil {
        return fmt.errorf("failed to create network: %v", err)
    }

    for {
        // update runtime state
        if err := il.updatertstatefromruntime(); err != nil {
            return err
        }

        allcompleted := true
        anyexecuting := false

        // process each container
        for i := range il.cpux.designchunks {
            chunk := &il.cpux.designchunks[i]

            // container state machine
            switch chunk.status {
            case "completed":
                continue
            case "executing":
                anyexecuting = true
                allcompleted = false
                if il.checkchunkcompletion(chunk) {
                    chunk.status = "completed"
                }
            case "", "ready":
                allcompleted = false
                if il.checkgatekeeper(chunk) {
                    if err := il.startcontainer(chunk); err != nil {
                        return err
                    }
                    chunk.status = "executing"
                    anyexecuting = true
                }
            }
        }

        // check termination conditions
        if allcompleted {
            return nil
        }
        if !anyexecuting && !allcompleted {
            return fmt.errorf("no progress possible - execution stalled")
        }

        time.sleep(5 * time.second)
    }
}

跨平台健康检查

pnr 使用 go 的标准库实现平台无关的健康检查:

魔珐星云
魔珐星云

无需昂贵GPU,一键解锁超写实/二次元等多风格3D数字人,跨端适配千万级并发的具身智能平台。

下载
func (il *containerintentionloop) checkchunkcompletion(chunk *designchunk) bool {
    // platform-agnostic container status check
    isrunning, err := il.iscontainerrunning(chunk.container.name)
    if !isrunning {
        il.updatechunkstatus(chunk, false)
        return false
    }

    // health check based on configuration
    status := false
    switch chunk.healthcheck.type {
    case "tcp":
        addr := fmt.sprintf("localhost:%s", chunk.container.ports[chunk.healthcheck.portkey])
        conn, err := net.dialtimeout("tcp", addr, timeout)
        if err == nil {
            conn.close()
            status = true
        }

    case "http":
        url := fmt.sprintf("http://localhost:%s%s", 
            chunk.container.ports[chunk.healthcheck.portkey],
            chunk.healthcheck.path)
        resp, err := client.get(url)
        if err == nil {
            status = (resp.statuscode == chunk.healthcheck.expectedcode)
        }
    }

    il.updatechunkstatus(chunk, status)
    return status
}

主要优点

  1. 真正的跨平台支持:在 windows、linux 和 macos 上的工作方式相同
  2. 配置驱动:domain.json中的所有编排逻辑
  3. 与容器无关:无需对 pnr 特定容器进行修改
  4. 灵活的健康检查:tcp、http,并可扩展至其他协议
  5. 状态可见性:通过运行时文件清除状态更新
  6. 并发执行:高效的并行容器管理

入门

完整代码可以在这里找到:github

先决条件

  1. 安装 go(1.19 或更高版本):

  2. 安装 docker

项目结构

pnr-orchestrator/
├── main.go
├── containers.go
├── config/
│   └── domain.json
└── runtime/          # created automatically

安装

# create project directory
mkdir pnr-orchestrator
cd pnr-orchestrator

# initialize go module
go mod init pnr-orchestrator

# install dependencies
go get github.com/docker/docker/client
go get github.com/docker/docker/api/types
go get github.com/docker/go-connections/nat

构建和运行

# option 1: direct run
go run main.go containers.go

# option 2: build and run separately
go build
./pnr-orchestrator   # unix/linux/mac
pnr-orchestrator.exe # windows

超越简单的依赖关系

传统 docker 撰写:

api:
  depends_on:
    - mongodb

pnr 的智能编排:

"gatekeeper": {
    "mongodb_ready": {
        "prompt": "Is MongoDB ready?",
        "response": ["yes"],
        "tv": "Y"
    }
}

主要区别? pnr 确保跨任何平台的实际服务准备就绪,而不仅仅是容器启动。

下一步

  1. 探索更复杂的编排模式
  2. 添加自定义健康检查类型
  3. 实施正常关闭和清理
  4. 创建特定于平台的优化提示

pnr 演示了 go 强大的平台抽象功能如何在不牺牲简单性或功能的情况下创建强大的跨平台容器编排工具。

如果您想查看更多示例或对特定于平台的实现有疑问,请在评论中告诉我!

相关文章

驱动精灵
驱动精灵

驱动精灵基于驱动之家十余年的专业数据积累,驱动支持度高,已经为数亿用户解决了各种电脑驱动问题、系统故障,是目前有效的驱动软件,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

411

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

532

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1018

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

63

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

404

2025.12.29

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

388

2023.07.18

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

8

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.2万人学习

Git 教程
Git 教程

共21课时 | 2.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号