一、Nacos概述
Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的服务发现和配置管理平台,提供动态服务发现、服务配置管理、服务元数据及流量管理能力。
1.1 Nacos核心功能
- 服务注册与发现:支持基于DNS和RPC的服务发现
- 动态配置管理:动态配置服务,支持配置热更新
- 动态DNS服务:支持权重路由,更容易实现负载均衡
- 服务及其元数据管理:管理数据中心、环境、服务版本等元数据
1.2 Nacos架构
Nacos架构组件:
┌─────────────────────────────────────────┐
│ Nacos Console │
├─────────────────────────────────────────┤
│ Config Service │ Naming Service │
├─────────────────────────────────────────┤
│ Nacos Core Module │
├─────────────────────────────────────────┤
│ Protocol Layer │ Plugin Layer │
└─────────────────────────────────────────┘
二、Nacos安装部署
2.1 单机模式安装
# 下载Nacos
wget https://github.com/alibaba/nacos/releases/download/2.3.0/nacos-server-2.3.0.tar.gz
# 解压安装
tar -xzf nacos-server-2.3.0.tar.gz -C /opt/
ln -s /opt/nacos /opt/nacos
# 配置环境变量
export NACOS_HOME=/opt/nacos
export PATH=$PATH:$NACOS_HOME/bin
# 单机模式启动
sh /opt/nacos/bin/startup.sh -m standalone
# 查看启动日志
tail -f /opt/nacos/logs/start.out
# 输出示例
,–.nacos,–.
| ‘–‘ ‘–‘| Nacos 2.3.0
|——–. ‘–‘|
‘–‘ ‘–‘ ‘–‘
,–.nacos,–.
| ‘–‘ ‘–‘| Nacos 2.3.0
|——–. ‘–‘|
‘–‘ ‘–‘ ‘–‘
Nacos started successfully in stand alone mode. use embedded storage
2.2 集群模式部署
# 配置cluster.conf
cd /opt/nacos/conf
cp cluster.conf.example cluster.conf
# 编辑cluster.conf
vim cluster.conf
# 添加集群节点
192.168.1.101:8848
192.168.1.102:8848
192.168.1.103:8848
# 配置数据库(MySQL)
vim application.properties
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.1.100:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=nacos
db.password.0=nacos123
# 初始化数据库
mysql -u root -p < /opt/nacos/conf/mysql-schema.sql
# 启动集群节点
sh /opt/nacos/bin/startup.sh
三、服务注册与发现
3.1 服务注册
# 使用curl注册服务
curl -X POST 'http://fgedudb:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=192.168.1.100&port=8080'
# 使用Open API注册服务(带元数据)
curl -X POST 'http://fgedudb:8848/nacos/v1/ns/instance' \
-d 'serviceName=order-service' \
-d 'ip=192.168.1.100' \
-d 'port=8080' \
-d 'weight=1.0' \
-d 'enabled=true' \
-d 'healthy=true' \
-d 'metadata={"version":"v1","region":"cn-east"}'
# 查看服务实例
curl 'http://fgedudb:8848/nacos/v1/ns/instance/list?serviceName=order-service'
# 输出示例
{
“name”: “DEFAULT_GROUP@@order-service”,
“groupName”: “DEFAULT_GROUP”,
“clusters”: “”,
“cacheMillis”: 10000,
“hosts”: [{
“instanceId”: “192.168.1.100#8080#DEFAULT#DEFAULT_GROUP@@order-service”,
“ip”: “192.168.1.100”,
“port”: 8080,
“weight”: 1.0,
“healthy”: true,
“enabled”: true,
“metadata”: {
“version”: “v1”,
“region”: “cn-east”
}
}]
}
{
“name”: “DEFAULT_GROUP@@order-service”,
“groupName”: “DEFAULT_GROUP”,
“clusters”: “”,
“cacheMillis”: 10000,
“hosts”: [{
“instanceId”: “192.168.1.100#8080#DEFAULT#DEFAULT_GROUP@@order-service”,
“ip”: “192.168.1.100”,
“port”: 8080,
“weight”: 1.0,
“healthy”: true,
“enabled”: true,
“metadata”: {
“version”: “v1”,
“region”: “cn-east”
}
}]
}
3.2 服务发现
# 订阅服务
curl 'http://fgedudb:8848/nacos/v1/ns/instance/list?serviceName=order-service&clusters=DEFAULT'
# 获取健康实例
curl 'http://fgedudb:8848/nacos/v1/ns/instance/list?serviceName=order-service&healthyOnly=true'
# 获取服务详情
curl 'http://fgedudb:8848/nacos/v1/ns/service?serviceName=order-service'
# 查询所有服务
curl 'http://fgedudb:8848/nacos/v1/ns/service/list?pageNo=1&pageSize=10'
3.3 Spring Cloud集成
<!-- pom.xml依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2022.0.0.0</version>
</dependency>
# application.yml配置
spring:
application:
name: order-service
cloud:
nacos:
discovery:
server-addr: 192.168.1.101:8848,192.168.1.102:8848,192.168.1.103:8848
namespace: dev
group: ORDER_GROUP
metadata:
version: v1
region: cn-east
# 启动类注解
@SpringBootApplication
@EnableDiscoveryClient
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
}
四、配置管理
4.1 配置发布
# 发布配置
curl -X POST "http://fgedudb:8848/nacos/v1/cs/configs" \
-d "dataId=order-service.properties" \
-d "group=DEFAULT_GROUP" \
-d "content=server.port=8080
spring.datasource.url=jdbc:mysql://fgedudb:3306/order_db
spring.datasource.username=root
spring.datasource.password=secret
spring.redis.host=fgedudb
spring.redis.port=6379"
# 发布YAML格式配置
curl -X POST "http://fgedudb:8848/nacos/v1/cs/configs" \
-d "dataId=order-service.yaml" \
-d "group=DEFAULT_GROUP" \
-d "content=server:
port: 8080
spring:
datasource:
url: jdbc:mysql://fgedudb:3306/order_db
username: root
password: secret
redis:
host: fgedudb
port: 6379"
# 输出示例
true
true
4.2 配置获取
# 获取配置
curl "http://fgedudb:8848/nacos/v1/cs/configs?dataId=order-service.properties&group=DEFAULT_GROUP"
# 获取配置及元数据
curl "http://fgedudb:8848/nacos/v1/cs/configs?dataId=order-service.properties&group=DEFAULT_GROUP&tenant="
# 监听配置变化
curl "http://fgedudb:8848/nacos/v1/cs/configs/listener" \
-d "dataId=order-service.properties&group=DEFAULT_GROUP&tenant="
4.3 Spring Cloud配置集成
<!-- pom.xml依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2022.0.0.0</version>
</dependency>
# bootstrap.yml配置
spring:
application:
name: order-service
cloud:
nacos:
config:
server-addr: 192.168.1.101:8848
namespace: dev
group: ORDER_GROUP
file-extension: yaml
shared-configs:
- data-id: common.yaml
group: COMMON_GROUP
refresh: true
extension-configs:
- data-id: redis.yaml
group: INFRA_GROUP
refresh: true
# 配置类
@RefreshScope
@RestController
public class ConfigController {
@Value("${app.config.value:default}")
private String configValue;
@GetMapping("/config")
public String getConfig() {
return configValue;
}
}
五、命名空间与分组管理
5.1 命名空间管理
# 创建命名空间
curl -X POST 'http://fgedudb:8848/nacos/v1/console/namespaces' \
-d 'customNamespaceId=dev' \
-d 'namespaceName=开发环境' \
-d 'namespaceDesc=开发环境命名空间'
# 查询命名空间列表
curl 'http://fgedudb:8848/nacos/v1/console/namespaces'
# 删除命名空间
curl -X DELETE 'http://fgedudb:8848/nacos/v1/console/namespaces?namespaceId=dev'
# 使用命名空间注册服务
curl -X POST 'http://fgedudb:8848/nacos/v1/ns/instance?serviceName=order-service&ip=192.168.1.100&port=8080&namespaceId=dev'
# 输出示例
{
“code”: 200,
“message”: “success”,
“data”: [
{
“namespace”: “dev”,
“namespaceShowName”: “开发环境”,
“namespaceDesc”: “开发环境命名空间”,
“quota”: 200,
“configCount”: 15,
“type”: 2
}
]
}
{
“code”: 200,
“message”: “success”,
“data”: [
{
“namespace”: “dev”,
“namespaceShowName”: “开发环境”,
“namespaceDesc”: “开发环境命名空间”,
“quota”: 200,
“configCount”: 15,
“type”: 2
}
]
}
5.2 分组管理
# 不同分组的服务注册
curl -X POST 'http://fgedudb:8848/nacos/v1/ns/instance?serviceName=order-service&ip=192.168.1.100&port=8080&groupName=ORDER_GROUP'
# 不同分组的配置发布
curl -X POST "http://fgedudb:8848/nacos/v1/cs/configs" \
-d "dataId=order-service.properties" \
-d "group=ORDER_GROUP" \
-d "content=server.port=8080"
# 查询指定分组的服务
curl 'http://fgedudb:8848/nacos/v1/ns/instance/list?serviceName=order-service&groupName=ORDER_GROUP'
# 查询指定分组的配置
curl "http://fgedudb:8848/nacos/v1/cs/configs?dataId=order-service.properties&group=ORDER_GROUP"
六、健康检查机制
6.1 健康检查配置
# 服务实例健康检查配置
curl -X POST 'http://fgedudb:8848/nacos/v1/ns/instance' \
-d 'serviceName=order-service' \
-d 'ip=192.168.1.100' \
-d 'port=8080' \
-d 'weight=1.0' \
-d 'enabled=true' \
-d 'healthy=true' \
-d 'ephemeral=true'
# 设置实例健康状态
curl -X PUT 'http://fgedudb:8848/nacos/v1/ns/instance/health' \
-d 'serviceName=order-service' \
-d 'ip=192.168.1.100' \
-d 'port=8080' \
-d 'healthy=false'
# 查看实例健康状态
curl 'http://fgedudb:8848/nacos/v1/ns/instance/list?serviceName=order-service&healthyOnly=false'
6.2 保护阈值配置
# 设置服务保护阈值
curl -X PUT 'http://fgedudb:8848/nacos/v1/ns/service' \
-d 'serviceName=order-service' \
-d 'protectThreshold=0.5'
# 查看服务保护阈值
curl 'http://fgedudb:8848/nacos/v1/ns/service?serviceName=order-service'
最佳实践:
- 保护阈值建议设置为0.5-0.7,防止雪崩效应
- 临时实例使用客户端心跳检测,持久实例使用服务端主动探测
- 生产环境建议使用集群模式部署
七、集群管理
7.1 集群状态查看
# 查看集群状态
curl 'http://fgedudb:8848/nacos/v1/ns/operator/servers'
# 查看集群健康状态
curl 'http://fgedudb:8848/nacos/v1/ns/operator/metrics'
# 查看Raft状态
curl 'http://fgedudb:8848/nacos/v1/ns/raft/state'
# 查看Leader信息
curl 'http://fgedudb:8848/nacos/v1/ns/raft/leader'
# 输出示例
{
“servers”: [
{
“ip”: “192.168.1.101”,
“port”: 8848,
“state”: “UP”,
“extendInfo”: {
“raftMetaData”: {
“leader”: “192.168.1.101:7848”
}
}
}
]
}
{
“servers”: [
{
“ip”: “192.168.1.101”,
“port”: 8848,
“state”: “UP”,
“extendInfo”: {
“raftMetaData”: {
“leader”: “192.168.1.101:7848”
}
}
}
]
}
7.2 集群运维命令
# 滚动重启集群节点
# 1. 停止节点
sh /opt/nacos/bin/shutdown.sh
# 2. 等待集群选举完成
sleep 30
# 3. 启动节点
sh /opt/nacos/bin/startup.sh
# 4. 检查节点状态
curl 'http://fgedudb:8848/nacos/v1/console/health/readiness'
# 数据备份
mysqldump -u nacos -p nacos > nacos_backup_$(date +%Y%m%d).sql
# 数据恢复
mysql -u nacos -p nacos < nacos_backup_20260330.sql
八、安全配置
8.1 开启鉴权
# application.properties配置
nacos.core.auth.enabled=true
nacos.core.auth.server.identity.key=serverIdentity
nacos.core.auth.server.identity.value=security
nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789
# 创建用户
curl -X POST 'http://fgedudb:8848/nacos/v1/auth/users' \
-d 'username=admin' \
-d 'password=admin123'
# 创建角色
curl -X POST 'http://fgedudb:8848/nacos/v1/auth/roles' \
-d 'role=ROLE_ADMIN' \
-d 'username=admin'
# 创建权限
curl -X POST 'http://fgedudb:8848/nacos/v1/auth/permissions' \
-d 'role=ROLE_ADMIN' \
-d 'resource=*:*' \
-d 'action=rw'
# 登录获取Token
curl -X POST 'http://fgedudb:8848/nacos/v1/auth/login' \
-d 'username=admin' \
-d 'password=admin123'
# 输出示例
{
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"tokenTtl": 18000
}
{
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"tokenTtl": 18000
}
8.2 使用Token访问
# 使用Token访问API
export TOKEN="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
curl -H "Authorization: Bearer $TOKEN" \
'http://fgedudb:8848/nacos/v1/ns/instance/list?serviceName=order-service'
# 使用Token发布配置
curl -X POST "http://fgedudb:8848/nacos/v1/cs/configs" \
-H "Authorization: Bearer $TOKEN" \
-d "dataId=test.properties" \
-d "group=DEFAULT_GROUP" \
-d "content=test=value"
九、监控与告警
9.1 Prometheus监控集成
# application.properties开启metrics
management.endpoints.web.exposure.include=*
management.metrics.export.prometheus.enabled=true
# prometheus.yml配置
scrape_configs:
- job_name: 'nacos'
metrics_path: '/nacos/actuator/prometheus'
static_configs:
- targets: ['192.168.1.101:8848', '192.168.1.102:8848', '192.168.1.103:8848']
# 关键监控指标
nacos_monitor{name='serviceCount'} # 服务数量
nacos_monitor{name='instanceCount'} # 实例数量
nacos_monitor{name='configCount'} # 配置数量
nacos_monitor{name='subscriberCount'} # 订阅者数量
nacos_client_request_seconds # 请求延迟
9.2 Grafana仪表盘
# Nacos Dashboard JSON配置片段
{
"dashboard": {
"title": "Nacos Monitoring",
"panels": [
{
"title": "Service Count",
"targets": [{
"expr": "nacos_monitor{name='serviceCount'}"
}]
},
{
"title": "Instance Count",
"targets": [{
"expr": "nacos_monitor{name='instanceCount'}"
}]
},
{
"title": "Request Latency",
"targets": [{
"expr": "histogram_quantile(0.99, rate(nacos_client_request_seconds_bucket[5m]))"
}]
}
]
}
}
十、最佳实践
10.1 生产环境部署建议
| 配置项 | 建议值 | 说明 |
|---|---|---|
| 集群节点数 | 3或5 | 奇数节点,保证Raft选举 |
| JVM堆内存 | 2-4GB | 根据服务规模调整 |
| 数据库 | MySQL主从 | 保证数据可靠性 |
| 保护阈值 | 0.5-0.7 | 防止雪崩效应 |
10.2 常见问题排查
# 查看Nacos日志
tail -f /opt/nacos/logs/nacos.log
tail -f /opt/nacos/logs/protocol-raft.log
tail -f /opt/nacos/logs/config-client.log
# 检查端口占用
netstat -tlnp | grep 8848
netstat -tlnp | grep 9848
netstat -tlnp | grep 9849
# 检查集群同步状态
curl 'http://fgedudb:8848/nacos/v1/ns/operator/metrics'
# 重置集群状态(谨慎操作)
rm -rf /opt/nacos/data/protocol/raft/
sh /opt/nacos/bin/startup.sh
注意事项:
- 生产环境必须开启鉴权
- 定期备份配置数据
- 监控集群健康状态
- 合理规划命名空间和分组
十一、总结
Nacos作为微服务架构中的核心组件,提供了服务发现和配置管理的一站式解决方案。通过本培训文档,您应该掌握了:
学习交流加群风哥QQ113257174
- Nacos的安装部署(单机/集群模式)
- 服务注册与发现的使用方法
- 动态配置管理的实现
- 命名空间和分组的管理
- 集群运维和监控告警配置
- 安全配置和最佳实践
IT运维培训文档系列 | 第248篇 | Nacos服务发现与配置管理培训
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
