1. 什么是 Nacos?
Nacos (Dynamic Na ming and Co nfiguration S ervice)是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现 、配置管理 和服务管理平台。
它的核心功能可以概括为两点:
- 服务注册与发现:微服务实例可以将自己注册到Nacos,并能发现和调用其他健康的服务实例。
- 动态配置管理:集中管理所有环境的应用程序配置,并支持配置的动态刷新,无需重启应用。
2. 核心概念
2.1 服务发现相关
- 命名空间 :用于进行租户粒度的配置隔离。不同的命名空间(如
dev
,test
,prod
)下的服务和配置相互不可见。 - 服务:对外提供的软件功能。
- 服务实例:提供某个服务的具体进程,通常对应一个可访问的IP和端口。
- 元数据:描述服务实例的附加信息,如版本、环境等,用于更精细的服务治理。
- 集群:同一个服务可以部署在多个集群(如北京机房、上海机房),以实现容灾或同城多活。
- 健康检查:Nacos通过心跳或主动探测来判断服务实例是否健康,只会将健康的实例返回给消费者。
2.2 配置管理相关
- 配置集 :一个系统或应用的配置文件集合,通常对应一个
YAML
或Properties
文件。 - 配置集 ID :配置集的唯一标识,通常使用
${spring.application.name}.${file-extension}
的格式。 - 配置分组 :对配置集进行分组,默认是
DEFAULT_GROUP
。可用于区分不同应用或不同用途的配置。 - Data ID:配置集的名称。
3. 安装与启动
3.1 环境准备
- JDK 1.8+
3.2 下载与安装
从 Nacos GitHub Release 页面下载最新稳定版的压缩包。
bash
复制下载
bash
# 以 nacos-server-2.2.3.tar.gz 为例
tar -zxvf nacos-server-2.2.3.tar.gz
cd nacos
3.3 启动服务器
单机模式(适合开发测试)
bash
复制下载
bash
# Linux/Unix/Mac
sh bin/startup.sh -m standalone
# Windows
cmd bin/startup.cmd -m standalone
-m standalone
代表以单机模式启动,默认使用内嵌数据库(Derby),数据无法持久化。
集群模式(适合生产环境)
-
配置数据库 :修改
conf/application.properties
,使用MySQL作为持久化存储。properties
复制下载
inispring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user.0=nacos db.password.0=nacos
-
配置集群 :修改
conf/cluster.conf
,列出集群中所有节点的IP和端口。text
复制下载
makefile192.168.1.10:8848 192.168.1.11:8848 192.168.1.12:8848
-
启动集群 :在每个节点上执行启动命令(无需
-m standalone
参数)。bash
复制下载
bashsh bin/startup.sh
3.4 访问控制台
启动成功后,访问 http://localhost:8848/nacos
。
- 默认用户名/密码 :
nacos
/nacos
4. 服务发现功能使用
4.1 服务提供者注册
1. 引入Spring Cloud Alibaba依赖
xml
复制下载运行
xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2022.0.0.0</version>
</dependency>
2. 配置应用
在 application.yml
中配置Nacos服务器地址和应用名。
yaml
复制下载
yaml
spring:
application:
name: user-service # 服务名
cloud:
nacos:
discovery:
server-addr: localhost:8848 # Nacos服务器地址
namespace: dev-01 # 可选,指定命名空间ID
group: MY_GROUP # 可选,指定分组,默认为DEFAULT_GROUP
3. 启用服务发现
在启动类上添加 @EnableDiscoveryClient
注解。
java
复制下载
less
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
启动应用后,即可在Nacos控制台的 "服务管理 -> 服务列表" 中看到注册的服务。
4.2 服务消费者发现与调用
服务消费者同样需要引入依赖和配置。然后可以通过两种方式调用:
1. 使用 @LoadBalanced RestTemplate
java
复制下载
less
@Configuration
public class AppConfig {
@Bean
@LoadBalanced // 开启负载均衡
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
@RestController
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/order/{userId}")
public String getUserInfo(@PathVariable String userId) {
// 直接使用服务名进行调用,而非IP地址
String url = "http://user-service/user/" + userId;
return restTemplate.getForObject(url, String.class);
}
}
2. 使用 OpenFeign
- 引入
spring-cloud-starter-openfeign
依赖。 - 在启动类上添加
@EnableFeignClients
。 - 编写Feign客户端接口。
java
复制下载
less
@FeignClient(name = "user-service") // 指定服务名
public interface UserClient {
@GetMapping("/user/{id}")
String getUserById(@PathVariable("id") Long id);
}
5. 配置管理功能使用
5.1 引入配置中心依赖
xml
复制下载运行
xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2022.0.0.0</version>
</dependency>
5.2 创建 bootstrap.yml
或 bootstrap.properties
Spring Cloud应用会优先加载 bootstrap
配置文件。
yaml
复制下载
yaml
spring:
application:
name: user-service # 应用名,用于构成Data ID
cloud:
nacos:
config:
server-addr: localhost:8848
namespace: dev-01 # 命名空间ID
group: DEFAULT_GROUP # 配置分组
file-extension: yaml # 配置格式,默认为properties
# 指定要加载的配置集,多个用逗号分隔
# 格式:${prefix}-${spring.profiles.active}.${file-extension}
# 如果没有激活的profile,则格式为:${prefix}.${file-extension}
# 默认会加载 Data ID 为 'user-service.yaml' 的配置
5.3 在Nacos控制台创建配置
-
进入 "配置管理 -> 配置列表" 。
-
点击 "+" 新建配置。
- Data ID :
user-service.yaml
(必须与bootstrap.yml
中约定的格式一致) - Group :
DEFAULT_GROUP
- 配置格式 :
YAML
- 配置内容:
yaml
复制下载
yamlserver: port: 8080 app: name: user-service version: v1.0 custom: config: "Hello, Nacos Config!"
- Data ID :
5.4 在应用中读取配置
使用 @Value
注解,并在类上添加 @RefreshScope
以实现配置动态刷新。
java
复制下载
less
@RestController
@RefreshScope
public class ConfigController {
@Value("${custom.config:defaultValue}")
private String configValue;
@GetMapping("/config")
public String getConfig() {
return configValue;
}
}
当你在Nacos控制台修改 custom.config
的值并发布后,应用会立即获取到新值,无需重启。
6. Nacos控制台主要功能
- 服务管理:查看、查询、删除服务,以及服务的健康状态和实例列表。
- 配置管理:创建、编辑、发布、删除、历史版本回滚、监听查询(查看哪些IP在监听该配置)。
- 命名空间:管理不同的环境或租户的隔离。
- 集群管理:查看Nacos服务器自身的集群状态。
7. 总结
Nacos作为一个集服务发现与配置管理于一体的平台,极大地简化了微服务架构的治理复杂度。其核心使用流程可以概括为:
-
部署:下载、安装并启动Nacos Server。
-
服务治理:
- 服务提供者通过
@EnableDiscoveryClient
注册。 - 服务消费者通过服务名(配合负载均衡)进行调用。
- 服务提供者通过
-
配置管理:
- 在
bootstrap.yml
中配置Nacos Config。 - 在控制台创建和管理配置。
- 在应用中使用
@Value
和@RefreshScope
实现动态配置。
- 在
通过结合控制台的图形化界面,Nacos提供了非常友好和强大的微服务治理能力。