Nacos注册中心与配置管理
约 1260 字大约 4 分钟
nacosservice-discovery
2025-03-31
概述
Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的服务发现和配置管理平台。它整合了服务注册与发现、动态配置管理、动态 DNS 服务等核心功能,是 Spring Cloud Alibaba 生态的核心组件,广泛应用于国内微服务架构中。
Nacos 架构
服务注册与发现
引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>服务提供者配置
spring:
application:
name: user-service
cloud:
nacos:
discovery:
server-addr: nacos1:8848,nacos2:8848,nacos3:8848
namespace: ${NACOS_NAMESPACE:public}
group: DEFAULT_GROUP
cluster-name: SH # 上海集群
weight: 1.0
metadata:
version: v2.1
region: cn-east
# 临时实例(默认)vs 持久实例
ephemeral: true
# 心跳间隔
heart-beat-interval: 5000
heart-beat-timeout: 15000
ip-delete-timeout: 30000服务消费者
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
@Service
public class OrderService {
@Autowired
private RestTemplate restTemplate;
public User getUserById(Long userId) {
// lb:// 前缀触发负载均衡,自动从 Nacos 获取实例地址
return restTemplate.getForObject(
"http://user-service/api/users/" + userId,
User.class
);
}
}使用 OpenFeign 声明式调用:
@FeignClient(name = "user-service", fallbackFactory = UserClientFallbackFactory.class)
public interface UserClient {
@GetMapping("/api/users/{id}")
User getUserById(@PathVariable("id") Long id);
@PostMapping("/api/users")
User createUser(@RequestBody CreateUserRequest request);
}
@Component
public class UserClientFallbackFactory implements FallbackFactory<UserClient> {
@Override
public UserClient create(Throwable cause) {
return new UserClient() {
@Override
public User getUserById(Long id) {
return User.defaultUser();
}
@Override
public User createUser(CreateUserRequest request) {
throw new ServiceUnavailableException("User service unavailable", cause);
}
};
}
}健康检查机制
配置管理
引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>配置基本使用
# application.yml
spring:
application:
name: user-service
profiles:
active: dev
cloud:
nacos:
config:
server-addr: nacos:8848
namespace: ${NACOS_NAMESPACE:public}
group: DEFAULT_GROUP
file-extension: yaml
# 共享配置
shared-configs:
- data-id: common-db.yaml
group: SHARED_GROUP
refresh: true
- data-id: common-redis.yaml
group: SHARED_GROUP
refresh: true
# 扩展配置
extension-configs:
- data-id: custom-log.yaml
group: DEFAULT_GROUP
refresh: trueNacos 中的 Data ID 对应关系:
${spring.application.name}-${spring.profiles.active}.${file-extension}
→ user-service-dev.yaml配置动态刷新
// 方式一:@RefreshScope
@RestController
@RefreshScope
public class ConfigController {
@Value("${app.feature.enabled:false}")
private boolean featureEnabled;
@GetMapping("/config/feature")
public boolean isFeatureEnabled() {
return featureEnabled;
}
}
// 方式二:@ConfigurationProperties(自动刷新)
@Component
@ConfigurationProperties(prefix = "app.rate-limit")
public class RateLimitConfig {
private int qps = 100;
private int burstSize = 200;
private boolean enabled = true;
// getters and setters...
public int getQps() { return qps; }
public void setQps(int qps) { this.qps = qps; }
public int getBurstSize() { return burstSize; }
public void setBurstSize(int burstSize) { this.burstSize = burstSize; }
public boolean isEnabled() { return enabled; }
public void setEnabled(boolean enabled) { this.enabled = enabled; }
}
// 方式三:监听配置变更
@Component
public class NacosConfigListener {
@NacosConfigListener(dataId = "user-service-dev.yaml", groupId = "DEFAULT_GROUP")
public void onConfigChange(String newConfig) {
// 配置变更时的回调处理
System.out.println("Config changed: " + newConfig);
}
}Namespace 与 Group
| 维度 | 用途 | 示例 |
|---|---|---|
| Namespace | 环境隔离 | dev、staging、prod |
| Group | 业务分组 | DEFAULT_GROUP、PAYMENT_GROUP |
| Data ID | 具体配置文件 | user-service-dev.yaml |
集群部署
Nacos 集群配置
# conf/cluster.conf
192.168.1.101:8848
192.168.1.102:8848
192.168.1.103:8848# conf/application.properties
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://mysql:3306/nacos_config?characterEncoding=utf8&serverTimezone=UTC
db.user.0=nacos
db.password.0=${MYSQL_PASSWORD}Nginx 负载均衡
upstream nacos-cluster {
server 192.168.1.101:8848;
server 192.168.1.102:8848;
server 192.168.1.103:8848;
}
server {
listen 8848;
location / {
proxy_pass http://nacos-cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}与 Eureka / Consul 对比
| 特性 | Nacos | Eureka | Consul |
|---|---|---|---|
| 一致性协议 | AP + CP(可切换) | AP | CP |
| 健康检查 | TCP/HTTP/MySQL/自定义 | 客户端心跳 | TCP/HTTP/gRPC/脚本 |
| 配置管理 | 内置 | 无 | KV Store |
| 负载均衡 | 内置权重 | Ribbon | 无内置 |
| 管理控制台 | 内置 Web UI | 简单 UI | Web UI |
| 雪崩保护 | 有 | 有 | 无 |
| 跨数据中心 | 支持 | 不支持 | 支持 |
| Spring Cloud 集成 | Spring Cloud Alibaba | 原生 | Spring Cloud Consul |
最佳实践
1. 灰度发布
@Configuration
public class GrayReleaseConfig {
@Bean
public ReactorLoadBalancer<ServiceInstance> grayLoadBalancer(
ServiceInstanceListSupplier supplier,
@Value("${app.version:v1}") String currentVersion) {
return new ReactorServiceInstanceLoadBalancer() {
@Override
public Mono<Response<ServiceInstance>> choose(Request request) {
return supplier.get().next().map(instances -> {
List<ServiceInstance> filtered = instances.stream()
.filter(i -> currentVersion.equals(
i.getMetadata().get("version")))
.toList();
if (filtered.isEmpty()) {
filtered = instances;
}
int index = ThreadLocalRandom.current().nextInt(filtered.size());
return new DefaultResponse(filtered.get(index));
});
}
};
}
}2. 配置回滚
Nacos 控制台支持配置历史版本查看和一键回滚。也可以通过 API 操作:
# 查看配置历史
GET /nacos/v1/cs/history?dataId=user-service-dev.yaml&group=DEFAULT_GROUP
# 回滚到指定版本
POST /nacos/v1/cs/history?nid={historyId}总结
Nacos 作为一体化的服务发现和配置管理平台,提供了开箱即用的服务注册/发现、配置管理和动态 DNS 能力。通过 Namespace/Group 实现多环境和多租户隔离,支持临时实例和持久实例两种注册模式。与 Spring Cloud Alibaba 深度集成,配合 Sentinel、Seata 等组件可以构建完整的微服务治理体系。
贡献者
更新日志
2026/3/14 13:09
查看所有更新日志
9f6c2-feat: organize wiki content and refresh site setup于