tailnode 的博客

给岁月以文明,而不是给文明以岁月


  • 首页

  • 关于

  • 归档

  • 标签

  • 搜索

Google API 设计指南-标准方法

发表于 2017-03-21 | 阅读次数

翻译自 API Design Guide - Standard Methods

此章节定义标准方法 List、Get、Create、Update 和 Delete。标准方法存在的意义是广泛的 API 中许多 API 方法具有非常相似的语义,通过将这些类似的 API 融合到标准方法中,我们可以显著降低复杂性并提高一致性。以 Google APIs 为例,超过 70% 是标准方法,这让它们更加易于学习和使用。

下表描述了如何将它们映射为 REST 方法,也称为 CRUD 方法:

阅读全文 »

Google API 设计指南-资源名称

发表于 2017-03-18 | 阅读次数

翻译自 API Design Guide - Resource Names

在面向资源的 API 中,资源是命名实体,资源名称是其标识符。每个资源 必须( MUST ) 有唯一的资源名称。资源名称由资源自己的 ID,任一父资源的 ID 及其 API 服务名称组成。下面我们将看一看资源 ID 和资源名是如何构成的。

gRPC API 应该为资源名使用无协议(scheme-less)的 URI。它们通常遵循 REST URL 惯例并且其行为与网络文件路径非常相似。它们能非常容易地映射到 REST API:详细内容查看标准方法。

集合是一种特殊类型的资源,它包含了相同类型子资源的列表。例如,目录是文件资源的集合。集合的资源 ID 叫做集合 ID。

资源名称由集合 ID 和资源 ID 按层次组织形成,并以斜杠(/)分隔。如果资源包含子资源,子资源名称的格式是父资源名称后面加上子资源 ID,同样地使用斜杠分隔。

阅读全文 »

Google API 设计指南-面向资源的设计

发表于 2017-03-17 | 阅读次数

翻译自 API Design Guide - Resource Oriented Design

这篇设计指南的目的是帮助开发者设计出简单、一致、易于使用的网络 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。

阅读全文 »

Google API 设计指南-介绍

发表于 2017-03-17 | 阅读次数

翻译自 API Design Guide

介绍

这是一篇网络 API 的通用设计指南,它从2014年开始被 Google 使用,并且指导我们设计了 Cloud API 和 其它Google API。我们将此指南分享出来希望能让人们更便捷地合作。

阅读全文 »

Google API 设计指南-目录

发表于 2017-03-17 | 阅读次数

下面的文章翻译自 Google API 设计指南,翻译时的版本是2017-02-21

  • 介绍
  • 面向资源的设计
  • 资源名称
  • 标准方法
  • 自定义方法
  • 标准字段
  • 错误
  • 命名约定
  • 设计模式
  • 文档
  • 使用 proto3
  • 版本控制
  • 兼容性
  • 目录结构
  • 文件结构
  • 词汇表

alertmanager报警规则详解

发表于 2017-03-09 | 阅读次数

说明

这篇文章介绍prometheus和alertmanager的报警和通知规则,prometheus的配置文件名为prometheus.yml,alertmanager的配置文件名为alertmanager.yml
报警:指prometheus将监测到的异常事件发送给alertmanager,而不是指发送邮件通知
通知:指alertmanager发送异常事件的通知(邮件、webhook等)

报警规则

阅读全文 »

alertmanager邮件模版

发表于 2017-03-09 | 阅读次数

说明

alertmanager能够设置多种通知规则,这篇文章介绍如何配置邮件通知

简单设置

如下修改receivers-email_configs-html后,收到的邮件内容是:测试 http://ming:9093 。html表示的是邮件内容。

1
2
3
4
5
receivers:
- name: 'mengyuan'
email_configs:
- to: 'xxxx@xxx.com'
html: '测试 {{ .ExternalURL }}'

模版变量

邮件模版使用go template编写,两对大括号中的.ExternalURL即表示变量的ExternalURL字段,Data结构如下,源码在这里。请自行google go template的使用方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// Data is the data passed to notification templates and webhook pushes.
//
// End-users should not be exposed to Go's type system, as this will confuse them and prevent
// simple things like simple equality checks to fail. Map everything to float64/string.
type Data struct {
Receiver string `json:"receiver"`
Status string `json:"status"`
Alerts Alerts `json:"alerts"`

GroupLabels KV `json:"groupLabels"`
CommonLabels KV `json:"commonLabels"`
CommonAnnotations KV `json:"commonAnnotations"`

ExternalURL string `json:"externalURL"`
}
// Alert holds one alert for notification templates.
type Alert struct {
Status string `json:"status"`
Labels KV `json:"labels"`
Annotations KV `json:"annotations"`
StartsAt time.Time `json:"startsAt"`
EndsAt time.Time `json:"endsAt"`
GeneratorURL string `json:"generatorURL"`
}
// Alerts is a list of Alert objects.
type Alerts []Alert
// KV is a set of key/value string pairs.
type KV map[string]string
阅读全文 »

k8s-apiserver

发表于 2017-02-27 | 阅读次数

说明

apiserver对外提供API服务,主要功能是验证处理REST请求,并更新保存在etcd中的相关对象。这篇文章以kubernetes1.5.3进行说明。

代码学习

apiserver的入口是cmd/kube-apiserver/apiserver.go
app.Run()的操作:

  • 参数校验
  • 加载插件
  • m, err := config.Complete().New()为httpserver设置路由
  • sharedInformers.Start(wait.NeverStop)启动informer,用于监听pods, nodes, namespaces等组件的事件
  • m.GenericAPIServer.PrepareRun().Run(wait.NeverStop)启动http server
阅读全文 »

IDEA使用技巧收集

发表于 2017-01-13 | 阅读次数

之前一直用vscode来写Golang,直到有人向我推荐了IDEA,便折服于它的强大。在这里分享一些IDEA的操作和技巧(只说Golang,但一些技巧对其他语言同样有效)。

  • Help -> Keymap Reference能够打开快捷键映射的PDF文件,方便我们查看
阅读全文 »

深入理解Go语言的slice

发表于 2017-01-13 | 阅读次数

先看这段代码,结果是[0 2 3],很多人都能答对。

1
2
3
4
5
6
7
8
func modify(s []int) {
s[0] = 0
}
func main() {
s := []int{1, 2, 3}
modify(s)
fmt.Println(s)
}

然后稍微改动一下,再猜一下结果

1
2
3
4
5
6
7
8
func pop(s []int) {
s = s[:len(s)-1]
}
func main() {
s := []int{1, 2, 3}
pop(s)
fmt.Println(s)
}

如果认为输出[1 2]的话那么你错了,结果是[1 2 3],你可能会觉得很奇怪,slice是引用语义这个在第一个例子中已经证明了,为什么第二个例子中又不是这样呢。

阅读全文 »
1234
tailnode

tailnode

39 日志
10 标签
GitHub Email
© 2019 tailnode
由 Hexo 强力驱动
主题 - NexT.Pisces