Nacos简介
官网:https://nacos.io/zh-cn/
Nacos文档:https://nacos.io/zh-cn/docs/what-is-nacos.html
github地址:https://github.com/alibaba/nacos
安装运行
1.4.2版本下载:https://github.com/alibaba/nacos/releases/tag/1.4.2
Windows下载后打开目录

启动nacos
D:\nacos-server-1.4.2\nacos\bin>startup.cmd "nacos is starting with cluster"
,--. ,--.'| ,--,: : | Nacos 1.4.2 ,`--.'`| ' : ,---. Running in cluster mode, All function modules | : : | | ' ,'\ .--.--. Port: 8848 : | \ | : ,--.--. ,---. / / | / / ' Pid: 16400 | : ' '; | / \ / \. ; ,. :| : /`./ Console: http://192.168.26.1:8848/nacos/index.html ' ' ;. ;.--. .-. | / / '' | |: :| : ;_ | | | \ | \__\/: . .. ' / ' | .; : \ \ `. https://nacos.io ' : | ; .' ," .--.; |' ; :__| : | `----. \ | | '`--' / / ,. |' | '.'|\ \ / / /`--' / ' : | ; : .' \ : : `----' '--'. / ; |.' | , .-./\ \ / `--'---' '---' `--`---' `----'
|
如果启动报以下错误
java.io.IOException: java.lang.IllegalArgumentException: db.num is null
|
解决方案为修改startup.cmd,把set MODE="cluster"修改为set MODE="standalone"(默认集群启动,修改为单机启动)
命令运行成功后访问:http://localhost:8848/nacos
登陆账号密码为nacos/nacos

在父工程的pom.xml中添加如下依赖
<dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
|
完整父工程pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>com.springcloud</groupId> <artifactId>MyProject</artifactId> <version>1.0-SNAPSHOT</version>
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties>
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.2.2.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR1</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project>
|
服务提供者注册nacos
参考文档:https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html#_spring_cloud_alibaba_nacos_discovery
新建一个module,引入nacos依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
|
可以发现nacos默认集成了ribbon,默认支持负载均衡

完整pom.xml如下
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>MyProject</artifactId> <groupId>com.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion>
<artifactId>nacos-provider</artifactId>
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> </dependencies>
</project>
|
application.yml内容如下
server: port: 8081 spring: application: name: nacos-provider cloud: nacos: discovery: server-addr: localhost:8848 management: endpoints: web: exposure: include: '*'
|
启动类添加@EnableDiscoveryClient注解
@SpringBootApplication @EnableDiscoveryClient public class NacosProvider { public static void main(String[] args) { SpringApplication.run(NacosProvider.class,args); } }
|
controller内容如下
@RestController public class NacosProviderController {
@Value("${server.port}") private String serverPort;
@GetMapping(value = "/nacos/{id}") public String echo(@PathVariable("id") Integer id) { return "Hello Nacos Discovery " + id+",serverPort:"+serverPort; }
|
启动服务提供者,端口为:8081
在nacos服务列表中可以看到服务提供者已经注册进了nacos

测试controller,在浏览器访问:http://localhost:8081/nacos/1
页面输出如下:Hello Nacos Discovery 1,serverPort:8081
再新建一个module,内容和第一个一样,只是把端口改为:8082即可,来模拟负载均衡
服务消费者注册进nacos
新建module,引入nacos依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
|
application.yml内容如下,服务消费者端口为:8083
server: port: 8083 spring: application: name: nacos-consumer cloud: nacos: discovery: server-addr: localhost:8848
|
启动类
@SpringBootApplication @EnableDiscoveryClient public class NacosConsumer { public static void main(String[] args) { SpringApplication.run(NacosConsumer.class,args); } }
|
配置restTemplate
@Configuration public class ApplicationContextConfig {
@Bean @LoadBalanced public RestTemplate getRestTemplate(){ return new RestTemplate(); } }
|
写一个controller,去调用服务提供者的方法
@RestController public class NacosConsumerController {
@Resource private RestTemplate restTemplate;
private static final String SERVER_URL="http://nacos-provider";
@GetMapping(value = "/consumer/nacos/{id}") public String echo(@PathVariable("id") Long id) { return restTemplate.getForObject(SERVER_URL+"/nacos/"+id,String.class); }
}
|
测试服务消费者调用服务提供者的方法:
浏览器输入:http://localhost:8083/consumer/nacos/1
浏览器交替输出:Hello Nacos Discovery 1,serverPort:8081和Hello Nacos Discovery 1,serverPort:8082

nacos支持AP和CP模式切换
服务配置中心
新建module,引入配置依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
|
在resources目录下同时配置bootstrap.yml和application.yml,其中bootstrap.yml优先级高于application.yml
bootstrap.yml配置如下:端口为:3377
server: port: 3377 spring: application: name: nacos-conf-client cloud: nacos: discovery: server-addr: localhost:8848 config: server-addr: localhost:8848 file-extension: yaml
|
application.yml配置文件如下:
spring: profiles: active: dev
|
启动类
@SpringBootApplication @EnableDiscoveryClient public class NacosConf { public static void main(String[] args) { SpringApplication.run(NacosConf.class,args); } }
|
controller,其中@RefreshScope支持nacos的动态刷新功能
@RestController @RefreshScope public class ConfigClientController {
@Value("${config.info}") private String configInfo;
@GetMapping(value = "/config/info") public String echo() { return configInfo; } }
|
说明:之所以需要配置 spring.application.name ,是因为它是构成 Nacos 配置管理 dataId字段的一部分。
在 Nacos Spring Cloud 中,dataId 的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
|
prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
spring.profiles.active 即为当前环境对应的 profile。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。


测试:浏览器输入:http://localhost:3377/config/info
浏览器页面输出:config info for dev
此时如果修改nacos-dev-client.yaml的配置内容,浏览器内容也将即时刷新。
分组
Data Id 相同但Group不同时,使用group来区分

application.yml中添加spring.cloud.nacos.config.group指定组来区分
server: port: 3377 spring: application: name: nacos-conf-client cloud: nacos: discovery: server-addr: localhost:8848 config: server-addr: localhost:8848 file-extension: yaml group: TEST_GROUP
|
命名空间
新建命名空间

在服务列表中可以看到对应的命名空间ID

在application.yml中指定spring.cloud.nacos.config.namespace
server: port: 3377 spring: application: name: nacos-conf-client cloud: nacos: discovery: server-addr: localhost:8848 config: server-addr: localhost:8848 file-extension: yaml group: DEV_GROUP namespace: eef35622-7aa2-48ec-941f-1b51e2c7d0fb
|
nacos集群
参考文档:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
nacos默认自带的是嵌入式数据库derby
从derby切换到