跳到主要内容Spring Cloud Alibaba Nacos 使用详解 | 极客日志Javajava
Spring Cloud Alibaba Nacos 使用详解
综述由AI生成Nacos 是 Spring Cloud Alibaba 的核心组件,支持服务注册发现与配置管理。详细讲解了如何创建服务提供者与消费者、实现配置热更新、多环境隔离(命名空间与分组)、共享配置以及持久化与集群搭建方案。通过示例代码展示了从基础集成到高级配置的完整流程,帮助开发者快速掌握 Nacos 在企业级微服务架构中的应用。
HadoopMan7 浏览 Spring Cloud Alibaba Nacos 使用详解
本文详细介绍 Nacos 在 Spring Cloud Alibaba 中的使用,涵盖服务注册发现、配置管理及集群搭建等核心功能。
一、服务注册发现
整合 Spring Cloud Alibaba 的 Nacos 简单的很,直接启动 Alibaba 提供的 Nacos 服务即可,这样就能让程序员把更多的精力放在核心业务上。
以下是一个简单的架构图:

参考上面的架构图,需要创建两个模块,分别是 nacos-provider(服务提供者)、nacos-consumer(服务消费者)。
nacos-provider:注册进入 nacos-server,对外暴露服务
nacos-consumer:注册进入 nacos-server,调用 nacos-provider 的服务
1、nacos-provider 服务提供者创建
1. 添加 Maven 依赖
在 pom 文件中需要添加 spring-cloud-starter-alibaba-nacos-discovery 这个依赖,代码如下:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
这里没有指定版本是因为父模版指定了 spring-cloud-alibaba-dependencies 的版本,所以子模块直接引入依赖即可,因为这样能够更好地达到版本管理的效果。
2. 配置 YML 文件
server:
port: 9901
spring:
application:
name: nacos-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
3. 开启服务注册和发现功能
大部分 SpringBoot 引入了某些功能模块之后都要手动在启动类添加 @EnableXxxx 来开启某个功能,否则无法引入自动配置。这里开启服务注册发现功能的注解是:@EnableDiscoveryClient
@EnableDiscoveryClient
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
4. 编写接口
由于 nacos-provider 作为服务的提供者,肯定是需要提供服务的,这里编写一个接口来供消费者服务。
@RestController
@RequestMapping("/nacos")
public class TestController {
@GetMapping("/test")
public String test() {
return "调用了服务者提供服务接口";
}
}
5. 启动项目
启动项目就是在项目的启动类中启动。
启动完成之后,可以在 Nacos 中查看是否已经进行了服务的注册,可以看到 nacos-provider 已经成功注册到了 Nacos 中。
2、nacos-consumer 服务消费者创建
nacos-consumer 和 nacos-provider 步骤差不多。
1. 添加 Maven 依赖
在 nacos-consumer 服务的 pom 文件添加 spring-cloud-starter-alibaba-nacos-discovery
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
server:
port: 9902
spring:
application:
name: nacos-consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
service-url:
nacos-provider: http://nacos-provider
3. 开启服务注册和发现功能
使用 @EnableDiscoveryClient 注解来开启服务注册和发现功能
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
4. 调用 nacos-provider 的接口
首先创建一个 RestTemplate,将其注册到 IOC 容器中,然后添加 @LoadBalanced 注解来开启负载均衡。
开启负载均衡前需要添加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
public class AutoBeanConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
@RestController
public class ConsumerController {
@Resource
private RestTemplate restTemplate;
@Value("${service-url.nacos-provider}")
private String servicePrivadeUrl;
@GetMapping("/test")
public ResponseEntity<String> test() {
return restTemplate.getForEntity(servicePrivadeUrl + "/nacos/test", String.class);
}
}
注意:因为已经将 nacos-provider 注入到了 Nacos 中了,所以是可以直接通过服务名直接找到对应的服务的,而 servicePrivadeUrl 注入的就是服务名。
5. 启动项目
启动之后就能看到 Nacos 中已经有两个服务了。
然后进行接口的调用看看能不能调用成功,在浏览器中访问:http://localhost:9902/test,可以看到调用成功了。
总结:可以看到,Nacos 的服务注册和发现是如此的简单。还不需要自己搭建注册中心,直接提供好了。
二、配置管理
为什么需要配置管理呢?试想一下,如果你的一个线上项目想要修改某个配置,比如数据源变了,要添加新的数据源,这个时候修改完了应该怎么办?把项目停掉重启?显然是不合理的。
当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。
而 Nacos 一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。
1、添加配置文件
Data ID 是什么?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 类型。
注意:项目的核心配置,需要热更新的配置才有放到 nacos 管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。
2、拉取配置
创建一个模块,名叫 config-demo 父类为 ,来获取 Nacos 的配置内容。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
创建一个 bootstrap.yml 文件,该文件是用来设置 Nacos 的配置,该文件会在 application.yml 之前被读取。
spring:
application:
name: nacos-config
profiles:
active: dev
cloud:
nacos:
server-addr: localhost:8848
config:
file-extension: yaml
根据配置文件的内容,他会去 Nacos 中读取作为 nacos-config-dev.yaml 的 Data ID 里面的内容,也就是我们上面在 Nacos 中添加的。
在 application.yml 文件设置改模块的端口为 9903
3、读取配置
@RestController
public class NacosController {
@Value("${datas.version}")
private String version;
@GetMapping("/test")
public String test() {
return "这是在 Nacos 中添加的配置信息:version = " + version;
}
}
启动项目,访问 http://localhost:9903/test ,结果如下:
但是目前还不能动态刷新(热更新),也就是修改了 Nacos 中的配置信息,无需启动项目就能实时的读取新的配置信息。不相信?那你请看!
不启动,重新访问 http://localhost:9903/test
4、配置热更新
方式一:添加 @RefreshScope 注解
在 @Value 注入的变量所在类上添加注解 @RefreshScope。
重新启动项目,访问 http://localhost:9903/test。
再次访问 http://localhost:9903/test
方式二:使用@ConfigurationProperties 注解代替@Value 注解。
@Component
@Data
@ConfigurationProperties(prefix = "datas")
public class DatasProperties {
private String version;
}
然后再 controller 中使用这个类来代替@Value
重启应用,访问 http://localhost:9903/test
访问 http://localhost:9903/test
5、多环境共享
其实微服务启动时,会去 nacos 读取多个配置文件,例如:
[spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml
[spring.application.name].yaml,例如:userservice.yaml
而 [spring.application.name].yaml 不包含环境,因此可以被多个环境共享。
1)添加环境共享配置
我们首先在 nacos 中添加一个 nacos-config.yaml
2)读取环境共享配置
在 nacos-config 服务中修改 DatasProperties 类,读取新添加的属性内容:
3)运行两个 ConfigApplication
复制一个 nacos-config 服务,修改端口号为,修改 Active profiles,然后运行两个程序。
分别访问 http://localhost:9903/test 和 http://localhost:9904/test
可以看出来,不管是 dev,还是 test 环境,都读取到了 content 这个属性的值。
4)配置共享的优先级
三、多环境配置隔离
一般在业务开发的时候,至少会有三个环境,也就是开发(dev),测试(test),生产环境(prod)。
每个环境肯定配置是大部分是不一样的,所以说,怎么才能很好的在不同的环境使用不一样的配置呢?是的,Nacos 就能够很好的区分以上三种不同的配置。
那 Nacos 是如何区分的呢?答案就是 Namespace!
Namespace(命名空间):解决多环境及多租户数据的隔离问题 在多套不同的环境下,可以根据指定的环境创建不同的 Namespace,实现多环境的数据隔离。
1、命名空间的创建
创建完成之后,那应该怎么使用呢?怎么指定那个命名空间呢?答案就是:命名空间 ID
2、添加配置信息
3、读取不同环境下的配置信息
配置完毕,启动项目,访问 http://localhost:9903/test
四、业务配置隔离
在实际项目中,是有很多的微服务的,不同服务之间的配置是不一样的,那这个时候如果都创建在一起,那会显得非常的臃肿,难以区分,Nacos 针对这个问题是如何做的呢?
答案就是 Group,该单词大家都认识吧,也就是分组的意思。
Group:Nacos 中的一组配置集,是组织配置的维度之一,简单的说则是不同的系统或微服务的配置文件可以放在一个组里。Nacos 如果不指定 Group,则默认的分组是 DEFAULT_GROUP。
对于有多个微服务而言,比如订单系统,用户系统,针对这两个不同的微服务,可以将他们单独的分为一个组,订单系统分在 ORDER_GROUP、用户系统分在 USER_GROUP。
1、创建配置信息指定 Group 分组
在命名空间 dev 环境下创建一个配置信息,指定分组
2、读取 Group 的配置信息
配置完成,启动项目,访问 http://localhost:9903/test
五、Nacos 实现共享配置
共享配置,主要体现在随着项目中的微服务数量越来越多,而这些微服务多多少少都会有一些共同的配置,比如数据源信息啊。而这个时候我们就可以将这些共同的配置抽取出来,作为项目中共有的配置。
Nacos 就能很好的实现共享配置,接下来让我来带你一步一步地操作。
1、添加一个环境共享配置
注意:因为我们是在 public 命名空间下创建的共享配置,所以在微服务的配置文件中不指定 namespace 的值默认就是读取在 public 命名空间下的配置信息
2、读取共享配置
修改 nacos-config 的配置文件 bootstrap.yaml 的内容
这里就通过 @Value 注解来获取 Nacos 的配置内容
启动项目,访问 http://localhost:9903/test1
注意:如果共享配置信息放在了其他命名空间或者指定了分组,需要填写相应的 namespace 和 Group
六、Nacos 的持久化
Nacos 默认使用的是内嵌的数据库 Derby,如果想要更换数据库,比如 mysql,也是非常简单的。
首先在 MySQL 中创建一个数据库,名为 nacos_config(名字随意哈),然后执行 Nacos 提供的 SQL 脚本,在 Nacos 下载目录的 conf 文件夹下
在配置文件中取消 MySQL 数据源的注释,配置成自己的数据源即可
七、Nacos 集群的搭建
Nacos 推荐集群模式部署,这样可以避免单点故障,官方给出的 Nacos 的集群图:
其中包含 3 个 nacos 节点,然后一个负载均衡器代理 3 个 Nacos。这里负载均衡器可以使用 nginx。
那如何搭建集群呢?
首先进入到 conf 文件下,找到 cluster.conf.example 文件复制一份并修改名称为 cluster.conf 放到当前目录下
192.168.124.1:8847 192.168.124.1:8848 192.168.124.1:8849
192.168.124.1 就是你的服务器 IP,:后面的是 Nacos 的端口号。
然后分别修改两个个文件夹中的 application.properties
然后分别启动三个 nacos 节点,我这里先启动两个,来查看效果,双击 startup.cmd 文件
访问 http://localhost:8848/nacos,点击集群管理,可以看到
但是一般会使用 nginx 来进行反向代理,这里就不演示 nginx 的搭建了。
upstream nacos{
server 192.168.124.1:8847
server 192.168.124.1:8848
server 192.168.124.1:8849
}
server{
listen 80;
location /{
proxy_pass http://nacos;
}
}
你以为这样就完了?不,还没有完!
你既然搭建了集群,那肯定是要修改项目的 bootstrap.yaml 的
到目前为止,你已经掌握了 Nacos 的大部分知识了,该文章也告一段落了
拓展
Nacos 默认是 AP,但可以通过配置切换到 CP 模式。选择哪种模式取决于你的业务需求。如果对可用性要求更高,选择 AP;如果对数据一致性要求更高,选择 CP。
相关免费在线工具
- Keycode 信息
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
- Escape 与 Native 编解码
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
- JavaScript / HTML 格式化
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
- JavaScript 压缩与混淆
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online