本文针对云原生网关 APISIX
的核心流程以源码分析的方式剖析其工作原理,并对于网关未来的发展方向进行了思考。
1. APISIX 概述
APISIX 与 Kong 类似,是一个基于 OpenResty 构建的 API 网关,如果你熟悉
OpenResty,你大概能猜到本文会讲述 APISIX 在 OpenResty 的几大生命周期中,
做了什么动作来进行路由匹配、服务发现、负载均衡以及加载插件。 APISIX
不同于 Kong 的地方,例如 etcd
数据变化监听、强大的缓存机制、以及在性能优化上做的尝试,本文也会一一阐述。
1.1. 项目概述
APISIX 是基于 OpenResty 开发的 API 网关,与 OpenResty
的请求生命周期一致,APISIX 利用 Lua Nginx Module 提供的
*_by_lua 添加 Hook。
APISIX 抽象了 Route、Service、Upstream、Plugin、Consumer
等数据模型,与 Kong 网关如出一辙。
基本上可以看作 APISIX 是 Kong 网关的重构——运用大量 LuaJIT、Open ...
YAML 是 “YAML Ain’t a Markup Language”(YAML
不是一种标记语言)的递归缩写。在开发的这种语言时,YAML
的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)。
YAML
的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。
YAML 的配置文件后缀为
.yml,如:runoob.yml 。
基本语法
大小写敏感
使用缩进表示层级关系
缩进不允许使用tab,只允许空格
缩进的空格数不重要,只要相同层级的元素左对齐即可
’#’表示注释
数据类型
YAML 支持以下几种数据类型:
对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) /
字典(dictionary)
数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
纯量(scalars):单个的、不可再分的值
YAM ...
Docker 微服务教程
Docker
是一个容器工具,提供虚拟环境。很多人认为,它改变了我们对软件的认识。
站在 Docker
的角度,软件就是容器的组合:业务逻辑容器、数据库容器、储存容器、队列容器……Docker
使得软件可以拆分成若干个标准化容器,然后像搭积木一样组合起来。
这正是微服务(microservices)的思想:软件把任务外包出去,让各种外部服务完成这些任务,软件本身只是底层服务的调度中心和组装层。
微服务很适合用 Docker
容器实现,每个容器承载一个服务。一台计算机同时运行多个容器,从而就能很轻松地模拟出复杂的微服务架构。
之前介绍了 Docker
的概念和基本用法,本文接着往下介绍,如何在一台计算机上实现多个服务,让它们互相配合,组合出一个应用程序。
我选择的示例软件是 WordPress。它是一个常用软件,全世界用户据说超过几千万。同时它又非常简单,只要两个容器就够了(业务容器
+ 数据库容器),很适合教学。而且,这种“业务 +
数据库“的容器架构,具有通用性,许多应用程序都可以复用。
为了加深读者理解,本文采用三种方法,演示如何架设 WordPr ...
Docker 入门教程
2013年发布至今, Docker
一直广受瞩目,被认为可能会改变软件行业。
但是,许多人并不清楚 Docker
到底是什么,要解决什么问题,好处又在哪里?本文就来详细解释,帮助大家理解它,还带有简单易懂的实例,教你如何将它用于日常开发。
一、环境配置的难题
软件开发最大的麻烦事之一,就是环境配置。用户计算机的环境都不相同,你怎么知道自家的软件,能在那些机器跑起来?
用户必须保证两件事:操作系统的设置,各种库和组件的安装。只有它们都正确,软件才能运行。举例来说,安装一个
Python 应用,计算机必须有 Python
引擎,还必须有各种依赖,可能还要配置环境变量。
如果某些老旧的模块与当前环境不兼容,那就麻烦了。开发者常常会说:“它在我的机器可以跑了”(It
works on my machine),言下之意就是,其他机器很可能跑不了。
环境配置如此麻烦,换一台机器,就要重来一次,旷日费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。
二、虚拟机
虚拟机(virtual
machine)就是带环境 ...
概述
<video>元素用来加载视频,是HTMLVideoElement对象的实例。<audio>元素用来加载音频,是HTMLAudioElement对象的实例。而HTMLVideoElement和HTMLAudioElement都继承了HTMLMediaElement,所以这两个
HTML 元素有许多共同的属性和方法,可以放在一起介绍。
理论上,这两个 HTML
元素直接用src属性指定媒体文件,就可以使用了。
12<audio src="background_music.mp3"/><video src="news.mov" width=320 height=240/>
注意,<video>元素有width属性和height属性,可以指定宽和高。<audio>元素没有这两个属性,因为它的播放器外形是浏览器给定的,不能指定。
实际上,不同的浏览器支持不同的媒体格式,我们不得不用<source>元素指定同一个媒体文件的不同格式。
1234<audio id ...
元素
<option>元素表示下拉框(<select>,<optgroup>或<datalist>)里面的一个选项。它是
HTMLOptionElement 接口的实例。
属性
除了继承 HTMLElement 接口的属性和方法,HTMLOptionElement
接口具有下面的属性。
disabled:布尔值,表示该项是否可选择。
defaultSelected:布尔值,表示该项是否默认选中。一旦设为true,该项的值就是<select>的默认值。
form:返回<option>所在的表单元素。如果不属于任何表单,则返回null。该属性只读。
index:整数,表示该选项在整个下拉列表里面的位置。该属性只读。
label:字符串,表示对该选项的说明。如果该属性未设置,则返回该选项的文本内容。
selected:布尔值,表示该选项是否选中。
text:字符串,该选项的文本内容。
value:字符串,该选项的值。表单提交时,上传的就是选中项的这个属性。
Option() 构造函数
浏览器原生提供Option()构 ...
<button> 元素
<button>元素继承了HTMLButtonElement接口。它有以下的实例属性。
(1)HTMLButtonElement.accessKey
HTMLButtonElement.accessKey属性返回一个字符串,表示键盘上对应的键,通过Alt + 这个键可以让按钮获得焦点。该属性可读写。
(2)HTMLButtonElement.autofocus
HTMLButtonElement.autofocus属性是一个布尔值,表示页面加载过程中,按钮是否会自动获得焦点。该属性可读写。
(3)HTMLButtonElement.disabled
HTMLButtonElement.disabled属性是一个布尔值,表示该按钮是否禁止点击。该属性可读写。
(4)HTMLButtonElement.form
HTMLButtonElement.form属性是一个表单元素,返回该按钮所在的表单。该属性只读。如果按钮不属于任何表单,该属性返回null。
(5)HTMLButtonElement.formAction
HTMLButtonEle ...
<input> 元素
<input>元素主要用于表单组件,它继承了
HTMLInputElement 接口。
HTMLInputElement 的实例属性
特征属性
name:字符串,表示<input>节点的名称。该属性可读写。
type:字符串,表示<input>节点的类型。该属性可读写。
disabled:布尔值,表示<input>节点是否禁止使用。一旦被禁止使用,表单提交时不会包含该<input>节点。该属性可读写。
autofocus:布尔值,表示页面加载时,该元素是否会自动获得焦点。该属性可读写。
required:布尔值,表示表单提交时,该<input>元素是否必填。该属性可读写。
value:字符串,表示该<input>节点的值。该属性可读写。
validity:返回一个ValidityState对象,表示<input>节点的校验状态。该属性只读。
validationMessage:字符串,表示该<input>节点的校验失败时,用户看到的报错信息。如 ...
<form> 元素
<form>元素代表了表单,继承了 HTMLFormElement
接口。
HTMLFormElement 的实例属性
elements:返回一个类似数组的对象,成员是属于该表单的所有控件元素。该属性只读。
length:返回一个整数,表示属于该表单的控件数量。该属性只读。
name:字符串,表示该表单的名称。
method:字符串,表示提交给服务器时所使用的 HTTP
方法。
target:字符串,表示表单提交后,服务器返回的数据的展示位置。
action:字符串,表示表单提交数据的 URL。
enctype(或encoding):字符串,表示表单提交数据的编码方法,可能的值有application/x-www-form-urlencoded、multipart/form-data和text/plain。
acceptCharset:字符串,表示服务器所能接受的字符编码,多个编码格式之间使用逗号或空格分隔。
autocomplete:字符串on或off,表示浏览器是否要对<input>控件提供自动补全。
noValidate: ...
元素
概述
<img>元素用于插入图片,主要继承了 HTMLImageElement
接口。
浏览器提供一个原生构造函数Image,用于生成HTMLImageElement实例。
123var img = new Image();img instanceof Image // trueimg instanceof HTMLImageElement // true
Image构造函数可以接受两个整数作为参数,分别表示<img>元素的宽度和高度。
12345// 语法Image(width, height)// 用法var myImage = new Image(100, 200);
<img>实例的src属性可以定义图像的网址。
12var img = new Image();img.src = 'picture.jpg';
新生成的<img>实例并不属于文档的一部分。如果想让它显示在文档中,必须手动插入文档。
123var img = new Image();img.src = 'image1.png& ...
