Nacos使用手册
什么是Nacos?
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
概念
Namespace命名空间
命名空间用于用户进行组合粒度的配置隔离。在不同的命名空间下,可用存在相同的Group或Data ID的配置。Namespace的常用场景之一是不同环境配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
Data ID配置集
一个具体的可配置的参数与其值域,通常以key=value的形式存在,我们称为配置项。
一组相关或者不相关的配置项的集合称为配置集。
Group配置分组
Nacos 中的一组配置集,是组织配置的维度之一。
Nacos的配置管理
Nacos的服务管理
Java使用Nacos
- 引入nacos-client相关依赖
<dependencies>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-common</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-api</artifactId>
<version>2.2.2</version>
</dependency>
</dependencies>- 通过
NacosFactory获取配置服务ConfigService和命名服务NamingService。
private static final ConfigService configService;
static {
try {
configService = NacosFactory.createConfigService("127.0.0.1:8848");
} catch (NacosException e) {
throw new RuntimeException(e);
}
}
private static final NamingService namingService;
static {
try {
namingService = NacosFactory.createNamingService("127.0.0.1:8848");
} catch (NacosException e) {
throw new RuntimeException(e);
}
}- 使用配置服务
ConfigService的api
public class NacosConfig {
private static final ConfigService configService;
static {
try {
configService = NacosFactory.createConfigService("127.0.0.1:8848");
} catch (NacosException e) {
throw new RuntimeException(e);
}
}
//获取配置
public static String getConfig(String dataID, String groupID) throws NacosException {
return configService.getConfig(dataID, groupID, 5000);
}
//发布配置
public static void publishConfig(String dataID, String groupID, String content) throws NacosException {
boolean b = configService.publishConfig(dataID, groupID, content);
if (b) {
System.out.println("publish config success");
} else {
System.out.println("publish config fail");
}
}
//删除配置
public static void removeConfig(String dataID, String groupID) throws NacosException {
boolean b = configService.removeConfig(dataID, groupID);
if (b) {
System.out.println("remove config success");
} else {
System.out.println("remove config fail");
}
}
//添加配置监听器
public static void addConfigListener(String dataID, String groupID) throws NacosException {
configService.addListener(dataID, groupID, new Listener() {
@Override
public Executor getExecutor() {
return null;
}
@Override
public void receiveConfigInfo(String configInfo) {
System.out.println("收到配置更新:" + configInfo);
}
});
System.out.println("添加监听器");
}
//删除监听器
public static void removeConfigListener(String dataID, String groupID, Listener listener) throws NacosException {
configService.removeListener(dataID, groupID, listener);
System.out.println("移除监听器");
}
public static void main(String[] args) throws NacosException, IOException, InterruptedException {
String config;
config = getConfig("example", "DEFAULT_GROUP");
System.out.println(config);
publishConfig("example", "DEFAULT_GROUP", "useLocalCache=false");
config = getConfig("example", "DEFAULT_GROUP");
System.out.println(config);
addConfigListener("example", "DEFAULT_GROUP");
System.in.read();
removeConfig("example", "DEFAULT_GROUP");
}
}- 使用命名服务
NamingService的api
public class NacosNaming {
private static final NamingService namingService;
static {
try {
namingService = NacosFactory.createNamingService("127.0.0.1:8848");
} catch (NacosException e) {
throw new RuntimeException(e);
}
}
//注册服务实例
public static void registerInstance(String serviceName, String ip, int port) throws NacosException {
namingService.registerInstance(serviceName, ip, port);
}
//获取服务实例
public static List<Instance> getInstance(String serviceName) throws NacosException {
return namingService.getAllInstances(serviceName);
}
//注销服务实例
public static void deregisterInstance(String serviceName, String ip, int port) throws NacosException {
namingService.deregisterInstance(serviceName, ip, port);
}
public static void main(String[] args) throws NacosException, IOException {
registerInstance("test.service", "127.0.0.1", 8080);
List<Instance> instance = getInstance("test.service");
for (Instance i : instance) {
System.out.println("获取到实例:" + i);
}
System.in.read();
deregisterInstance("test.service", "127.0.0.1", 8080);
}
}Spring Boot使用Nacos
启动配置管理
- 引入spring-boot-starter依赖
<!--nacos配置管理-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>0.2.12</version>
</dependency>需要注意的是,版本 0.2.x.RELEASE 对应的是 Spring Boot 2.x 版本,版本 0.1.x.RELEASE 对应的是 Spring Boot 1.x 版本。目前还没有版本支持Springboot3.x版本。 2. 在applicaiton.properties文件中配置注册中心的地址
#nacos配置
nacos.config.server-addr=127.0.0.1:8848- 使用
@NacosPropertySource设置Nacos配置源,使用@NacosValue引用配置。
@RestController
@NacosPropertySource(dataId = "example", autoRefreshed = true)
public class NacosController {
@NacosValue(value = "${useLocalCache:false}", autoRefreshed = true)
private boolean useLocalCache;
@GetMapping("/nacos/useLocalCache")
public boolean get() {
System.out.println(useLocalCache);
return useLocalCache;
}
}启动服务发现
- 引入spring-boot-starter依赖
<!--nacos服务发现-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-discovery-spring-boot-starter</artifactId>
<version>0.2.12</version>
</dependency>- 在applicaiton.properties文件中配置注册中心的地址
nacos.discovery.server-addr=127.0.0.1:8848- 使用
@NacosInject注入NamingService,通过NamingService获取服务信息
@RestController
public class NacosController {
@NacosInjected
private NamingService namingService;
@GetMapping("/nacos/serviceInstance")
public List<Instance> getServiceInstance(@RequestParam String serviceName) throws NacosException {
return namingService.getAllInstances(serviceName);
}
}Spring Cloud使用Nacos
配置管理
- 引入nacos配置管理的Spring Cloud依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>- 在applicaiton.yml文件中,配置nacos服务器地址和应用名
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.file-extension=properties
spring.application.name=nacos-spring-cloud-study
spring.config.import=nacos:${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
server.port=8081
spring.profiles.active=dev
##对应的dataId为:nacos-spring-cloud-study-dev.properties在 Nacos Spring Cloud 中,dataId 的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}其中:
prefix:默认为spring.application.name的值,也可以通过spring.cloud.nacos.config.prefix来配置。spring.profiles.active:即当前环境对应的profile,当为空时,对应的连接符-也将不存在。file-extension:为配置内容的数据格式,目前只支持properties和yaml。
Spring Cloud Alibaba config 2021.0.1.0开始,nacos会校验spring.config.import是否配置nacos配置源,如没有配置启动时会报错。
properties
spring.cloud.nacos.config.file-extension=properties
spring.application.name=nacos-spring-cloud-study
spring.config.import=nacos:${spring.application.name}.${spring.cloud.nacos.config.file-extension}
server.port=8081
##对应的dataId为:nacos-spring-cloud-study.properties
服务发现
- 引入nacos服务发现的Spring Cloud依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>- 配置nacos服务信息
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.application.name=nacos-spring-cloud-study- 使用
@EnabledDiscoveryClient注解springboot启动类开启服务发现功能
@SpringBootApplication
@EnableDiscoveryClient
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
}- 注入服务发现客户端
DiscoveryClient,获取服务地址信息,通过restTemplate发起http请求。
@RestController
public class DiscoveryController {
@LoadBalanced
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
public DiscoveryController() {
restTemplate = new RestTemplate();
}
@GetMapping("/discoveryGetConfig")
public String discoveryGetConfig() {
ServiceInstance serviceInstance = discoveryClient.getInstances("nacos-spring-cloud-study").get(0);
String host = serviceInstance.getHost();
int port = serviceInstance.getPort();
return restTemplate.getForObject("http://" + host + ":" + port + "/getConfig", String.class);
}
}特性
Nacos Client会把配置文件快照存储于本地目录。应用启动时,如果无法从注册中心获取到配置,将会从本地快照中获取配置信息。 
Nacos Sync
Nacos Sync是一个注册中心同步工具,它可用实现注册中心数据从Nacos同步到Nacos、从Nacos同步到Zookeeper、从Zookeeper同步到Nacos等。