CUE-云原生配置语言

CUE 是一种服务于云化配置的强类型配置语言,由 Go team 成员 Marcel van Lohiuzen 结合 BCL 及多种其他语言研发并开源,可以说是 BCL 思路的开源版实现CUE 是一种服务于云化配置的强类型配置语言,由 Go team 成员 Marcel van Lohiuzen 结合 BCL 及多种其他语言研发并开源,可以说是 BCL 思路的开源版实现

https://cuelang.org/docs/concept/popular-guides/#common-use-cases

Cue的语法类似于JSON,但提供了更多的类型检查和验证功能。Cue不是基于Go语言,但是它的实现是用Go编写的,而且它可以与Go语言集成。

Cue语言的一个主要特点是它支持声明式的数据验证和约束。这意味着你可以用Cue来定义你的数据结构和数据的约束条件,然后Cue会根据这些约束条件进行类型检查和数据验证,以确保你的数据符合预期的规范。这些功能使得Cue非常适合用于数据处理和数据验证场景,例如配置文件、API参数验证、数据转换等。

在Cue中,你可以定义结构体、列表、枚举等数据类型,并且可以在这些数据类型中添加约束条件,例如正则表达式、最大长度、最小值等等。Cue还支持函数和表达式,这使得你可以编写复杂的验证逻辑和转换逻辑。

如果你想在Go程序中使用Cue,你可以使用Cue的Go SDK。Go SDK提供了一组API,用于加载和解析Cue定义的数据结构,进行类型检查和数据验证,并将验证结果返回给你的Go程序。你还可以使用Cue来生成Go代码,以便在Go程序中使用Cue定义的数据结构和验证规则。

在kubevela使用:

template: |
  parameter: {
      domain: string
      http: [string]: int
  }


  // trait template can have multiple outputs in one trait
  outputs: service: {
      apiVersion: "v1"
      kind:       "Service"
      spec: {
          selector:
              app: context.name
          ports: [
              for k, v in parameter.http {
                  port:       v
                  targetPort: v
              },
          ]
      }
  }


  outputs: ingress: {
      apiVersion: "networking.k8s.io/v1beta1"
      kind:       "Ingress"
      metadata:
          name: context.name
      spec: {
          rules: [{
              host: parameter.domain
              http: {
                  paths: [
                      for k, v in parameter.http {
                          path: k
                          backend: {
                              serviceName: context.name
                              servicePort: v
                          }
                      },
                  ]
              }
          }]
      }
  }

可以看到,只需要传入 parameter,就可以得到包含 Service和 Ingress的 output

在k8s中的使用:
CUE 的另一大杀器,可以针对原生 Kubernetes 源码生成描述 cue 文件,所有 k8s 资源相关的配置文件,都可以天然地拥有 schema 校验。具体教程可以查看 Kubernetes tutorial。

package templates


import (
 apps "k8s.io/api/apps/v1"
)


deployment: apps.#Deployment


deployment: {
 apiVersion: "apps/v1"
 kind:       "Deployment"
 metadata: {
  name:   deployment_name
  labels: _labels
 }
...

类似这个例子中,我们定义的 deployment 将会通过 apps.#Deployment 校验,轻松检测出不合法的字段。理论上,你可以针对多个不同版本的 k8s 资源都生成 cue 文件,并且都作为 deployment 的模型定义,这样可以实现资源定义的多版本兼容能力。

相关推荐

  1. CUE-原生配置语言

    2024-07-22 20:14:04       17 阅读
  2. 原生系列Go语言篇-标准库 Part 1

    2024-07-22 20:14:04       42 阅读
  3. 原生系列Go语言篇-标准库 Part 2

    2024-07-22 20:14:04       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-22 20:14:04       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-22 20:14:04       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-22 20:14:04       45 阅读
  4. Python语言-面向对象

    2024-07-22 20:14:04       55 阅读

热门阅读

  1. QEMU入门

    2024-07-22 20:14:04       16 阅读
  2. Redis哨兵模式实践

    2024-07-22 20:14:04       15 阅读
  3. MLlib机器学习入门:用Spark打造预测模型

    2024-07-22 20:14:04       19 阅读
  4. python绘制函数调用图总结

    2024-07-22 20:14:04       16 阅读
  5. PHP 表单验证:邮件和URL

    2024-07-22 20:14:04       17 阅读
  6. org.apache.ibatis.session是什么?

    2024-07-22 20:14:04       13 阅读
  7. C语言 指针方法 有一个班4个学生,5门课程

    2024-07-22 20:14:04       13 阅读
  8. C++中的explicit关键字

    2024-07-22 20:14:04       13 阅读
  9. 数组常见的实例方法

    2024-07-22 20:14:04       15 阅读