此章节定义标准方法 List
、Get
、Create
、Update
和 Delete
。标准方法存在的意义是广泛的 API 中许多 API 方法具有非常相似的语义,通过将这些类似的 API 融合到标准方法中,我们可以显著降低复杂性并提高一致性。以 Google APIs 为例,超过 70% 是标准方法,这让它们更加易于学习和使用。
下表描述了如何将它们映射为 REST 方法,也称为 CRUD 方法:
此章节定义标准方法 List
、Get
、Create
、Update
和 Delete
。标准方法存在的意义是广泛的 API 中许多 API 方法具有非常相似的语义,通过将这些类似的 API 融合到标准方法中,我们可以显著降低复杂性并提高一致性。以 Google APIs 为例,超过 70% 是标准方法,这让它们更加易于学习和使用。
下表描述了如何将它们映射为 REST 方法,也称为 CRUD 方法:
在面向资源的 API 中,资源是命名实体,资源名称是其标识符。每个资源 必须( MUST ) 有唯一的资源名称。资源名称由资源自己的 ID,任一父资源的 ID 及其 API 服务名称组成。下面我们将看一看资源 ID 和资源名是如何构成的。
gRPC API 应该为资源名使用无协议(scheme-less)的 URI。它们通常遵循 REST URL 惯例并且其行为与网络文件路径非常相似。它们能非常容易地映射到 REST API:详细内容查看标准方法。
集合是一种特殊类型的资源,它包含了相同类型子资源的列表。例如,目录是文件资源的集合。集合的资源 ID 叫做集合 ID。
资源名称由集合 ID 和资源 ID 按层次组织形成,并以斜杠(/)分隔。如果资源包含子资源,子资源名称的格式是父资源名称后面加上子资源 ID,同样地使用斜杠分隔。
这篇设计指南的目的是帮助开发者设计出简单、一致、易于使用的网络 API,同时它也帮助我们统一了 RPC API(基于 socket)与 REST API(基于 HTTP)的设计。
传统上,人们参考像 CORBA 和 Windows COM 这样的 API 接口和方法来设计 RPC API。随着时间推移,越来越多的接口和方法被添加。最后的结果是被数量众多的接口和方法淹没,每一个都和其他不同。为了正确使用它们开发者必须仔细学习每一个接口或方法,这必定会消耗时间并容易引入问题。
REST 架构风格最早出现于2000年,主要设计为与 HTTP/1.1 一起使用。它的主要原则是定义能够被少量方法操作的命名资源。资源和方法被认为是 API 的名词和动词。与 HTTP 协议配合,资源名自然地映射为 URL,方法自然地映射为 HTTP 方法 POST
、GET
、PUT
、PATCH
和 DELETE
。
翻译自 API Design Guide
这是一篇网络 API 的通用设计指南,它从2014年开始被 Google 使用,并且指导我们设计了 Cloud API 和 其它Google API。我们将此指南分享出来希望能让人们更便捷地合作。
下面的文章翻译自 Google API 设计指南,翻译时的版本是2017-02-21
这篇文章介绍prometheus和alertmanager的报警和通知规则,prometheus的配置文件名为prometheus.yml
,alertmanager的配置文件名为alertmanager.yml
报警:指prometheus将监测到的异常事件发送给alertmanager,而不是指发送邮件通知
通知:指alertmanager发送异常事件的通知(邮件、webhook等)
alertmanager能够设置多种通知规则,这篇文章介绍如何配置邮件通知
如下修改receivers
-email_configs
-html
后,收到的邮件内容是:测试 http://ming:9093 。html
表示的是邮件内容。
1 | receivers: |
邮件模版使用go template编写,两对大括号中的.ExternalURL
即表示变量的ExternalURL
字段,Data
结构如下,源码在这里。请自行google go template的使用方法。
1 | // Data is the data passed to notification templates and webhook pushes. |
apiserver对外提供API服务,主要功能是验证处理REST请求,并更新保存在etcd中的相关对象。这篇文章以kubernetes1.5.3进行说明。
apiserver的入口是cmd/kube-apiserver/apiserver.go
app.Run()的操作:
之前一直用vscode来写Golang,直到有人向我推荐了IDEA,便折服于它的强大。在这里分享一些IDEA的操作和技巧(只说Golang,但一些技巧对其他语言同样有效)。
先看这段代码,结果是[0 2 3]
,很多人都能答对。
1 | func modify(s []int) { |
然后稍微改动一下,再猜一下结果
1 | func pop(s []int) { |
如果认为输出[1 2]
的话那么你错了,结果是[1 2 3]
,你可能会觉得很奇怪,slice是引用语义这个在第一个例子中已经证明了,为什么第二个例子中又不是这样呢。