Nirvana

致力于让业务无感知的 API 框架
授权协议 Apache-2.0
开发语言 Google Go
所属分类 Web应用开发、 REST/RESTful项目
软件类型 开源软件
地区 国产
投 递 者 乐正远
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

Nirvana:涅槃

Nirvana,梵语中的涅槃,寓意让 API 从对框架的依赖中涅槃重生,它致力于成为让业务无感知的框架。

Nirvana 借鉴了 Kubernetes 声明式 API 的设计,巧妙规避了框架对 API 的侵入。同时,为了实现业务和框架的隔离,它定义一个规范,让 API 按照规范书写,完全屏蔽了框架对 API 的影响。

一言以蔽之,Nirvana 框架的设计思路始终围绕工程师们亲历的种种痛点:

  • 构建风格一致的 API 项目;

  • 使用统一的 RESTful 路由与声明式 API 定义,避免业务对框架产生依赖;

  • 使用统一的错误生成和处理方式;

  • 提供开箱即用的基础功能,包括 Prometheus metrics、tracing、profiling 等;

  • 自动生成 API 文档和客户端代码。

特性:

  • 统一所有 Golang 项目中的 API 行为、结构和布局

  • 通过 openAPI 和客户端生成等方式提高工程效率

  • 可以通过将验证方法声明为 API 定义的一部分来添加验证

  • 开箱即用的工具支持,例如度量、分析与跟踪等

  • 简单和标准的配置管理,以及标准的 cli 接口

此外,Nirvana 还具有可扩展性和高性能的特点,其目标是支持开发的快速迭代。

在 Nirvana 中,使用一套 API Definition 来声明式地描述业务 API。下面是一个列出消息列表 API 的例子:

Definition{
    // 这个 API 返回的是资源数组,所以使用 List 方法。
    Method:     def.List,
    // Summary 是一个短语,用于描述这个 API 的用途。这个短语在生成文档和客户端的时候用于区分 API。
    // 这个字符串去掉空格后会作为生成客户端时的函数名,因此请确保这个字符串是有意义的。
    Summary:    "List Messages",
    // 详细描述这个 API 的用途。
    Description: "Query a specified number of messages and returns an array",
    // 业务函数
    Function:   message.ListMessages,
    // 对应业务函数的参数信息。用于告知 Nirvana 从请求的那一部分取得数据,然后传递给业务函数。
    Parameters: []def.Parameter{
        {
            // 参数来源
            Source:     def.Query,
            // 参数名称,作为 key 从 Source 里取值。
            // 与业务函数的参数名称无关。
            Name:       "count",
            // 默认值
            Default:    10,
            // 参数描述
            Description: "Number of messages",
        },
    },
    // 对应业务函数的返回结果。用于告知 Nirvana 业务函数返回结果如何放到请求的响应中。
    Results: def.DataErrorResults("A list of messages"),
}

而对应业务 API 的形式则是:

type Message struct {

    ID      int `json:"id"`
    Title   string `json:"title"`
    Content string `json:"content"`
}

func ListMessages(ctx context.Context, count int) ([]Message, error) {
    messages := make([]Message, count)
    for i := 0; i < count; i++ {
        messages[i].ID = i
        messages[i].Title = fmt.Sprintf("Example %d", i)
        messages[i].Content = fmt.Sprintf("Content of example %d", i)
    }
    return messages, nil
}

很显然,业务函数并不关心自身是如何暴露给外部的,实现方法也和其他内部函数没有差别(这只是一个简单的例子,更多详细内容请查阅 Nirvana Definition 文档

在这个例子里,API Definition 描述了完整的 API 结构,包括 RESTful 路径、请求方法、请求描述、请求参数、请求响应和请求 handler。框架只需要解析 API Definition,就能得到业务逻辑的入口和出口处理方式。对开发者而言,API 的开发过程从命令式路由 + 数据转换 + 业务逻辑变成了API Definition + 业务逻辑。框架与业务逻辑之间通过 API Definition 进行桥接。

接下来的目标:

  • 持续优化扩展文档和客户端生成的能力,降低开发者在这两块上的心智负担;

  • 持续优化 metrics、profiling、tracing 的能力,并增加新的云原生能力,让这些能力成为云原生应用的标配;

  • 框架模块化加强,让 Nirvana 的每一块代码皆可定制;

  • 优化框架性能,降低反射对服务的影响;

  • 让 Nirvana 成为 Golang 的 CloudNative & SOA 框架。

感谢参与开源本项目的所有开发者!

Nirvana GitHub:https://github.com/caicloud/nirvana

Nirvana 文档:https://caicloud.github.io/nirvana/zh-hans/

  • 题目链接:Codeforces - Nirvana 爆搜,或者类似于一个数位dp。 枚举当前这一位是否能取到9,然后分是否取9转移。 AC代码: #pragma GCC optimize("-Ofast","-funroll-all-loops") #include<bits/stdc++.h> //#define int long long using namespace std; int n,

  • B. Nirvana Kurt reaches nirvana when he finds the product of all the digits of some positive integer. Greater value of the product makes the nirvana deeper. Help Kurt find the maximum possible product

  • Kurt reaches nirvana when he finds the product of all the digits of some positive integer. Greater value of the product makes the nirvana deeper. Help Kurt find the maximum possible product of digits

  • ACM题解——训练赛2_B - Nirvana 题目描述 B - Nirvana Kurt reaches nirvana when he finds the product of all the digits of some positive integer. Greater value of the product makes the nirvana deeper. Help Kurt fin

  • Kurt reaches nirvana when he finds the product of all the digits of some positive integer. Greater value of the product makes the nirvana deeper. Help Kurt find the maximum possible product of digits

 相关资料
  • 我有以下业务对象 我有以下用于 json 序列化的接口和实现 这是我的客户代码 这里我不喜欢的是,员工知道它将使用特定的库进行序列化(因为JsonProperty属性)。因此,如果我决定使用另一个json序列化程序或编写自己的,我将需要遍历所有业务对象并修改它们。有可能使我的业务对象序列化变得无知吗?如果是,如何 XML序列化和XmlSerializer类也是一样的:我需要用一些属性标记业务对象中

  • 1. 光线传感器(板载)光线强度 报告指定光线传感器检测到的光线强度。 示例: 按下空格键,板载光线传感器检测到的光线强度会显示在 mBot 的外接表情面板。 2. 超声波传感器(接口3)距离 cm 报告指定超声波传感器检测到的障碍物距离(cm)。 示例: 按下空格键,接口3连接的超声波传感器检测到的障碍物距离会显示在 mBot 的外接表情面板。 3. 巡线传感器(接口2)读数 报告指定巡线传感器

  • 该部分 API 将帮助您使用光环上的各类传感器的状态值,包含按钮、麦克风、加速度计、陀螺仪以及四个触摸点。 省略代码中的halocode 注意:该部分 API 省略了“halocode.”,本篇提及的所有 API 均省略了“halocode.” ,如 led_driver.off( )实际为halocode.led_driver.off()。mBuild 电子模块平台的所有功能均维护在haloco

  • 小程 小奔 – 颜色红外传感器 1. 按钮()被按下? 如果小程指定的按钮被按下,报告条件成立。按钮包含A、B、C三个选项,默认为按钮A。 示例: 小程启动后,如果按钮A被按下,屏幕显示“Yes”,否则显示“No”。 2. 小程接入小奔? 如果小程与小奔组合在一起,报告条件成立。 示例: 小程启动后,如果小程与小奔组合在一起,屏幕显示“Yes”,否则显示“No”。 3. 齿轮电位器读数 报告小程齿

  • 我使用Spring Cloud Netflix构建了一个Eureka服务器。服务器正在工作,因此我目前正在尝试添加第二个Eureka服务器,以提高弹性,并在更新服务器时提供备用服务器。 http://cloud.spring.io/spring-cloud-netflix/spring-cloud-netflix.html这听起来很简单:你只需要像Eureka客户端一样配置你的服务器。因此,我将其

  • 本文向大家介绍Android基于Sensor感应器获取重力感应加速度的方法,包括了Android基于Sensor感应器获取重力感应加速度的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android基于Sensor感应器获取重力感应加速度的方法。分享给大家供大家参考,具体如下: FETC项目指导老师提出了新的需求,想要在游戏地图中表现出用户用户当期移动的方向,再用GPS的话显然很不靠