DRAFT 后端上线链路
2682 字约 9 分钟
2026-08-14
如果把内部平台名称全部拿掉,你真正需要理解的是这条链:
代码 → 构建产物 → Docker 镜像 → 容器 → 机器/集群 → 服务 → 负载均衡 → 域名/DNS → HTTP 路由 → 用户流量
把这条主线理解透以后,再看 Tree / AgileFlow / Caster / Cloud,你会发现它们只是把底层操作封装成了公司内部 UI。
一、你的 9 步分别对应什么知识
| 你们的步骤 | 背后的通用概念 | 你需要学什么 |
|---|---|---|
| 1. Tree 创建 AppID | 应用身份 / 服务元数据 | App / Service / AppID / 环境 |
| 2. AgileFlow 绑定 AppID、创建服务 App | CI/CD / 应用管理 | pipeline、build、deploy |
| 3. 镜像 + 构建/运行脚本 | Docker | Dockerfile、image、container、CMD |
| 4. 构建 | CI / Build | build artifact、镜像仓库、版本 |
| 5. Caster 应用、可用区、启动命令 | 容器编排 | Pod/container、节点、资源、调度 |
| 6. 发布容器和服务 | Service Discovery | IP、Port、Service、健康检查 |
| 7. SLB + 域名 | 网络 | DNS、LB、VIP、L4/L7 |
| 8. Cloud 路由、切流 | 网关 / Ingress | HTTP routing、path、upstream |
| 9. 完成 | 发布系统 | rollout、rollback、监控 |
这里最关键的是 3、5、6、7、8。
二、第一层:先理解一个后端程序到底是怎么运行的
比如你写了一个 Flask:
from flask import Flask
app = Flask(__name__)
@app.route("/api/hello")
def hello():
return {"message": "hello"}
app.run(host="0.0.0.0", port=8080)你首先要真正理解:
Python 进程
│
│ listen
↓
0.0.0.0:8080
│
↓
GET /api/hello也就是说服务最本质的形态其实非常简单:
一个进程,在某个 IP 的某个 Port 上监听请求。
例如:
10.19.12.37:8080请求:
GET /api/hello返回:
{"message": "hello"}后面所有复杂的平台,本质上都是为了回答:
怎么可靠地把用户请求送到这个 Python 进程?
这是理解整套流程最重要的出发点。
三、第二层:Docker —— 对应你的第 3、4 步
这是你现在最值得优先学习的部分。
你的 Flask 程序可能依赖:
Python 3.12
Flask
requests
numpy
公司内部 SDK
环境变量
系统动态库如果直接丢到服务器:
我的电脑能跑
↓
服务器为什么不能跑?所以需要 Docker。
Docker 把:
代码
+
Python
+
依赖
+
运行环境打包成:
Image例如:
FROM python:3.12
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]然后:
docker build -t my-service:v1 .得到:
my-service:v1这就是 镜像 image。
然后:
docker run -p 8080:8080 my-service:v1镜像被启动以后得到:
container所以必须牢牢记住:
Dockerfile
↓ docker build
Image
↓ docker run
Container
↓
Process
↓
Port 8080你步骤里的:
构建镜像、运行镜像、构建脚本、运行脚本、构建
基本都围绕这里。
Docker 至少掌握
Dockerfile
image
container
docker build
docker run
docker exec
docker logs
port mapping
volume
environment variable
CMD
ENTRYPOINT
registry四、第三层:为什么还需要 Caster?
有了 Docker 后,你当然可以:
ssh server01
docker run my-service但公司不可能这么部署几万个服务。
于是就需要:
容器编排系统
你们的 Caster 很可能就是公司内部容器编排/部署体系的一部分。
工业界通用的对应物是:
Kubernetes例如公司有:
上海机房
machine01
machine02
machine03
...
machine10000你的服务需要:
CPU: 4 Core
Memory: 8 GB
Instance: 3调度系统决定:
container1 → machine37
container2 → machine82
container3 → machine291所以:
Caster 创建应用、可用区、机器资源、启动命令
你应该从 Kubernetes 的思想 去理解。
至少掌握:
Node
Pod
Container
Deployment
Replica
CPU / Memory Request
CPU / Memory Limit
Availability Zone
Scheduler不一定要先学会操作 Kubernetes,但概念必须懂。
五、“启动命令”到底是什么
你写的:
启动命令(驱动入口)
非常重要。
容器最终总得执行一个进程。
例如:
python app.py生产环境可能是:
gunicorn \
--workers 4 \
--bind 0.0.0.0:8080 \
app:app整个链条实际上是:
Caster
↓
启动 Container
↓
执行启动命令
↓
启动 Python / Java / Go 进程
↓
listen :8080所以遇到:
容器启动失败你第一反应应该是检查:
镜像是否正确?
启动命令是否正确?
环境变量是否正确?
依赖是否存在?
进程是否启动?
端口是否监听?
健康检查是否通过?六、第四层:理解“容器”和“服务”的区别
这是很多刚接触部署的人最容易混淆的地方。
假设你的应用启动三个实例:
container A
10.0.1.17:8080
container B
10.0.3.26:8080
container C
10.0.7.39:8080问题是:
调用方应该访问谁?
不能写死:
10.0.1.17因为这个容器可能明天就没了。
所以需要一个:
Service例如:
my-user-service
│
├── 10.0.1.17:8080
├── 10.0.3.26:8080
└── 10.0.7.39:8080客户端访问:
my-user-service而不是某个具体容器。
这就是:
服务发现 Service Discovery
因此你的:
Caster 发布容器和服务
其实包含两个非常不同的概念:
Container
=
真正运行代码的实例
Service
=
一组 Container 的稳定逻辑入口这点一定要弄清楚。
七、第 6 步结束后,为什么只是“机房内网可用”?
这是非常好的一个架构分界点。
到这里:
代码
↓
镜像
↓
容器
↓
Service已经完成。
例如:
my-service.internal:8080公司内部机器可能可以访问:
curl http://my-service.internal:8080/api/hello但公网用户还不能:
Internet
X
my-service.internal因为:
服务部署完成 ≠ 对外提供访问。
接下来第 7、8 步解决的就是:
外部流量怎么进来?
八、第五层:一定要系统学习计算机网络
你的第 7、8 步本质几乎全是网络。
至少需要理解:
IP
Port
TCP
HTTP
DNS
Load Balancer
Reverse Proxy
Gateway
Routing这是理解整个流程的核心知识。
九、域名到底在做什么?
比如:
api.example.com机器本身不知道这是什么。
DNS 把:
api.example.com解析到:
10.23.40.12或者一个负载均衡器的 VIP。
因此:
Domain
↓ DNS
IP这是你第 7 步:
SLB 申请配置域名、域名解析集群
背后的第一部分。
十、SLB 是什么
SLB 通常就是:
Server Load Balancer
例如你有:
server A
server B
server C用户访问:
api.example.comDNS:
api.example.com
↓
1.2.3.4而:
1.2.3.4可能就是 Load Balancer。
然后:
┌→ Server A
Internet → SLB ─────┼→ Server B
└→ Server C所以需要理解:
VIP
Backend
Upstream
Health Check
Load Balancing以后你还会遇到:
Round Robin
Least Connections
L4 LB
L7 LB十一、第 8 步的“路由规则”是什么
这是另一个非常重要的概念。
假设域名:
api.example.com下面有三个服务:
/user/* → user-service
/video/* → video-service
/search/* → search-service那么 Cloud 实际维护的是:
api.example.com/user/*
↓
user-service所以你提到:
注意与自己的服务的 path 要对齐
例如你的 Flask 写的是:
@app.route("/api/hello")但是 Cloud 配成:
/hello就可能匹配不上。
因此你需要搞懂:
HTTP Host
HTTP Path
Route
Prefix
Rewrite
Gateway
Reverse Proxy建议顺便学习 Nginx。
因为很多公司网关系统,本质都可以用 Nginx 的模型理解。
十二、“切流”到底是什么
这是部署中非常核心的思想。
你可能有:
old cluster
new cluster一开始:
100% → old
0% → new先测试:
90% → old
10% → new然后:
50%
50%最后:
0% → old
100% → new这就是:
流量切换 / 灰度发布
进一步会涉及:
Blue-Green Deployment
Canary Deployment
Rolling Deployment
Rollback所以 Cloud 的:
关联应用集群和域名集群 → 切流
其实是在决定:
请求最终流向哪一批后端实例。
十三、最后把你整个流程串起来
假设你写了一个:
GET /api/user完整链路可能是:
开发阶段
Python / Flask
│
↓
source code
│
│ Docker build
↓
Docker Image
│
│ push
↓
Image Registry
部署阶段
Caster
│
│ pull image
↓
Container
│
↓
Python Process
│
↓
:8080
│
↓
Service
│
↓
内网可访问
流量阶段
User
│
↓
api.example.com
│
│ DNS
↓
SLB
│
↓
Cloud Gateway
│
│ Host + Path Route
↓
Service
│
↓
Container
│
↓
Flask
│
↓
/api/user你一旦能在脑子里完整地画出这张图,你们那 9 个步骤基本就理解了一半以上。
十四、建议你的学习顺序
不要按 Tree → AgileFlow → Caster → Cloud 去学,因为那会变成记 UI。
建议按照底层原理学习:
第一阶段:后端程序
process
IP
port
HTTP
Flask目标:
python app.py
curl localhost:8080/api/hello能完全解释发生了什么。
第二阶段:Linux
重点:
process
ps
top
kill
environment variable
stdout/stderr
filesystem
shell
curl
netstat / ss尤其:
ps
curl
ss -lntp以后排查线上问题极其常用。
第三阶段:Docker
亲手完成:
Flask
↓
Dockerfile
↓
docker build
↓
docker run
↓
curl这是最重要的一步。
第四阶段:计算机网络
重点理解:
IP
Port
TCP
HTTP
DNS
Proxy
Reverse Proxy
Load Balancer推荐重点理解请求:
https://api.example.com/user/123到底经历了什么。
第五阶段:Nginx
自己搭一个:
┌→ Flask :8001
Client → Nginx ─┤
└→ Flask :8002再配置:
location /api/ {
proxy_pass http://backend;
}这一步会让你突然理解很多公司 Cloud 平台的配置。
第六阶段:Kubernetes
不用一开始学很深。
先搞懂:
Pod
Deployment
Service
Node
Replica
Ingress
ConfigMap
Secret然后把它映射到公司内部:
Caster ≈ 容器编排/部署系统
Cloud ≈ Gateway/Ingress/流量管理
AgileFlow ≈ CI/CD
SLB ≈ Load Balancer
Tree ≈ App/Service 元数据管理这里的“≈”很重要——你们内部实现未必就是 Kubernetes,但抽象通常非常相似。
十五、还有三个后续必须补上的领域
当上面的主链理解以后,再学:
1. CI/CD
git
pipeline
build
artifact
deploy
rollback
2. 配置管理
dev / pre / prod
environment variable
config
secret
3. 可观测性
log
metric
trace
health check
alert尤其你提到:
pre 环境切记要再配置一遍 pre 的域名解析
这已经属于非常典型的:
Environment Isolation
dev
pre
prod需要理解为什么每个环境的:
Domain
DNS
Cluster
Configuration
Database
Service可能都是独立的。
最后,我建议你抓住一个核心问题
以后操作公司平台时,不要只记:
“这里点创建应用,然后那里绑定 AppID。”
而是每一步都问:
这一层创建了什么资源?它的输入是什么?输出是什么?上一层怎样找到下一层?请求此时能走到哪里?
例如:
Tree 创建 AppID
→ 我创建的是代码、实例、服务,还是身份?
Caster 创建应用
→ 它最终创建了什么运行资源?
Caster 发布 Service
→ Service 如何找到 Container?
SLB
→ 输入流量从哪里来,输出到哪里?
Cloud Route
→ 根据 Host、Path 还是其他字段决定路由?
切流
→ 修改的究竟是哪一层 Backend?按照这种方式研究一遍你们实际的一个 Flask 服务,你就不只是“会发布”,而是会逐渐理解 后端基础设施、云原生和微服务部署体系。这也是从普通业务开发进一步理解公司后端架构非常关键的一步。
