使用 Kubernetes 部署 PHP 留言板应用(含 Redis 架构)
文章目录
- [使用 Kubernetes 部署 PHP 留言板应用(含 Redis 架构)](#使用 Kubernetes 部署 PHP 留言板应用(含 Redis 架构))
教程概述
本教程将深入指导你如何借助 Kubernetes 构建一个多层 Web 应用系统。此系统具备高可用性、可扩展性和读写分离的特性,主要由以下核心组件构成:
- 单实例 Redis 领导者(Leader):作为 Redis 集群的核心节点,专门负责处理数据的写入操作。它就像是整个数据写入流程的"指挥官",确保所有的写入请求都能被准确无误地处理。
- 多个 Redis 跟随者(Follower):这些跟随者节点的主要任务是分担数据的读取负载。通过将读取请求分散到多个跟随者节点上,可以显著提升系统的读取性能和吞吐量。
- PHP 前端服务集群:为用户提供直观的交互界面,使用户能够方便地与留言板应用进行交互。这个集群由多个运行 PHP 代码的 Pod 组成,通过 Kubernetes 的服务发现和负载均衡机制,确保用户的请求能够被均匀地分配到各个 Pod 上。
技术架构特点
此架构采用了典型的 读写分离模式,这是一种在分布式系统中广泛应用的设计模式,具有以下优点:
- 写入操作集中于 Redis 领导者节点:将所有的写入请求集中处理,有助于保证数据的一致性和完整性。因为只有一个领导者节点负责写入,避免了多个节点同时写入可能导致的数据冲突问题。
- 读取操作由多个 Redis 跟随者节点处理:多个跟随者节点可以并行地处理读取请求,大大提高了系统的读取性能。同时,当领导者节点出现故障时,跟随者节点还可以作为备用节点,提升系统的容错能力。
- 前端服务通过 Kubernetes Service 实现服务发现与负载均衡:Kubernetes Service 为前端服务提供了一个稳定的网络入口,使得前端应用能够方便地发现并连接到后端的 Redis 服务。同时,Service 还内置了负载均衡机制,能够将用户的请求均匀地分配到多个前端 Pod 上,避免了单个 Pod 负载过高的问题。
准备工作
环境要求
- Kubernetes 集群:至少包含 2 个工作节点(非控制平面节点)。工作节点是运行应用程序容器的地方,多个工作节点可以提供更高的可用性和可扩展性。控制平面节点主要负责集群的管理和调度,与应用程序的运行没有直接关系。
- kubectl 工具:需配置为可连接至目标集群。kubectl 是 Kubernetes 的命令行工具,通过它可以方便地与 Kubernetes 集群进行交互,如创建、删除和管理各种资源。
- 版本要求:Kubernetes 服务器版本不低于 v1.14。较新的版本通常包含更多的功能和性能优化,同时也能提供更好的安全性和稳定性。
Redis 数据库部署
Redis 主从架构原理
Redis 主从复制是一种数据同步机制,其核心特性包括:
- 主节点(Leader):负责处理写操作,并将数据变更同步至从节点。主节点就像是数据的"源头",所有的写入请求都首先由主节点处理,然后主节点会将这些数据变更同步到所有的从节点上,确保从节点的数据与主节点保持一致。
- 从节点(Follower):仅处理读操作,实现读写分离。从节点主要用于分担主节点的读取压力,通过将读取请求分散到多个从节点上,可以提高系统的读取性能和吞吐量。同时,从节点还可以作为备用节点,当主节点出现故障时,可以手动或自动将某个从节点提升为新的主节点,保证系统的高可用性。
- 高可用性:从节点可作为备用节点,提升系统容错能力。当主节点出现故障时,系统可以快速切换到从节点继续提供服务,从而避免了服务的中断。此外,通过增加从节点的数量,还可以进一步提高系统的容错能力和可靠性。
创建 Redis 领导者 Deployment
Deployment 是 Kubernetes 中用于管理无状态应用的核心控制器,其主要功能包括:
- 定义 Pod 模板及副本数量:Deployment 通过定义 Pod 模板来描述应用程序的运行环境和配置信息,同时可以指定 Pod 的副本数量,实现应用程序的水平扩展。例如,在 Redis 领导者的 Deployment 中,我们可以指定只创建一个副本,因为 Redis 领导者通常只需要一个实例来处理写入操作。
- 实现滚动更新与回滚机制:当需要对应用程序进行升级或修改配置时,Deployment 可以实现滚动更新,即逐步替换旧的 Pod 实例为新的 Pod 实例,确保服务的不间断运行。如果更新过程中出现问题,还可以通过回滚机制将应用程序恢复到之前的版本。
- 自动监控并修复 Pod 故障:Deployment 会自动监控 Pod 的状态,如果发现某个 Pod 出现故障或异常,会自动创建一个新的 Pod 实例来替换它,确保应用程序的正常运行。
yaml
# redis-leader-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-leader
labels:
app: redis
role: leader
tier: backend
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
role: leader
tier: backend
spec:
containers:
- name: leader
image: "docker.io/redis:6.0.5"
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 6379
部署执行命令
bash
kubectl apply -f https://k8s.io/examples/application/guestbook/redis-leader-deployment.yaml
通过执行该命令,Kubernetes 会根据指定的 Deployment 配置文件创建 Redis 领导者的 Pod 实例。
状态验证命令
bash
kubectl get pods
执行该命令可以查看当前集群中所有 Pod 的状态信息。如果 Redis 领导者的 Pod 正常运行,输出结果中会显示该 Pod 的名称、状态、重启次数和运行时间等信息。
典型输出:
NAME READY STATUS RESTARTS AGE
redis-leader-fb76b4755-xjr2n 1/1 Running 0 13s
日志查看命令
bash
kubectl logs -f deployment/redis-leader
通过执行该命令,可以实时查看 Redis 领导者 Deployment 中所有 Pod 的日志信息。这对于排查问题和监控应用程序的运行状态非常有帮助。
创建 Redis 领导者服务
Kubernetes Service 概念
Service 是 Kubernetes 中实现服务发现的核心组件,其关键特性包括:
- 为一组 Pod 提供稳定的网络入口:在 Kubernetes 中,Pod 的生命周期是短暂的,可能会因为各种原因(如故障、升级等)被销毁和重新创建。Service 为一组 Pod 提供了一个稳定的网络地址,使得其他应用程序可以通过这个地址访问这些 Pod,而不需要关心 Pod 的具体位置和状态。
- 支持基于标签的动态选择器 :Service 可以通过标签选择器来动态地选择要关联的 Pod。例如,在 Redis 领导者服务中,我们可以通过标签
app=redis
、role=leader
和tier=backend
来选择所有符合这些标签的 Pod。这样,当有新的 Pod 创建或旧的 Pod 销毁时,Service 会自动更新其关联的 Pod 列表,确保服务的正常运行。 - 内置负载均衡机制(轮询或会话亲和性):Service 内置了负载均衡机制,可以将客户端的请求均匀地分配到关联的 Pod 上。常见的负载均衡算法包括轮询和会话亲和性。轮询算法会依次将请求分配到每个 Pod 上,而会话亲和性算法会将同一个客户端的请求始终分配到同一个 Pod 上,适用于需要保持会话状态的应用程序。
yaml
# redis-leader-service.yaml
apiVersion: v1
kind: Service
metadata:
name: redis-leader
labels:
app: redis
role: leader
tier: backend
spec:
ports:
- port: 6379
targetPort: 6379
selector:
app: redis
role: leader
tier: backend
服务创建命令
bash
kubectl apply -f https://k8s.io/examples/application/guestbook/redis-leader-service.yaml
通过执行该命令,Kubernetes 会根据指定的 Service 配置文件创建 Redis 领导者服务。
服务列表查询
bash
kubectl get service
执行该命令可以查看当前集群中所有 Service 的信息,包括服务的名称、类型、集群 IP、外部 IP 和端口等。
典型输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 1m
redis-leader ClusterIP 10.103.78.24 <none> 6379/TCP 16s
配置 Redis 跟随者集群
读写分离架构优势
部署多个 Redis 跟随者节点的核心价值在于:
- 负载分担:通过将读请求分散到多个跟随者节点上,可以显著减轻主节点的读取压力,提升系统的吞吐量。特别是在高并发的场景下,多个跟随者节点可以并行地处理读取请求,大大提高了系统的响应速度。
- 高可用性:当领导者节点出现故障时,可以手动或自动将某个跟随者节点提升为新的领导者节点,继续提供服务,从而避免了服务的中断。此外,多个跟随者节点还可以作为备用节点,提高了系统的容错能力。
- 水平扩展:通过增加跟随者节点的数量,可以线性提升系统的读处理能力。当系统的读取负载增加时,只需要简单地增加跟随者节点的数量,就可以满足业务的需求,而不需要对系统进行大规模的改造。
yaml
# redis-follower-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-follower
labels:
app: redis
role: follower
tier: backend
spec:
replicas: 2
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
role: follower
tier: backend
spec:
containers:
- name: follower
image: us-docker.pkg.dev/google-samples/containers/gke/gb-redis-follower:v2
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 6379
跟随者部署命令
bash
kubectl apply -f https://k8s.io/examples/application/guestbook/redis-follower-deployment.yaml
通过执行该命令,Kubernetes 会根据指定的 Deployment 配置文件创建 Redis 跟随者的 Pod 实例。
节点状态验证
bash
kubectl get pods
执行该命令可以查看当前集群中所有 Pod 的状态信息。如果 Redis 跟随者的 Pod 正常运行,输出结果中会显示这些 Pod 的名称、状态、重启次数和运行时间等信息。
典型输出:
NAME READY STATUS RESTARTS AGE
redis-follower-dddfbdcc9-82sfr 1/1 Running 0 37s
redis-follower-dddfbdcc9-qrt5k 1/1 Running 0 38s
redis-leader-fb76b4755-xjr2n 1/1 Running 0 11m
创建 Redis 跟随者服务
多服务协同设计
为跟随者单独创建服务的核心目的是:
- 读写流量分离:通过不同的服务地址区分读写请求,使得写入请求可以直接发送到 Redis 领导者服务,而读取请求可以发送到 Redis 跟随者服务。这样可以避免读写请求相互干扰,提高系统的性能和稳定性。
- 灵活路由策略:可以针对读服务配置更高的负载均衡权重,使得更多的读取请求可以被分配到跟随者节点上,进一步减轻主节点的压力。同时,还可以根据业务需求对读服务和写服务分别进行优化和调整。
- 服务发现优化:前端应用可以根据操作类型选择对应服务,提高服务发现的效率和准确性。例如,当需要进行写入操作时,前端应用可以直接连接到 Redis 领导者服务;当需要进行读取操作时,可以连接到 Redis 跟随者服务。
yaml
# redis-follower-service.yaml
apiVersion: v1
kind: Service
metadata:
name: redis-follower
labels:
app: redis
role: follower
tier: backend
spec:
ports:
- port: 6379
selector:
app: redis
role: follower
tier: backend
跟随者服务创建
bash
kubectl apply -f https://k8s.io/examples/application/guestbook/redis-follower-service.yaml
通过执行该命令,Kubernetes 会根据指定的 Service 配置文件创建 Redis 跟随者服务。
服务状态查询
bash
kubectl get service
执行该命令可以查看当前集群中所有 Service 的信息,包括服务的名称、类型、集群 IP、外部 IP 和端口等。
典型输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d19h
redis-follower ClusterIP 10.110.162.42 <none> 6379/TCP 9s
redis-leader ClusterIP 10.103.78.24 <none> 6379/TCP 6m10s
部署留言板前端服务
无状态应用设计原则
前端服务采用 Deployment 部署的优势:
- 弹性伸缩:可以根据流量的变化动态调整副本数量,实现资源的合理利用。例如,在业务高峰期,可以增加前端服务的副本数量,以应对更多的用户请求;在业务低谷期,可以减少副本数量,降低资源消耗。
- 故障自愈:当某个前端 Pod 出现故障时,Deployment 会自动创建一个新的 Pod 实例来替换它,确保服务的正常运行。这大大提高了系统的可靠性和可用性。
- 滚动更新:支持版本迭代时的零停机部署。当需要对前端服务进行升级或修改配置时,Deployment 可以逐步替换旧的 Pod 实例为新的 Pod 实例,确保服务的不间断运行。
yaml
# frontend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
spec:
replicas: 3
selector:
matchLabels:
app: guestbook
tier: frontend
template:
metadata:
labels:
app: guestbook
tier: frontend
spec:
containers:
- name: php-redis
image: us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5
env:
- name: GET_HOSTS_FROM
value: "dns"
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 80
前端部署执行
bash
kubectl apply -f https://k8s.io/examples/application/guestbook/frontend-deployment.yaml
通过执行该命令,Kubernetes 会根据指定的 Deployment 配置文件创建留言板前端服务的 Pod 实例。
前端节点验证
bash
kubectl get pods -l app=guestbook -l tier=frontend
执行该命令可以查看当前集群中所有符合指定标签的前端 Pod 的状态信息。如果前端 Pod 正常运行,输出结果中会显示这些 Pod 的名称、状态、重启次数和运行时间等信息。
典型输出:
NAME READY STATUS RESTARTS AGE
frontend-85595f5bf9-5tqhb 1/1 Running 0 47s
frontend-85595f5bf9-qbzwm 1/1 Running 0 47s
frontend-85595f5bf9-zchwc 1/1 Running 0 47s
暴露前端服务
服务暴露方式解析
Kubernetes 提供多种服务暴露方式,本教程涉及两种主要方式:
1. 端口转发(port-forward)
适用于本地开发调试,核心特点:
- 临时映射:会话结束后映射自动失效,不会对生产环境造成任何影响。这使得开发人员可以在本地方便地进行调试,而不需要担心对线上服务产生干扰。
- 安全隔离:仅本地可访问,无需暴露至公网,提高了系统的安全性。在开发调试过程中,很多敏感信息可能会在网络中传输,通过端口转发可以确保这些信息只在本地网络中可见,避免了信息泄露的风险。
- 便捷调试:直接将集群服务映射到本地端口,使得开发人员可以像访问本地服务一样访问集群中的服务。这大大简化了开发调试的流程,提高了开发效率。
2. 负载均衡器(LoadBalancer)
适用于生产环境,核心特点:
- 永久地址:分配固定公网 IP,使得外部用户可以通过这个 IP 地址访问服务。这对于面向公众的 Web 应用来说非常重要,因为用户需要一个稳定的地址来访问应用。
- 流量分发:支持 TCP/UDP 四层负载均衡,可以将用户的请求均匀地分配到多个前端 Pod 上,提高系统的吞吐量和响应速度。在高并发的场景下,负载均衡器可以有效地避免单个 Pod 负载过高的问题,确保服务的稳定运行。
- 云平台集成:与云服务商的负载均衡器对接,可以充分利用云平台的优势,如自动伸缩、高可用性等。云平台的负载均衡器通常具有更强大的功能和更高的性能,可以为应用提供更好的服务。
yaml
# frontend-service.yaml
apiVersion: v1
kind: Service
metadata:
name: frontend
labels:
app: guestbook
tier: frontend
spec:
# 如需使用负载均衡器,取消以下行注释
# type: LoadBalancer
ports:
- port: 80
selector:
app: guestbook
tier: frontend
服务创建命令
bash
kubectl apply -f https://k8s.io/examples/application/guestbook/frontend-service.yaml
通过执行该命令,Kubernetes 会根据指定的 Service 配置文件创建留言板前端服务。
服务列表查询
bash
kubectl get services
执行该命令可以查看当前集群中所有 Service 的信息,包括服务的名称、类型、集群 IP、外部 IP 和端口等。
典型输出(ClusterIP 类型):
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
frontend ClusterIP 10.97.28.230 <none> 80/TCP 19s
通过端口转发访问服务
bash
kubectl port-forward svc/frontend 8080:80
执行该命令后,Kubernetes 会将前端服务的 80 端口映射到本地的 8080 端口。此时,你可以通过访问 http://localhost:8080
来访问留言板应用。
通过负载均衡器访问服务
bash
kubectl get service frontend
执行该命令可以查看前端服务的详细信息,包括服务的类型、集群 IP、外部 IP 和端口等。
典型输出(LoadBalancer 类型):
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
frontend LoadBalancer 10.51.242.136 109.197.92.229 80:32372/TCP 1m
如果前端服务的类型为 LoadBalancer,会分配一个外部 IP 地址。你可以通过访问 http://<EXTERNAL-IP>
来访问留言板应用。
服务弹性伸缩
水平伸缩原理
Kubernetes 支持基于以下条件的自动/手动伸缩:
- CPU/内存利用率:基于指标服务器的资源监控,Kubernetes 可以实时获取 Pod 的 CPU 和内存使用情况。当某个 Pod 的资源利用率超过预设的阈值时,可以自动增加副本数量;当资源利用率低于阈值时,可以自动减少副本数量。这种方式可以根据实际的资源需求动态调整服务的规模,实现资源的合理利用。
- 自定义指标:通过 External Metrics API 接入业务指标,如请求数、响应时间等。Kubernetes 可以根据这些自定义指标来调整服务的副本数量,以满足业务的需求。例如,当请求数急剧增加时,可以自动增加前端服务的副本数量,以应对更多的用户请求。
- 手动指定副本数:通过命令行或 API 直接调整服务的副本数量。这种方式适用于需要手动干预的场景,如在进行性能测试或故障排查时,可以手动增加或减少副本数量,以观察系统的性能变化。
扩展前端服务至 5 个副本
bash
kubectl scale deployment frontend --replicas=5
通过执行该命令,可以将前端服务的副本数量扩展到 5 个。Kubernetes 会自动创建新的 Pod 实例,以满足指定的副本数量。
缩容前端服务至 2 个副本
bash
kubectl scale deployment frontend --replicas=2
通过执行该命令,可以将前端服务的副本数量缩容到 2 个。Kubernetes 会自动删除多余的 Pod 实例,以达到指定的副本数量。
资源清理
资源删除策略
Kubernetes 支持通过标签选择器批量删除资源,优势包括:
- 高效操作 :一条命令可以删除同类所有资源,大大提高了资源清理的效率。例如,通过指定标签
app=redis
,可以一次性删除所有与 Redis 相关的 Deployment 和 Service。 - 避免残留:自动级联删除相关资源(如 Pod),确保资源的彻底删除。当删除 Deployment 时,Kubernetes 会自动删除与之关联的所有 Pod 实例,避免了资源的残留。
- 安全可控 :可通过预览模式确认删除范围,避免误删除重要资源。在执行删除命令之前,可以使用
--dry-run
参数进行预览,查看即将删除的资源列表,确保删除操作的安全性和可控性。
批量删除命令
bash
# 删除 Redis 相关 Deployment
kubectl delete deployment -l app=redis
# 删除 Redis 相关 Service
kubectl delete service -l app=redis
# 删除前端 Deployment
kubectl delete deployment frontend
# 删除前端 Service
kubectl delete service frontend
通过执行以上命令,可以依次删除 Redis 相关的 Deployment 和 Service,以及留言板前端服务的 Deployment 和 Service。
最终状态验证
bash
kubectl get pods
执行该命令可以查看当前集群中所有 Pod 的状态信息。如果所有资源都已成功删除,输出结果中会显示 No resources found in default namespace.
,表示默认命名空间中没有任何 Pod 资源。
扩展思考
生产环境优化方向
- 持久化存储:为 Redis 增加 PersistentVolume 确保数据持久化。在生产环境中,数据的持久化非常重要,因为 Redis 领导者节点负责处理数据的写入操作,如果没有持久化存储,当节点出现故障或重启时,数据可能会丢失。通过使用 PersistentVolume,可以将 Redis 的数据存储在持久化的存储设备上,确保数据的安全性和可靠性。
- 服务监控:集成 Prometheus + Grafana 监控集群状态。Prometheus 是一个开源的监控系统,可以收集和存储各种指标数据,而 Grafana 是一个可视化工具,可以将这些指标数据以直观的图表和报表的形式展示出来。通过集成 Prometheus 和 Grafana,可以实时监控 Kubernetes 集群和应用程序的运行状态,及时发现和解决问题。
- 日志收集:添加 Fluentd + Elasticsearch 实现日志聚合。Fluentd 是一个开源的日志收集器,可以收集和转发各种日志数据,而 Elasticsearch 是一个分布式搜索和分析引擎,可以存储和分析大量的日志数据。通过集成 Fluentd 和 Elasticsearch,可以将 Kubernetes 集群和应用程序的日志数据集中存储和管理,方便进行日志分析和问题排查。
- 安全加固:配置 NetworkPolicy 限制服务间访问权限。NetworkPolicy 是 Kubernetes 中的一种网络策略资源,可以定义 Pod 之间的网络访问规则。通过配置 NetworkPolicy,可以限制不同服务之间的网络访问权限,提高系统的安全性。例如,可以只允许前端服务访问 Redis 领导者和跟随者服务,而禁止其他服务访问。
- 自动伸缩:启用 Horizontal Pod Autoscaler 基于负载动态调整副本数。Horizontal Pod Autoscaler(HPA)是 Kubernetes 中的一种自动伸缩资源,可以根据 CPU 利用率、内存利用率或自定义指标等动态调整 Deployment 或 ReplicaSet 的副本数量。通过启用 HPA,可以实现服务的自动伸缩,根据实际的负载情况动态调整资源的使用,提高系统的性能和资源利用率。
架构扩展方案
- 多区域部署:通过 Global LoadBalancer 实现跨区域容灾。在多区域部署中,可以将应用程序部署到多个地理位置不同的数据中心或云区域,通过 Global LoadBalancer 将用户的请求路由到最近或最合适的区域。这样可以提高应用程序的可用性和性能,同时实现跨区域的容灾。当某个区域出现故障时,用户的请求可以自动路由到其他正常的区域,确保服务的不间断运行。
- 灰度发布:使用 Canary 部署策略实现版本平滑过渡。Canary 部署是一种灰度发布策略,通过将新版本的应用程序逐步引入到生产环境中,只让一小部分用户访问新版本,从而可以在不影响大多数用户的情况下对新版本进行测试和验证。如果新版本运行正常,可以逐步扩大访问范围,直到所有用户都切换到新版本;如果出现问题,可以及时回滚到旧版本。这种方式可以实现版本的平滑过渡,降低升级风险。
- 微服务拆分 :将前端进一步拆分为 API 服务与 Web 服务。微服务架构是一种将大型应用程序拆分为多个小型、自治的服务的架构模式。通过将前端服务拆分为 API 服务和 Web 服务,可以提高系统的可维护性和可扩展性。API 服务负责处理业务逻辑和数据交互,Web 服务负责提供用户界面。这样,不同的服务可以独立开发、部署和扩展,提高了开发效率和系统的灵活性。
Global LoadBalancer 将用户的请求路由到最近或最合适的区域。这样可以提高应用程序的可用性和性能,同时实现跨区域的容灾。当某个区域出现故障时,用户的请求可以自动路由到其他正常的区域,确保服务的不间断运行。 - 灰度发布:使用 Canary 部署策略实现版本平滑过渡。Canary 部署是一种灰度发布策略,通过将新版本的应用程序逐步引入到生产环境中,只让一小部分用户访问新版本,从而可以在不影响大多数用户的情况下对新版本进行测试和验证。如果新版本运行正常,可以逐步扩大访问范围,直到所有用户都切换到新版本;如果出现问题,可以及时回滚到旧版本。这种方式可以实现版本的平滑过渡,降低升级风险。
- 微服务拆分:将前端进一步拆分为 API 服务与 Web 服务。微服务架构是一种将大型应用程序拆分为多个小型、自治的服务的架构模式。通过将前端服务拆分为 API 服务和 Web 服务,可以提高系统的可维护性和可扩展性。API 服务负责处理业务逻辑和数据交互,Web 服务负责提供用户界面。这样,不同的服务可以独立开发、部署和扩展,提高了开发效率和系统的灵活性。
- 缓存优化:在前端与 Redis 之间添加 CDN 或本地缓存层。CDN(Content Delivery Network)是一种分布式网络,可以将内容缓存到离用户最近的节点上,从而提高内容的访问速度。本地缓存层可以将经常访问的数据缓存在本地,减少对后端 Redis 服务的访问次数,提高系统的响应速度。通过在前端与 Redis 之间添加 CDN 或本地缓存层,可以进一步优化系统的性能,提高用户体验。