GraphQL概要
GraphQL概要
GraphQL是什么
API标准,可以作为REST API的备选方案
由Facebook开发并开源发布
用于API的查询语言
GraphQL诞生的原因
在网速较慢的设备上,移动端应用需要更快速的加载数据。GraphQL只需要传输前端需要的数据,而REST API则传世请求资源的所有数据。
前端框架和平台多种多样,GraphQL可以让它们可以精确地访问需要的数据。
持续集成导致API改动频率增加,而GraphQL则能减少这样的改动。
GraphQL相对于REST的优势
减少了要传输的数据
减少了发送请求的数量
避免了由于API设计变化导致的endpoint结构的调整
更理解客户端对数据的需求
Schema和强类型可以让前后端独立开发
GraphQL的核心概念
Schema Definition Language (SDL)
12345678910type Person { name: String! age: Int! posts: [Post!]!}type Post { title: String ...
Docker笔记
存储卷(Volumes)
匿名卷:可以在Dockerfile中使用VOLUME [ "/path" ]创建匿名卷,也可以在启动容器的时候用-v /path来创建。匿名卷在container被删掉之后会被自动删除。
命名卷:可以在启动容器的时候用-v volume_name:/path来创建命名卷。命名卷在容器被删除时不会被自动删除。
绑定挂载(Bind Mount):在启动容器时使用-v host_path:/container_path将主机上的目录映射到容器中。这样主机上文件的改动就能直接反映在容器里,无需重新构建容器镜像。
容器网络
容器中可以使用host.docker.internal作为主机名来访问主机网络。
多个容器可以通过--network {network_name}加入同一网络,同一网络中的容器可以通过容器名互相访问。
Docker网络有bridge, host, none, overlay, macvlan, third-party plugin等类型,在创建网络是通过--driver来指定。
CMD or ENTRYPO ...
Go语言的过程式编程
Go语言中常用的内置函数
函数
用法
append(s, …)
将s后面的所有参数追加到切片s中,如果容量不够,则新建一个切片
cap(x)
返回切片或者通道的容量,数组的长度
len(x)
返回切片、数组或者通道的长度
close(ch)
关闭通道,即不可以再往通道中写入值,但还可以读取
complex(r, i)
生成一个复数
copy(dist, src)
将切片src中的项复制到切片dist中,或者讲字符串src复制到[]byte类型的切片dist中
delete(m, k)
从映射m中删除键值为k的项
real(cx)
返回复数cx的实部
imag(cx)
返回复数cx的虚部
make(T, l, c)
创建一个切片、通道或者映射
new(T)
一个指向类型为T的值的指针
panic(x)
抛出一个运行时异常,其值为x
recover()
捕获一个运行时异常
Go语言赋值
Go语言中的自增自减运算符都是后置的,且没有返回值。
可以使用=来给变量赋值,如果前面没有加var,那么变量必须是已经存在的。
可以使用逗号同时 ...
Go语言中的集合类型
指针
Go语言中只有值传递。
切片、映射、通道、函数等引用类型也是值传递,只不过它们的值是指针,所以对形参的改变也会反映到实参本身。
指针是指保存了另一个变量内存地址的变量。通过指针可以让参数传递的成本最低且内容可修改,而且可以让变量的生命周期独立于作用域。
数组和切片
使用如下语法创建数组。123[length]Type[N]Type{value1, value2, ..., valueN}[...]Type{value1, value2, ..., valueN}
数组的长度是固定的,不可以修改。
数组的容量cap()和长度len()都等于数组的长度。
数组按值传递,及传递给函数的是数组的副本,而切片是引用类型,传递的是指针。
12345678910111213package mainimport "fmt"func changeArray(a [3]int) { a[0] = 3}func main() { myarray := [3]int{1, 2, 3} cha ...
Ansible概要
Ansible是什么?Ansible是一个自动化管理远程系统的工具,它主要有两个功能:
自动化管理远程节点
控制远程节点,让它们满足预期的状态
主要由3个组件构成:
控制节点: 用于安装和运行ansible。
被控制节点: ansible管理的节点。
清单(Inventory):按逻辑组织的被控制节点列表,它描述了ansible管理的对象。
Ansible的安装配置步骤:
使用Homebrew安装: brew install ansible
创建被管理节点的清单hosts.yaml
123456789101112all: children: master: hosts: master-node: ansible_host: 52.118.108.104 ansible_user: root nodes: hosts: node-1: ansible_host: 150.238.65.205 ansible_user: root
检验清单是 ...
OpenAPI 概要
OpenAPI是什么?OpenAPI被用来描述基于HTTP的API,是目前被广泛接受和使用的API工业标准。
使用OpenAPI规范的优势
可以使用工具检查用户定义的API是否满足OpenAPI特定版本的规范,语法是否正确等。
可以检查请求和响应中的数据是否正确。
可以自动生成API文档。
自动生成客户端和服务端的代码。
可以用图形化工具快速、方便地创建API描述文件。
可以在写代码之前创建提供示例响应的伪HTTP服务器。
在API定义阶段就可以发现一些可能出现的安全漏洞。
API描述文件 API描述文件是一个机器可读的API定义文件。它应该是尽量完整的、细致的、明确的。开发者可以使用API描述文件来自动生成API文档以及代码。
格式: JSON 或者 YAML
最小化结构:12345openapi: 3.1.0 # OpenAPI版本info: title: A minimal OpenAPI document version: 0.0.1 # API版本paths: {} # No endpoints defined
Servers对象12345678 ...
函数式编程概要
函数式编程是什么?函数式编程是一种通过组合纯函数来编写软件的编程范式,它是声明式而非命令式的,其原则是避免共享状态, 改变数据,以及副作用。
函数式编程推荐:
使用纯函数
使用函数组合
使用声明式代码而非命令式代码
函数式编程应当避免:
副作用
改变数据
共享状态
术语解释副作用(side effect)函数副作用是指函数在执行过程中改变了函数之外的环境。具体地说,函数副作用是指函数被调用,完成了函数既定的计算任务,但同时因为访问了外部数据,尤其是因为对外部数据进行了写操作,从而一定程度地改变了系统环境。 例如下面的函数就有副作用,它改变了外部变量count。
12345let count = 0;function add1() { count += 1;}
下面的情形都是有副作用的:
函数在执行过程中改变了外部变量
改变了函数的参数
抛出了异常
打印字符串到标准输出或者记录了日志
启动了一个子进程
调用了有副作用的函数
纯函数如果一个函数满足下列条件则它就是一个纯函数:
有输入(参数)
没有状态 (如全局变量)
相同的输入,总是会的到相同的输出
...
Go语言中的正则表达式
正则表达式在字符串的处理中占有重要的地位,Go语言中的regexp包提供了对正则表达式的支持。
正则表达式基础正则表达式(Regular Expression)是一个特殊的字符串,它定义了一种文本模式。通过正则表达式,你可以从所有文本中匹配到满足特定模式的文本(字符串),然后可以:
测试字符串是否满足这种特定模式,例如:是不是IP地址、电话号码,银行卡号等
替换文本,将文本中部分或者所有满足这种特定模式的字符串替换、删除掉
提取满足这种特定模式的子字符串
元字符元字符在正则表达式中有特殊的意义,要匹配这些元字符本身的话,需要用反斜杆转义。元字符有12个,如下所示:
1$()*+.?[\^{|
]和}不属于元字符是因为它们是否需要被转义依赖于前面是否有[和{
量词以下几个字符我们称之为量词,它们表示匹配字符重复的次数。
量词
含义
?
重复0次或者1次
*
重复0次或者多次
+
重复1次或者多次
{m, n}
m,n为数字,至少重复m次,最多重复n次, m和n中的一个可以不指定
惰性匹配和贪婪匹配在量词后面加?表示惰性匹配, ...
Go语言中的字符串
字符串语法基础
Go语言中的字符串采用UTF-8编码格式
字符串字面量使用双引号"以及反引号 ` 来创建,区别在于双引号解析转义字符而反引号不解析
字符串操作符Go语言中的字符串支持如下操作:
语法
描述
s + t
将字符串s和字符串t连接起来
s += t
s = s + t
s[n]
字符串s中索引为n的字节 uint8类型
s[n:m]
从索引n到m-1取得的子字符串 (按字节)
s[n:]
从索引n到字符串结尾取得的子字符串 (按字节)
s[:m]
从字符串开头到索引位置m-1取得的子字符串 (按字节)
len(s)
计算字符串的字节数
[]rune(s)
将字符串转化为码点(int32)数组
len([]rune(s))
计算字符串的码点数, 即字符数
string(chars)
将一个码点数组转化为字符串
[]byte(s)
将字符串转化为字节(uint8)数组
string(bytes)
将字节数组转化为字符串
string(i)
将任意类型数字转化为字符串
strconv.Itoa(i)
将i ...
Go语言中的数值类型
与其它语言一样,Go语言支持整型和浮点型数值。不同的是,Go语言是强类型语言,数值运算需要在同一种类型的数值之间进行。
Go语言内置的数值类型都支持下面所列的运算:
语法
描述
+x
x
-x
x的负值
x++
x加上常量1
x–
x减去常量1
x + y
x加上y
x - y
x减去y
x * y
x乘以y
x / y
x除以y
x += y
x = x + y
x -= y
x = x - y
x *=y
x = x * y
x /=y
x = x / y
类型转换数值类型的变量在定义时就需要指定其类型,如果没有指定,Go会进行类型推断。常量可以与其它类型兼容,不用转换也可以进行运算。不同类型的数值运算需要先使用下面的方法进行类型转换。注意:类型转换可能会导致精度丢失。
1type(value)
例如:
123456789101112package mainimport "fmt"func main() { const times = 3 // 定义常量 i := 20 // ...