阶段二:微服务注册中心Nacos、分布式事务组件Seata、分布式流量控制组件Sentinel
一、课程目标
- 掌握Nacos在微服务架构中的角色和作用
- 掌握Nacos在K8S集群中的集群部署
- 掌握Nacos的服务注册和配置管理
- 掌握Nacos集群的选举原理和高可用设计
二、Nacos概述和注册中心分类
- 官方地址:https://nacos.io/docs/latest/overview/?spm=5238cd80.2ef5001f.0.0.3f613b7csOamzM
1、概述
- Nacos 是一个面向云原生和 AI 应用的动态服务发现、配置管理和 AI 管理中心(AI Registry)平台。它最早围绕两个核心问题构建:应用如何找到服务,应用如何安全地读取和更新配置。进入 3.x 后,Nacos 在这些能力之上扩展了 AI 管理中心,用来管理 Skill、A2A Agent、MCP Server、Prompt、AgentSpec 等 AI 资源。
2、核心能力
- 服务发现:服务如何注册、发现、订阅和感知健康状态
- 配置管理:配置如何集中管理、动态更新、回滚和审计
- AI 管理中心:Skill、Agent、MCP Server、Prompt、AgentSpec 如何注册、治理和发现
- 运维治理:集群如何部署、监控、升级和管理权限
- 插件扩展:如何扩展鉴权、数据源、加密、限流、环境和链路追踪能力
3、产品优势
- 易于使用:Nacos 提供控制台、SDK、OpenAPI 和运维 SDK。开发者可以快速接入服务发现和配置管理,运维人员也可以通过可视化页面和 API 管理集群。
- 能力完整:Nacos 覆盖服务发现、配置管理、健康检查、配置历史、灰度发布、权限控制、监控、插件扩展等能力。Nacos 3.x 还增加了 AI 管理中心,用来管理 Skill、A2A、MCP、Prompt、AgentSpec 等 AI 应用资源。
- 面向生产:Nacos 支持集群模式、外部数据库、监控指标、鉴权、运维 API 和升级流程。它适合从本地开发逐步走向生产环境。
- 生态开放:Nacos 可以和 Spring Cloud、Dubbo、Kubernetes、Higress、Dify、Spring AI Alibaba 等生态协同使用。插件机制也允许团队按自己的安全、存储和治理要求扩展 Nacos。
4、同类产品
<sheet sheet-id="gXmYaM" token="AHmdssUTJhns7rtlfUqcubXCnle"></sheet>
三、Nacos注册中心部署模式

- 单机模式:适合本地开发、功能验证和测试环境。它启动简单,也可以使用内置 Derby 数据库。它不适合承载高可用生产流量。
- 集群模式:适合生产环境。多个节点共同提供服务,配合外部数据库和一致性协议提升可用性。生产环境建议同时配置监控、告警、鉴权和备份策略。
1、单机部署
- 部署mysql 并导入nacos数据库
YAML 保存位置: ~/k8s-manifests/jzo2o/mysql-config.yaml
先在 Kubernetes 管理节点执行:
mkdir -p ~/k8s-manifests/jzo2o
cd ~/k8s-manifests/jzo2o
vi mysql-config.yaml把下方 YAML 全部复制进去;红色字段按当前环境修改;按 Esc 后输入 :wq 保存退出。
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-config
namespace: jzo2o
data:
my.cnf: |
[client]
default-character-set = utf8mb4
[mysqld]
log-bin=mysql-bin
binlog-format=ROW
server_id=1
expire_logs_days=3
max_binlog_size=100m
max_binlog_cache_size=512m
character_set_server=utf8mb4
collation_server=utf8mb4_bin
secure-file-priv=NULL
symbolic-links=0
default_authentication_plugin=mysql_native_password
[root@jzo2o-gateway /]# kubectl apply -f mysql-config配置详解:
| 需要改的项 | 为什么改 |
|---|---|
namespace: jzo2o | 与实际命名空间一致;使用默认命名空间时可不写。 |
配置详解:
| 需要改的项 | 为什么改 |
|---|---|
namespace: jzo2o | 与实际命名空间一致;使用默认命名空间时可不写。 |
注意事项:
- 修改配置前先备份原文件,尤其是 SSH、Nginx、数据库和 Kubernetes 生产配置。
- YAML 缩进不能乱;同级字段要对齐,子字段要多缩进两个空格。
- 资源名称、命名空间、标签选择器要互相对应,否则资源创建了也可能找不到彼此。
YAML 保存位置: ~/k8s-manifests/jzo2o/mysql.yaml
先在 Kubernetes 管理节点执行:
mkdir -p ~/k8s-manifests/jzo2o
cd ~/k8s-manifests/jzo2o
vi mysql.yaml把下方 YAML 全部复制进去;红色字段按当前环境修改;按 Esc 后输入 :wq 保存退出。
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: jzo2o
spec:
type: NodePort
selector:
app: mysql
ports:
- name: mysql
port: 3306
targetPort: 3306
nodePort: 30306
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
namespace: jzo2o
spec:
serviceName: mysql
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/mysql:8.0.26
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: mysql
- name: TZ
value: Asia/Shanghai
- name: MYSQL_DATABASE
value: "nacos-1.4.1"
args:
- --default-authentication-plugin=mysql_native_password
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
- name: mysql-config
mountPath: /etc/mysql/conf.d/my.cnf
subPath: my.cnf
volumes:
- name: mysql-config
configMap:
name: mysql-config
volumeClaimTemplates:
- metadata:
name: mysql-data
spec:
accessModes: ["ReadWriteMany"]
storageClassName: nfs-storage
resources:
requests:
storage: 50Gi
[root@k8s-master mysql]# kubectl apply -f mysql-statfulset.yaml配置详解:
| 需要改的项 | 为什么改 |
|---|---|
namespace: jzo2o | 与实际命名空间一致;使用默认命名空间时可不写。 |
port: 3306 | 对外暴露的 Service 端口;调用方按此端口访问。 |
targetPort: 3306 | 必须与容器实际监听端口一致。 |
nodePort: 30306 | 集群外通过 NodeIP:NodePort 访问时才需要改。 |
replicas: 1 | 按可用性和资源容量设置副本数。 |
image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/mysql:8.0.26 | 替换为实际可拉取的镜像地址和版本。 |
注意事项:
- 修改配置前先备份原文件,尤其是 SSH、Nginx、数据库和 Kubernetes 生产配置。
- YAML 缩进不能乱;同级字段要对齐,子字段要多缩进两个空格。
- 资源名称、命名空间、标签选择器要互相对应,否则资源创建了也可能找不到彼此。
- 镜像地址、版本号和拉取权限要确认,否则 Pod 会进入
ImagePullBackOff。
kubectl cp nacos-1.4.1.sql jzo2o/mysql-0:/root
kubectl exec -it mysql-0 -n jzo2o -- /bin/bash
mysql -u root -p
mysql> use nacos-1.4.1
mysql> source /root/nacos-1.4.1.sql;
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'mysql';
mysql> flush privileges;注意事项:
- 修改配置前先备份原文件,尤其是 SSH、Nginx、数据库和 Kubernetes 生产配置。
YAML 保存位置: ~/k8s-manifests/jzo2o/nacos-config.yaml
先在 Kubernetes 管理节点执行:
mkdir -p ~/k8s-manifests/jzo2o
cd ~/k8s-manifests/jzo2o
vi nacos-config.yaml把下方 YAML 全部复制进去;红色字段按当前环境修改;按 Esc 后输入 :wq 保存退出。
apiVersion: v1
kind: ConfigMap
metadata:
name: nacos-config
namespace: jzo2o
data:
application.properties: |
server.servlet.contextPath=/nacos
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
spring.datasource.platform=mysql
db.num=${MYSQL_DATABASE_NUM:1}
db.url.0=jdbc:mysql://mysql:3306/nacos-1.4.1?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=${MYSQL_SERVICE_USER:root}
db.password=${MYSQL_SERVICE_PASSWORD:mysql}
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}
nacos.core.auth.default.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}
nacos.core.auth.default.token.secret.key=${NACOS_AUTH_TOKEN:SecretKey012345678901234567890123456789012345678901234567890123456789}
nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false}
nacos.core.auth.enable.userAgentAuthWhite=${NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE:false}
nacos.core.auth.server.identity.key=${NACOS_AUTH_IDENTITY_KEY:serverIdentity}
nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:security}
nacos.security.ignore.urls=${NACOS_SECURITY_IGNORE_URLS:/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**}
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
#创建nacos-config配置
[root@jzo2o-gateway /]# kubectl apply -f nacos-config.yaml配置详解:
| 需要改的项 | 为什么改 |
|---|---|
namespace: jzo2o | 与实际命名空间一致;使用默认命名空间时可不写。 |
注意事项:
- 修改配置前先备份原文件,尤其是 SSH、Nginx、数据库和 Kubernetes 生产配置。
- YAML 缩进不能乱;同级字段要对齐,子字段要多缩进两个空格。
- 资源名称、命名空间、标签选择器要互相对应,否则资源创建了也可能找不到彼此。
YAML 保存位置: ~/k8s-manifests/jzo2o/nacos.yaml
先在 Kubernetes 管理节点执行:
mkdir -p ~/k8s-manifests/jzo2o
cd ~/k8s-manifests/jzo2o
vi nacos.yaml把下方 YAML 全部复制进去;红色字段按当前环境修改;按 Esc 后输入 :wq 保存退出。
apiVersion: v1
kind: Service
metadata:
name: nacos
namespace: jzo2o
spec:
type: NodePort
selector: {app: nacos}
ports:
- name: http
port: 8848
targetPort: 8848
nodePort: 30848
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nacos
namespace: jzo2o
spec:
serviceName: nacos
replicas: 1
selector:
matchLabels: {app: nacos}
template:
metadata:
labels: {app: nacos}
spec:
containers:
- name: nacos
image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nacos/nacos-server:1.4.1
ports:
- containerPort: 8848
name: http
env:
- name: MODE
value: standalone
- name: JVM_XMS
value: 256m
- name: JVM_XMX
value: 256m
- name: PREFER_HOST_MODE
value: hostname
volumeMounts:
- name: nacos-config
mountPath: /home/nacos/conf/application.properties
subPath: application.properties
- name: data
mountPath: /home/nacos/plugins/peer-finder
subPath: peer-finder
- name: data
mountPath: /home/nacos/data
subPath: data
- name: data
mountPath: /home/nacos/logs
subPath: logs
volumes:
- name: nacos-config
configMap:
name: nacos-config
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteMany"]
storageClassName: nfs-storage
resources:
requests:
storage: 5Gi配置详解:
| 需要改的项 | 为什么改 |
|---|---|
namespace: jzo2o | 与实际命名空间一致;使用默认命名空间时可不写。 |
port: 8848 | 对外暴露的 Service 端口;调用方按此端口访问。 |
targetPort: 8848 | 必须与容器实际监听端口一致。 |
nodePort: 30848 | 集群外通过 NodeIP:NodePort 访问时才需要改。 |
replicas: 1 | 按可用性和资源容量设置副本数。 |
image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nacos/nacos-server:1.4.1 | 替换为实际可拉取的镜像地址和版本。 |
注意事项:
- 修改配置前先备份原文件,尤其是 SSH、Nginx、数据库和 Kubernetes 生产配置。
- YAML 缩进不能乱;同级字段要对齐,子字段要多缩进两个空格。
- 资源名称、命名空间、标签选择器要互相对应,否则资源创建了也可能找不到彼此。
- 镜像地址、版本号和拉取权限要确认,否则 Pod 会进入
ImagePullBackOff。
2、集群模式
YAML 保存位置: ~/k8s-manifests/jzo2o/nacos-headless.yaml
先在 Kubernetes 管理节点执行:
mkdir -p ~/k8s-manifests/jzo2o
cd ~/k8s-manifests/jzo2o
vi nacos-headless.yaml把下方 YAML 全部复制进去;红色字段按当前环境修改;按 Esc 后输入 :wq 保存退出。
apiVersion: v1
kind: Service
metadata:
name: nacos-headless
namespace: jzo2o
spec:
clusterIP: None
selector:
app: nacos
ports:
- name: http
port: 8848
targetPort: 8848
- name: raft #选举端口
port: 7848
targetPort: 7848
---
apiVersion: v1
kind: Service
metadata:
name: nacos
namespace: jzo2o
spec:
type: NodePort
selector:
app: nacos
ports:
- name: http
port: 8848
targetPort: 8848
nodePort: 30848
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nacos
namespace: jzo2o
spec:
serviceName: nacos-headless
replicas: 3
selector:
matchLabels:
app: nacos
template:
metadata:
labels:
app: nacos
spec:
containers:
- name: nacos
image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nacos/nacos-server:1.4.1
ports:
- containerPort: 8848
name: http
env:
- name: MODE
value: cluster
- name: NACOS_SERVERS
value: "nacos-0.nacos-headless.jzo2o.svc.cluster.local:8848 nacos-1.nacos-headless.jzo2o.svc.cluster.local:8848 nacos-2.nacos-headless.jzo2o.svc.cluster.local:8848"
- name: JVM_XMS
value: 512m
- name: JVM_XMX
value: 512m
- name: PREFER_HOST_MODE
value: hostname
volumeMounts:
- name: nacos-config
mountPath: /home/nacos/conf/application.properties
subPath: application.properties
- name: nacos-logs
mountPath: /home/nacos/logs
volumes:
- name: nacos-config
configMap:
name: nacos-config
volumeClaimTemplates:
- metadata:
name: nacos-logs
spec:
accessModes: ["ReadWriteMany"]
storageClassName: nfs-storage
resources:
requests:
storage: 5Gi配置详解:
| 需要改的项 | 为什么改 |
|---|---|
namespace: jzo2o | 与实际命名空间一致;使用默认命名空间时可不写。 |
port: 8848 | 对外暴露的 Service 端口;调用方按此端口访问。 |
targetPort: 8848 | 必须与容器实际监听端口一致。 |
port: 7848 | 对外暴露的 Service 端口;调用方按此端口访问。 |
targetPort: 7848 | 必须与容器实际监听端口一致。 |
nodePort: 30848 | 集群外通过 NodeIP:NodePort 访问时才需要改。 |
注意事项:
- 修改配置前先备份原文件,尤其是 SSH、Nginx、数据库和 Kubernetes 生产配置。
- YAML 缩进不能乱;同级字段要对齐,子字段要多缩进两个空格。
- 资源名称、命名空间、标签选择器要互相对应,否则资源创建了也可能找不到彼此。
- 镜像地址、版本号和拉取权限要确认,否则 Pod 会进入
ImagePullBackOff。
四、分布式事务组件:Seata
- 在云岚到家这种微服务项目里,一个业务动作可能会同时调用多个服务、操作多个数据库。比如:
- 用户下单:订单服务写订单、优惠券服务核销券、账户/支付服务处理支付状态
- 支付成功:订单状态变更、交易记录生成、服务人员/机构侧数据更新
- 取消订单:订单回滚、优惠券返还、支付退款、库存/预约资源释放
这些操作分散在不同服务或不同数据库里,单靠 MySQL 本地事务不够。Seata 的作用就是协调这些服务,要么整体成功,要么整体回滚,避免出现“订单创建了,但优惠券也扣了却支付失败”这类数据不一致问题
1、创建Seata配置文件
YAML 保存位置: ~/k8s-manifests/jzo2o/seata-config.yaml
先在 Kubernetes 管理节点执行:
mkdir -p ~/k8s-manifests/jzo2o
cd ~/k8s-manifests/jzo2o
vi seata-config.yaml把下方 YAML 全部复制进去;红色字段按当前环境修改;按 Esc 后输入 :wq 保存退出。
apiVersion: v1
kind: ConfigMap
metadata:
name: seata-config
namespace: jzo2o
data:
application.yml: |
server:
port: 7091
spring:
application:
name: seata-server
console:
user:
username: seata
password: seata
logging:
config: classpath:logback-spring.xml
file:
path: ${user.home}/logs/seata
seata:
config:
type: nacos
nacos:
server-addr: nacos:8848
namespace: 75a593f5-33e6-4c65-b2a0-18c403d20f63
group: DEFAULT_GROUP
username: nacos
password: nacos
data-id: seata-server.properties
registry:
type: nacos
nacos:
application: seata-server
server-addr: nacos:8848
group: DEFAULT_GROUP
namespace: 75a593f5-33e6-4c65-b2a0-18c403d20f63
cluster: default
username: nacos
password: nacos
server:
service-port: 8091
max-commit-retry-timeout: -1
max-rollback-retry-timeout: -1
rollback-retry-timeout-unlock-enable: false
enableCheckAuth: true
retryDeadThreshold: 130000
xaerNotaRetryTimeout: 60000
recovery:
handle-all-session-period: 1000
undo:
log-save-days: 7
log-delete-period: 86400000
session:
branch-async-queue-size: 5000
enable-branch-async-remove: false
metrics:
enabled: false
registry-type: compact
exporter-list: prometheus
exporter-prometheus-port: 9898
transport:
rpc-tc-request-timeout: 30000
enable-tc-server-batch-send-response: false
shutdown:
wait: 3
security:
secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
tokenValidityInMilliseconds: 1800000
ignore:
urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/login配置详解:
| 需要改的项 | 为什么改 |
|---|---|
namespace: jzo2o | 与实际命名空间一致;使用默认命名空间时可不写。 |
port: 7091 | 对外暴露的 Service 端口;调用方按此端口访问。 |
namespace: 75a593f5-33e6-4c65-b2a0-18c403d20f63 | 与实际命名空间一致;使用默认命名空间时可不写。 |
注意事项:
- 修改配置前先备份原文件,尤其是 SSH、Nginx、数据库和 Kubernetes 生产配置。
- YAML 缩进不能乱;同级字段要对齐,子字段要多缩进两个空格。
- 资源名称、命名空间、标签选择器要互相对应,否则资源创建了也可能找不到彼此。
2、导入Seata数据库
kubectl cp seata.sql jzo2o/mysql-0:/root
kubectl exec -it mysql-0 -n jzo2o -- /bin/bash
mysql -u root -p
mysql> create database seata;
mysql> use seata
mysql> source /root/seata.sql;注意事项:
- 修改配置前先备份原文件,尤其是 SSH、Nginx、数据库和 Kubernetes 生产配置。
3、创建Seata服务
YAML 保存位置: ~/k8s-manifests/jzo2o/seata-server.yaml
先在 Kubernetes 管理节点执行:
mkdir -p ~/k8s-manifests/jzo2o
cd ~/k8s-manifests/jzo2o
vi seata-server.yaml把下方 YAML 全部复制进去;红色字段按当前环境修改;按 Esc 后输入 :wq 保存退出。
apiVersion: v1
kind: Service
metadata:
name: seata-server
namespace: jzo2o
spec:
type: NodePort
selector: {app: seata-server}
ports:
- name: console
port: 7091
targetPort: 7091
nodePort: 30091
- name: service
port: 8091
targetPort: 8091
nodePort: 30092
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: seata-server
namespace: jzo2o
spec:
replicas: 1
selector:
matchLabels: {app: seata-server}
template:
metadata:
labels: {app: seata-server}
spec:
enableServiceLinks: false
containers:
- name: seata-server
image: harbor.lanqicheng.top/jzo2o/seata-server:1.5.2
ports:
- containerPort: 7091
name: console
- containerPort: 8091
name: service
env:
- name: SEATA_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
volumeMounts:
- name: seata-config
mountPath: /seata-server/resources/application.yml
subPath: application.yml
volumes:
- name: seata-config
configMap:
name: seata-config配置详解:
| 需要改的项 | 为什么改 |
|---|---|
namespace: jzo2o | 与实际命名空间一致;使用默认命名空间时可不写。 |
port: 7091 | 对外暴露的 Service 端口;调用方按此端口访问。 |
targetPort: 7091 | 必须与容器实际监听端口一致。 |
nodePort: 30091 | 集群外通过 NodeIP:NodePort 访问时才需要改。 |
port: 8091 | 对外暴露的 Service 端口;调用方按此端口访问。 |
targetPort: 8091 | 必须与容器实际监听端口一致。 |
注意事项:
- 修改配置前先备份原文件,尤其是 SSH、Nginx、数据库和 Kubernetes 生产配置。
- YAML 缩进不能乱;同级字段要对齐,子字段要多缩进两个空格。
- 资源名称、命名空间、标签选择器要互相对应,否则资源创建了也可能找不到彼此。
- 镜像地址、版本号和拉取权限要确认,否则 Pod 会进入
ImagePullBackOff。
五、分布式流量控制组件:Sentinel
1、Sentinel概述
- Sentinel 是阿里巴巴开源的分布式流量控制组件,主要用于保护微服务系统的稳定性。它可以在流量突然增大、下游服务异常、接口响应变慢时,对请求进行限流、熔断、降级,避免单个服务故障扩散到整个系统。
- 在微服务架构中,一个请求往往会经过多个服务。例如用户下单可能会调用订单服务、优惠券服务、支付服务、库存服务。如果某个服务变慢或异常,调用方持续大量请求,就可能导致线程堆积、连接耗尽,最终拖垮整个链路。Sentinel 就是用来在这些关键位置做保护
- Sentinel 常见能力:
- 流量控制:控制接口 QPS 或线程数,防止瞬时流量过高
- 熔断降级:当接口异常比例、异常数、响应时间达到阈值时,自动熔断
- 热点参数限流:对某些高频参数做单独限流,比如热门服务、热门商品
- 系统自适应保护:根据系统负载、CPU、入口 QPS 等指标保护整体服务
- 实时监控:查看接口访问量、通过量、拒绝量、响应时间等
- 动态规则:支持通过 Dashboard、Nacos 等方式动态配置规则
2、Sentinel-Dashboard服务部署
YAML 保存位置: ~/k8s-manifests/jzo2o/sentinel-dashboard.yaml
先在 Kubernetes 管理节点执行:
mkdir -p ~/k8s-manifests/jzo2o
cd ~/k8s-manifests/jzo2o
vi sentinel-dashboard.yaml把下方 YAML 全部复制进去;红色字段按当前环境修改;按 Esc 后输入 :wq 保存退出。
apiVersion: v1
kind: Service
metadata:
name: sentinel-dashboard
namespace: jzo2o
labels:
app: sentinel-dashboard
spec:
type: NodePort
selector:
app: sentinel-dashboard
ports:
- name: http
port: 8080
targetPort: 8080
nodePort: 30087
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: sentinel-dashboard
namespace: jzo2o
labels:
app: sentinel-dashboard
spec:
replicas: 1
selector:
matchLabels:
app: sentinel-dashboard
template:
metadata:
labels:
app: sentinel-dashboard
spec:
containers:
- name: sentinel-dashboard
image: harbor.lanqicheng.top/jzo2o/sentinel-dashboard:1.8.5
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 8080
env:
- name: TZ
value: Asia/Shanghai
- name: JAVA_OPTS
value: >-
-Dserver.port=8080
-Dproject.name=sentinel-dashboard
-Dsentinel.dashboard.auth.username=sentinel
-Dsentinel.dashboard.auth.password=sentinel
resources:
requests:
cpu: 100m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
livenessProbe:
httpGet:
path: /
port: 8080
initialDelaySeconds: 60
periodSeconds: 10
timeoutSeconds: 3
failureThreshold: 6
readinessProbe:
httpGet:
path: /
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 3
failureThreshold: 6配置详解:
| 需要改的项 | 为什么改 |
|---|---|
namespace: jzo2o | 与实际命名空间一致;使用默认命名空间时可不写。 |
port: 8080 | 对外暴露的 Service 端口;调用方按此端口访问。 |
targetPort: 8080 | 必须与容器实际监听端口一致。 |
nodePort: 30087 | 集群外通过 NodeIP:NodePort 访问时才需要改。 |
replicas: 1 | 按可用性和资源容量设置副本数。 |
image: harbor.lanqicheng.top/jzo2o/sentinel-dashboard:1.8.5 | 替换为实际可拉取的镜像地址和版本。 |
注意事项:
- 修改配置前先备份原文件,尤其是 SSH、Nginx、数据库和 Kubernetes 生产配置。
- YAML 缩进不能乱;同级字段要对齐,子字段要多缩进两个空格。
- 资源名称、命名空间、标签选择器要互相对应,否则资源创建了也可能找不到彼此。
- 镜像地址、版本号和拉取权限要确认,否则 Pod 会进入
ImagePullBackOff。
3、服务启用限流
- 服务配置
cloud:
sentinel:
transport:
# 供sentinel dashboard平台访问端口
port: 8719
# sentinel控制台
dashboard: sentinel-dashboard:8087
#服务启动直接建立心跳连接
eager: true配置详解:
| 需要改的项 | 为什么改 |
|---|---|
port: 8719 | 对外暴露的 Service 端口;调用方按此端口访问。 |
注意事项:
- 修改配置前先备份原文件,尤其是 SSH、Nginx、数据库和 Kubernetes 生产配置。
六、分布式任务调度组件:XXL-JOB
1、XXL-JOB概述
- XXL-JOB 是一个轻量级的分布式任务调度平台,主要用来统一管理和执行定时任务。它可以让开发人员或运维人员在后台页面中配置任务执行时间、执行策略、失败重试、执行日志等内容
- 它由两部分组成:
xxl-job-admin:调度中心,提供后台页面,负责创建任务、触发任务、查看日志
xxl-job-executor:执行器,集成在业务服务中,真正执行具体任务逻辑
2、项目业务使用场景
- 订单超时处理:超时未支付取消、派单超时取消、自动评价
- 抢单/派单处理:抢单转派单、派单池分发、到服务时间清理
- 营销活动处理:活动状态更新、优惠券过期、活动预热、抢券同步
- 数据统计归档:订单统计、历史订单迁移
- 缓存同步:区域缓存、首页服务缓存、热门服务缓存
- 消息补偿:RabbitMQ 异常消息重发
3、XXL-JOB服务部署
- 创建配置文件
YAML 保存位置: ~/k8s-manifests/jzo2o/xxl-job-config.yaml
先在 Kubernetes 管理节点执行:
mkdir -p ~/k8s-manifests/jzo2o
cd ~/k8s-manifests/jzo2o
vi xxl-job-config.yaml把下方 YAML 全部复制进去;红色字段按当前环境修改;按 Esc 后输入 :wq 保存退出。
apiVersion: v1
kind: ConfigMap
metadata:
name: xxl-job-config
namespace: jzo2o
data:
application.properties: |
### web
server.port=8080
server.servlet.context-path=/xxl-job-admin
### actuator
management.server.servlet.context-path=/actuator
management.health.mail.enabled=false
### resources
spring.mvc.servlet.load-on-startup=0
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/static/
### freemarker
spring.freemarker.templateLoaderPath=classpath:/templates/
spring.freemarker.suffix=.ftl
spring.freemarker.charset=UTF-8
spring.freemarker.request-context-attribute=request
spring.freemarker.settings.number_format=0.##########
### mybatis
mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
#mybatis.type-aliases-package=com.xxl.job.admin.core.model
### xxl-job, datasource
spring.datasource.url=jdbc:mysql://mysql:3306/xxl_job_2.3.1?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=mysql
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
### datasource-pool
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=HikariCP
spring.datasource.hikari.max-lifetime=900000
spring.datasource.hikari.connection-timeout=10000
spring.datasource.hikari.connection-test-query=SELECT 1
spring.datasource.hikari.validation-timeout=1000
### xxl-job, email
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=xxx@qq.com
spring.mail.from=xxx@qq.com
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
### xxl-job, access token
xxl.job.accessToken=default_token
### xxl-job, i18n (default is zh_CN, and you can choose "zh_CN", "zh_TC" and "en")
xxl.job.i18n=zh_CN
## xxl-job, triggerpool max size
xxl.job.triggerpool.fast.max=200
xxl.job.triggerpool.slow.max=100
### xxl-job, log retention days
xxl.job.logretentiondays=30配置详解:
| 需要改的项 | 为什么改 |
|---|---|
namespace: jzo2o | 与实际命名空间一致;使用默认命名空间时可不写。 |
注意事项:
- 修改配置前先备份原文件,尤其是 SSH、Nginx、数据库和 Kubernetes 生产配置。
- YAML 缩进不能乱;同级字段要对齐,子字段要多缩进两个空格。
- 资源名称、命名空间、标签选择器要互相对应,否则资源创建了也可能找不到彼此。
kubectl cp xxl_job_2.3.1.sql jzo2o/mysql-0:/root
kubectl exec -it mysql-0 -n jzo2o -- /bin/bash
mysql -u root -p
mysql> create database `xxl_job_2.3.1`;
mysql> use xxl_job_2.3.1
mysql> source /root/xxl_job_2.3.1.sql;注意事项:
- 修改配置前先备份原文件,尤其是 SSH、Nginx、数据库和 Kubernetes 生产配置。
YAML 保存位置: ~/k8s-manifests/jzo2o/xxl-job-admin.yaml
先在 Kubernetes 管理节点执行:
mkdir -p ~/k8s-manifests/jzo2o
cd ~/k8s-manifests/jzo2o
vi xxl-job-admin.yaml把下方 YAML 全部复制进去;红色字段按当前环境修改;按 Esc 后输入 :wq 保存退出。
apiVersion: v1
kind: Service
metadata:
name: xxl-job-admin
namespace: jzo2o
spec:
type: NodePort
selector: {app: xxl-job-admin}
ports:
- name: http
port: 8080
targetPort: 8080
nodePort: 30088
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: xxl-job-admin
namespace: jzo2o
spec:
replicas: 1
selector:
matchLabels: {app: xxl-job-admin}
template:
metadata:
labels: {app: xxl-job-admin}
spec:
containers:
- name: xxl-job-admin
image: xuxueli/xxl-job-admin:2.3.1
ports:
- containerPort: 8080
name: http
env:
- name: PARAMS
value: --spring.config.location=/application.properties
volumeMounts:
- name: xxl-job-config
mountPath: /application.properties
subPath: application.properties
volumes:
- name: xxl-job-config
configMap:
name: xxl-job-config配置详解:
| 需要改的项 | 为什么改 |
|---|---|
namespace: jzo2o | 与实际命名空间一致;使用默认命名空间时可不写。 |
port: 8080 | 对外暴露的 Service 端口;调用方按此端口访问。 |
targetPort: 8080 | 必须与容器实际监听端口一致。 |
nodePort: 30088 | 集群外通过 NodeIP:NodePort 访问时才需要改。 |
replicas: 1 | 按可用性和资源容量设置副本数。 |
image: xuxueli/xxl-job-admin:2.3.1 | 替换为实际可拉取的镜像地址和版本。 |
注意事项:
- 修改配置前先备份原文件,尤其是 SSH、Nginx、数据库和 Kubernetes 生产配置。
- YAML 缩进不能乱;同级字段要对齐,子字段要多缩进两个空格。
- 资源名称、命名空间、标签选择器要互相对应,否则资源创建了也可能找不到彼此。
- 镜像地址、版本号和拉取权限要确认,否则 Pod 会进入
ImagePullBackOff。
4、后台可视化

同步说明
本文由飞书云文档同步生成。涉及命令、SQL、配置示例时,请以飞书源文档和实际环境执行结果为准。