1. 首页 > IT综合教程 > 正文

248. Nacos服务发现与配置管理培训

一、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 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”
}
}]
}

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

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
}
]
}

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”
}
}
}
]
}

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
}

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

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息