一、前言
英文全称为Naming Configuration Service,缩写为Nacos。官方给的定义是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。我们可以更通俗的理解为服务注册中心加配置中心。它在分布式架构中作用相当于之前的Eureka + Config 。替代了Eureka做注册中心,替换了Config做配置中心。
本文内容为Nacos的安装和其作为分布式项目中注册中心和配置中心的基本运用。
二、环境准备
1.基础环境
PS:Demo演示以本地Windows系统为例,确保本地Maven和Java 8以上环境OK;
案例环境:
- JDK: 8
- spring-boot-dependencies:2.2.2.RELEASE
- spring-cloud-alibaba-dependencies:2.1.0.RELEASE
- Nacos-server:1.3.2
更多的版本对应关系,请参考官方文档给出的说明:版本说明
2.Nacos控制台安装运行
Nacos官网中文地址:https://nacos.io/zh-cn/
在使用Nacos之前,需要先安装Nacos控制台,控制台下载地址:https://github.com/alibaba/nacos/
根据需要选择合适的版本进行下载。
Nacos控制台目前提供两种启动方式:
- standalone 此模式一般用于 demo 和测试,不用改任何配置
- cluster 此模式一般用于生产环境
在此,由于是进行Demo演示,采取较为简单的standalone模式。
启动步骤
-
下载window系统所需版本的ZIP文件(点击上图中版本对应的ZIP图标即可下载)
-
解压ZIP文件,目录如下:
-
进入bin目录,在当前目录打开黑窗口,执行 startup.cmd -m standalone (-m standalone 表示以单机模式运行)
- 启动成功画面
官网链接下载较慢,如需要,可前往百度网盘下载V1.3.2版本ZIP文件:
链接:https://pan.baidu.com/s/1lc0j3R-SScN7j1nxL9oj0A
提取码:35ly
- 在浏览器中输入http://localhost:8848/nacos
用户名:nacos
密码:nacos
- 登录成功界面如下
3.工程目录模型
三、Nacos作为注册中心的基本运用
Nacos注册中心功能,通过server-consumer和server-provider两个工程完成演示。
- server-provide:服务提供者
- server-consumer:服务消费者
-
将server-provide和server-consumer注册到Nacos-server,即Nacos控制台;
-
服务消费者server-consumer通过主动轮询调用server-provide服务接口;
1.父工程搭建
创建名为Nacos-demo的父工程,对整个项目Maven版本进行管理
父工程POM文件
<?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>org.xupeng</groupId>
<artifactId>nacos</artifactId>
<version>1.0-SNAPSHOT</version>
<!--子模块-->
<modules>
<module>server-consumer</module>
<module>server-provider</module>
<module>config</module>
</modules>
<!-- 统一管理版本管理 -->
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<springboot.version>2.2.2.RELEASE</springboot.version>
<springcloud.alibaba.version>2.1.0.RELEASE</springcloud.alibaba.version>
</properties>
<!-- 作用:锁定版本 子module不用写groupId和version -->
<dependencyManagement>
<dependencies>
<!--spring boot 2.2.2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${springboot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--Spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${springcloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.服务提供者(server-provider)
创建名为server-provider的子工程
(1)、POM文件内容
<?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>
<parent>
<groupId>org.xupeng</groupId>
<artifactId>nacos</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>server-provider</artifactId>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
(2)、配置文件内容(YML格式文件)
server:
port: 9002 #应用访问端口
spring:
application:
name: SERVER-PROVIDER #应用名称
cloud: #Nacos控制台地址,根据自己的地址和端口进行修改
nacos:
discovery:
server-addr: localhost:8848
(3)、主启动类上添加
@EnableDiscoveryClient //让注册中心发现,扫描到该服务
@SpringBootApplication
@RestController
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@GetMapping("/hello")
public String helloNacos(){
return "Hello,Nacos!";
}
}
服务提供者工程创建完毕。
3.服务消费者(server-comsumer)
创建名为server-comsumer的子工程
(1)、POM文件内容
<?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>
<parent>
<groupId>org.xupeng</groupId>
<artifactId>nacos</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>server-consumer</artifactId>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
(2)、配置文件内容(YML格式文件)
server:
port: 9001
spring:
application:
name: SERVER-CONSUMER
cloud:
nacos:
discovery:
server-addr: localhost:8848
(3)、主启动类
@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class NacosConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
}
@Autowired
private RestTemplate restTemplate;
/**
* 注入RestTemplate调用server-provider服务;
* LoadBalanced注解表示如果被调用的服务有多个节点,则默认采用轮询调用,实现负载均衡。
*/
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
@GetMapping("/consumer")
public String test()
//url拼写规则: 传输协议://服务名/访问路径
return restTemplate.getForObject("http://nacos-provide/hello",String.class);
}
}
服务消费者创建完成。
4.测试
-
启动server-provider和server-consumer,端口分别为9002和9001;
-
现在登录Nacos控制台,在服务列表中会显示这两个服务,控制台可以对其进行监控和管理;
-
浏览器中访问服务消费者的接口 , 可以看到成功返回结果;
Hello,Nacos!
四、Nacos作为配置中心的基本运用
在父工程下创建名为config的工程
1.配置中心运用的基本演示
(1)、POM文件内容
<?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>
<parent>
<groupId>org.xupeng</groupId>
<artifactId>Nacos-demo</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>server-consumer</artifactId>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
(2)、配置文件内容(bootstrap.yml文件)
需要注意的是这里的文件名称必须是bootstrap.×××文件。
server:
port: 9100
spring:
application:
name: nacos-config #服务名称
cloud:
nacos:
config:
server-addr: localhost:8848 #服务配置中心地址
prefix: ${spring.application.name} #对应配置文件前缀,不配置默认为服务名称
file-extension: yml #指定配置中心中对应的配置文件的格式
(3)、主启动类
@SpringBootApplication
@RestController
@RefreshScope //可以使当前类下的配置支持动态更新
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
/**
* 其中通过@Value注解,去读取配置中心对应的配置文件中为nacos.info的值,并通过/getInfo接口返回。
*/
@Value("${nacos.info}")
private String info;
@RequestMapping("/getInfo")
public String getValue() {
return info;
}
}
(4)、新建配置
在Nacos-server配置管理->配置列表中新建配置
点击右上方 “+” 按钮,进入如下页面:
- Data ID
-
定义规则: {prefix}-{spring.profile.active}.{file-extension};当spring.profile.active 为空时,定义规则为{prefix}.{file-extension};
-
prefix 默认为
spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置; -
file-exetension 为配置内容的数据格式,可以通过配置项
spring.cloud.nacos.config.file-extension
来配置。此案例没有配置spring.profile.active ,因此Data-Id为:nacos-config.yml
-
Group
可自定义Group
先采用默认的
DEFAULT_GROUP
-
配置格式
目前仅支持yml和properties两种格式,此案例采用yml
-
文件内容
nacos:
info: Hello Nacos Config!
以上的每一项,在工程的bootstrap.yml配置文件中都有与其对应的配置:
server:
port:
spring:
application:
name: #服务名称
cloud:
nacos:
config:
server-addr: #服务配置中心地址
prefix: #对应配置文件前缀,不配置默认为服务名称
file-extension: #指定配置中心中对应的配置文件格式
namespace: #命名空间ID
group: #命名空间下的组名称
(5)、测试
-
保证Nacos控制台启动成功
-
检查配置文件内容,搞清楚每一项配置的作用
-
启动config项目
-
调用接口进行测试 http://localhost:9100/getInfo,可以看到如下返回结果
Hello Nacos Config!
-
说明成功读取到配置文件内容,接着修改控制台配置文件内容,测试是否能够动态刷新
-
调用 http://localhost:9100/getInfo接口,返回如下结果,表明动态刷新成功。
Hello!
2.profile粒度的配置
- 在日常开发中如果遇到多套环境下的不同配置,可以通过Spring 提供的
${spring.profiles.active}
这个配置项来配置。
server:
port: 9100
spring:
application:
name: nacos-config #服务名称
profiles:
active: dev
cloud:
nacos:
config:
server-addr: localhost:8848 #服务配置中心地址
prefix: ${spring.application.name} #配置中心对应配置文件前缀
file-extension: yml #指定配置中心中对应的配置文件的格式
- 上图配置了&{spring.profiles.active}=dev,则DataId为nacos-config-dev.yml
-
重启nacos-config,访问 http://localhost:9100/getInfo,返回如下结果:
pro_dev
2.自定义命名空间(Namespace)
命名空间用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
在bootstarp.×××文件没有指定 ${spring.cloud.nacos.config.namespace}
配置的情况下, 默认使用的是 Nacos 上 Public 这个namespae。如果需要使用自定义的命名空间,可以通过如下方式实现:
-
在Nacos server新建命名空间
-
查看命名空间列表
-
将命名空间ID配置到config-server项目中的bootstarp.×××文件中
server: port: 9100 spring: application: name: nacos-config #服务名称 cloud: nacos: discovery: server-addr: localhost:8848 #服务注册中心地址 config: server-addr: localhost:8848 #服务配置中心地址 prefix: ${spring.application.name} #对应配置文件前缀,不配置默认为服务名称 file-extension: yml #指定配置中心中对应的配置文件的格式 namespace: 7f7b095b-b388-49f2-ab3d-133bc73493b0 #DEV命名空间ID
-
在Nacos-server配置管理列表DEV命名空间下新建配置
-
新建配置文件内容如下:
-
重启nacos-config,访问 http://localhost:9100/getInfo,返回如下结果:
Hello DEV!
3.自定义Group
在同一个group下,配置文件名不能重复,所以当需要创建文件名称相同的两个配置文件时,将两个配置文件创建在不同的group下即可。当我们再同一个group下创建一个已有的配置文件时,nacos会将其视为配置文件的修改,而不是新建。
-
在Nacos-server上DEV命名空间下新建配置,填写自定义的Group名称,直接输入即可。本案例中自定义组名称为MYSELF_GROUP。
-
查看配置列表
-
在nacos-config工程中添加自定义group信息
server: port: 9100 spring: application: name: nacos-config #服务名称 cloud: nacos: discovery: server-addr: localhost:8848 #服务注册中心地址 config: server-addr: localhost:8848 #服务配置中心地址 prefix: ${spring.application.name} #对应配置文件前缀,不配置默认为服务名称 file-extension: yml #指定配置中心中对应的配置文件的格式 namespace: 7f7b095b-b388-49f2-ab3d-133bc73493b0 #DEV命名空间ID group: MYSELF_GROUP #DEV命名空间下的MYSELF_GROUP
-
重启nacos-config,访问 http://localhost:9100/getInfo,返回如下结果:
DEV myself_group