Nacos是阿里巴巴开源的动态服务发现、配置管理和服务治理平台,专为微服务架构设计。其核心功能包括服务注册与发现、动态配置管理、服务元数据管理及流量控制,支持多种协议和灵活的部署模式。
官网:nacos.io
GitHub:github.com/alibaba/nacos
文档:最新版文档
Hyplus目录
1 Nacos概述
Nacos通过一站式服务治理能力简化了微服务架构的开发与运维。核心功能包括服务注册与发现、动态配置管理,支持命名空间隔离、元数据管理及灰度发布等高级特性。通过合理配置安全策略(如鉴权、加密)和灵活使用负载均衡机制,可构建高可用、易扩展的分布式系统。开发时需注意版本兼容性(如Spring Boot 3.x需搭配Nacos 2.2.x),并遵循官方最佳实践以确保稳定性。
2 核心概念
- 服务注册与服务发现:服务提供者启动时向Nacos注册自身地址、端口等信息,消费者通过Nacos获取服务列表并动态调用。Nacos支持健康检查机制,自动剔除不可用实例。
- 动态配置管理:配置以键值对形式存储在Nacos控制台,支持多环境隔离(命名空间)和版本管理。客户端可实时监听配置变更并自动刷新。
- 命名空间与分组:命名空间用于隔离不同环境(如开发、生产)的配置和服务,分组用于区分不同业务线或团队的资源,增强管理灵活性。
2 安装与部署
- 依赖环境:需安装JDK 1.8+和Maven 3.2.x+。
- 下载与启动:
- 下载Nacos最新稳定版(如2.2.0),解压后进入
bin
目录。 - 单机模式启动:
sh startup.sh -m standalone
(Linux/Mac)或startup.cmd -m standalone
(Windows)。 - 控制台访问:
http://localhost:8848/nacos
,默认账号密码为nacos/nacos
。
- 下载Nacos最新稳定版(如2.2.0),解压后进入
- 持久化配置:修改
conf/application.properties
,配置MySQL数据源以实现数据持久化。
3 服务注册与发现
3.1 服务提供者
- 添加依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 配置文件(
application.yml
):
spring:
application:
name: service-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848
- 启动类添加注解:
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
- 提供REST接口:
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello from Nacos!";
}
}
3.2 服务消费者
- 添加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
- 配置文件(
application.yml
):
spring:
application:
name: service-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
- 使用
RestTemplate
调用:
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/call")
public String call() {
return restTemplate.getForObject("http://service-provider/hello", String.class);
}
}
- 注册
RestTemplate
:
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
4 动态配置管理
4.1 配置中心使用
- 添加依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- 配置文件(
bootstrap.yml
):
spring:
application:
name: config-client
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yaml
- 在Nacos控制台创建配置:
- Data ID:
config-client.yaml
- 内容:
- Data ID:
server:
port: 8081
custom:
message: "Hello from Nacos Config"
4.2 动态刷新配置
- 使用
@Value
注入配置:
@RestController
@RefreshScope
public class ConfigController {
@Value("${custom.message}")
private String message;
@GetMapping("/config")
public String getConfig() {
return message;
}
}
- 修改Nacos配置后,接口返回值自动更新。
5 安全配置
- 开启鉴权:修改
application.properties
,设置nacos.core.auth.enabled=true
,并配置自定义密钥nacos.core.auth.plugin.nacos.token.secret.key
。 - 修改默认密码:在控制台“权限管理”中更新管理员账号密码。
- 传输加密:启用TLS加密,配置
server.ssl.key-store
和server.ssl.key-store-password
。 - 网络隔离:生产环境中Nacos应部署在内网,避免直接暴露公网。
6 高级特性
6.1 服务元数据管理
- 设置元数据:在服务注册时添加自定义信息,如版本号、权重:
@Bean
public NacosDiscoveryProperties nacosDiscoveryProperties() {
NacosDiscoveryProperties properties = new NacosDiscoveryProperties();
properties.setMetadata(Collections.singletonMap("version", "v1.0"));
return properties;
}
- 读取元数据:通过
DiscoveryClient
获取实例信息:
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/metadata")
public String getMetadata() {
List<ServiceInstance> instances = discoveryClient.getInstances("service-provider");
return instances.get(0).getMetadata().get("version");
}
6.2 灰度发布
- 设置实例标签:在服务注册时添加标签(如
version: v2
)。 - 自定义负载均衡策略:
@Configuration
public class GrayLoadBalancerConfig {
@Bean
public ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment,
LoadBalancerClientFactory loadBalancerClientFactory) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
return new GrayLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class));
}
}
- 根据标签路由,在消费者端通过请求头或参数筛选实例。