读发布!设计与部署稳定的分布式系统(第2版)笔记20_实例层之代码

1. 术语的定义

1.1. 服务

1.1.1. 指共同协作、以单元的形式对外提供功能的跨机器进程集合

1.1.2. 一个服务可以由多种可执行文件组成

1.1.3. 一个服务可能包含来自多个可执行文件的多个进程

1.1.4. 可能对外呈现单个IP地址,并在后台进行负载均衡

1.1.5. 可能有多个IP地址,且每个都使用相同的DNS名称

1.2. 实例

1.2.1. 指单台机器(容器、虚拟机或物理机)上的一个安装文件集,位于运行相同可执行文件的负载均衡阵列中

1.2.2. 一组实例指的是运行相同可执行文件的多个进程,这些实例在不同的机器上运行

1.3. 可执行文件

1.3.1. 指由构建过程所创建的制品,机器可以将其作为进程来启动

1.3.2. 在编译型语言中,是一个可执行的二进制文件

1.3.3. 对于解释型语言则是源文件

1.3.4. 还包括在执行之前需要安装的共享库

1.4. 进程

1.4.1. 指在系统中正在运行的一个应用程序,也是可执行文件的运行时镜像

1.5. 安装文件集

1.5.1. 指可执行文件、所有衍生目录、配置文件以及机器上的其他资源

1.6. 部署

1.6.1. 在一台机器上创建安装文件集的行为

1.6.2. 部署是自动化的过程,其定义在源代码控制系统中保存

2. 构建代码

2.1. 保证用户准确地知道实例中添加的代码

2.2. 建立从开发人员到生产环境实例的强大的“监管链”至关重要

2.3. 必须确保任何未经授权的一方,都无法在用户系统中添加代码

2.4. “监管链”从开发人员的工位开始,开发人员应该在版本控制系统中管理代码

2.4.1. 只有代码才能进入版本控制系统

2.4.2. 版本控制并不擅长处理第三方库或依赖库

2.5. 构建工具必须能将依赖库从某处下载到开发人员的计算机中

2.6. 从互联网下载依赖库虽然方便但不安全

2.6.1. 中间人攻击或上游库的操纵,从互联网下载的某个依赖库能轻易地被悄悄替换掉

2.6.2. 从网上下载依赖库,也应该尽快将其转移到私有库中

2.6.3. 只有当依赖库的数字签名与来自上游提供商已公布的信息匹配时,才能将该依赖库存入私有库中

2.7. 开发人员不应该最先在自己的机器上创建生产版本

2.7.1. 开发人员的计算机已经被彻底污染了

2.7.2. 浏览器也安装了“惹人嫌”的工具栏和冒牌的“搜索增强器”

2.8. 只能在CI服务器上创建生产版本,并将其二进制文件存在其他人无法写入的安全的部署包库中

3. 不可变、易处理的基础设施

3.1. 通过脚本描述的机器运行状态

3.1.1. “一层层抹泥”的方法更新机器的状态有两大挑战

3.1.1.1. 这样做容易产生副作用,脚本无法描述机器状态

3.1.1.2. 只能部分工作的受损的机器或脚本,它们会使机器处于未定义的状态

3.2. 创建新镜像

3.2.1. 不可变基础设施

3.2.1.1. 机器一旦部署就不再变更

3.2.2. 始终从已知的基础镜像开始,在其上施加一组固定的更改,之后不再对该机器进行修补或更新,这样做会更可靠

3.2.3. 当需要变更计算机时,再次从基础镜像开始,创建一个新的镜像

3.2.4. 容器的“文件系统”是部署包库中的二进制镜像,包含能在实例上运行的代码,当需要部署新代码时,我们不会再修补容器,而是构建并启动一个新容器,放弃旧容器

posted @ 2023-07-06 07:32  躺柒  阅读(70)  评论(0编辑  收藏  举报