Spring Boot 中Nacos的用法及流程
1. 注册中心
注册中心的主要职责是管理微服务的服务注册与发现,用于实现各个服务之间的动态连接。注册中心帮助服务自动发现其他服务,无需硬编码服务地址。
-
功能:
- 服务注册:每个服务在启动时会将自己的网络地址(如 IP、端口)注册到注册中心。
- 服务发现:当一个服务需要调用其他服务时,可以向注册中心查询目标服务的网络位置。
- 健康检查:注册中心可以检测每个服务的健康状态。如果服务实例异常或宕机,注册中心会将其从服务列表中移除。
- 负载均衡支持:注册中心可以返回多实例服务的地址列表,帮助调用方进行负载均衡。
-
适用场景:微服务之间需要相互调用,或者服务实例可能会动态启动或销毁,注册中心便于实现服务的高可用性和弹性扩展。
-
常见实现:Nacos、Eureka、Consul、ZooKeeper 等都可以作为注册中心来管理微服务。
总结:注册中心的主要作用是管理服务的位置和状态,在服务间建立动态连接,是微服务架构中的“电话簿”。
2. 配置中心
配置中心的主要职责是管理应用程序的配置信息,为各个微服务提供统一的配置存储和管理,特别是在分布式系统中,多个服务往往需要共享或独立的配置项。
-
功能:
- 集中化管理配置:将系统中的所有配置文件集中存储和管理,方便统一更新。
- 动态配置更新:配置中心支持实时推送配置变更,使得应用在不重启的情况下更新配置。微服务可以根据配置变化立即调整。
- 多环境管理:配置中心通常支持多环境配置管理(如开发、测试、生产),避免不同环境的配置干扰。
- 配置的访问控制:配置中心可以设置权限控制,确保配置的安全性。
-
适用场景:配置中心适用于需要动态调整配置的场景,特别是配置项较多、配置变动频繁的分布式系统。
-
常见实现:Nacos、Spring Cloud Config、Apollo 等工具通常用于分布式系统的配置管理。
总结:配置中心的主要作用是管理应用的配置数据,在系统中提供动态、统一的配置管理,是微服务架构中的“配置仓库”。
3. 区别总结
特性 | 注册中心 | 配置中心 |
---|---|---|
主要职责 | 管理服务的注册与发现,提供服务地址 | 管理应用的配置信息 |
作用 | 让服务能够动态找到彼此 | 提供统一、动态的配置管理 |
典型功能 | 服务注册、服务发现、健康检查 | 配置存储、动态更新、多环境管理 |
适用场景 | 服务实例动态变化,服务间调用频繁 | 配置项较多且变动频繁 |
常见工具 | Nacos、Eureka、Consul、ZooKeeper | Nacos、Spring Cloud Config、Apollo |
简单来说:注册中心管理的是服务的位置和可用性,帮助服务找到彼此;配置中心管理的是服务的配置信息,帮助服务快速获得所需的配置信息并支持实时更新。两者在 Nacos 中都可以实现,但功能和用途不同。Nacos 最常见的功能可以总结为以下几条:
服务注册与发现:Nacos 作为注册中心,帮助微服务在启动时自动注册自身,并让其他服务能够动态发现和访问它,无需硬编码服务地址。
配置管理:Nacos 提供集中化的配置管理,支持多环境配置和动态更新。开发者可以在 Nacos 中统一管理配置,并在修改配置时实时推送到应用中,无需重启服务。
服务健康检查:Nacos 会定期检查服务实例的健康状态,当某个服务实例不可用时,Nacos 会自动将其从服务列表中移除,确保流量仅导向健康的实例。
多租户和多环境支持:Nacos 支持命名空间和分组功能,可以实现不同租户或不同环境(如开发、测试、生产)的隔离管理,确保配置和服务的独立性。
可视化管理控制台:Nacos 提供一个简单易用的 Web 界面,方便查看和管理服务实例、配置项,监控服务状态,使得运维更为便捷。
流程
配置中心
1. 引入依赖
在 Spring Boot 项目的 pom.xml
中引入 Nacos 配置中心的依赖包:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.5.RELEASE</version> <!-- 使用与 Spring Boot 和 Spring Cloud 兼容的版本 -->
</dependency>
2. 增加配置
为了保证 Nacos 配置优先加载,将 Nacos 配置相关信息放入 bootstrap.properties
或 bootstrap.yml
文件中。
bootstrap.properties
配置示例
# 注册中心的名字
spring.application.name=member
## 配置文件前缀(默认为 spring.application.name 的值)
#spring.cloud.nacos.config.prefix=member
## 启动环境,nacos会根据环境读不同的配置dataId:三者拼起来member-dev.properties
spring.profiles.active=dev(可设置prod在配置中心新建prod配置做多环境配置)
## nacos server地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
## 配置中心文件后缀,默认properties
spring.cloud.nacos.config.file-extension=properties
## nacos命名空间(可用来做环境隔离)
spring.cloud.nacos.config.namespace=train
# 配置分组(可选,默认为 DEFAULT_GROUP)
spring.cloud.nacos.config.group=DEFAULT_GROUP
3. 在 Nacos 中创建配置文件
-
登录 Nacos 控制台(默认地址为
http://localhost:8848/nacos
)。 -
在配置管理 -> 配置列表中,点击新增配置。
-
填写配置项:
-
Data ID:格式为
${prefix}.${file-extension}
(如member-dev.properties
)。 -
Group:填写为
DEFAULT_GROUP
,与bootstrap.properties
中的group
值保持一致。 -
配置内容:写入应用的具体配置内容,例如:
app.message=Hello from Nacos app.version=1.0.0
-
-
点击发布,完成配置的创建。
注意:如果使用了
spring.profiles.active
指定不同的环境(如dev
、prod
),在 Nacos 中可以创建多套配置文件,例如my-service-dev.properties
、my-service-prod.properties
,用于不同环境的配置。
4. 加上注解读取配置
在代码中通过 @Value
注解或 @ConfigurationProperties
注解来读取 Nacos 配置的值。
使用 @Value
注入单个配置项
在 Spring Boot 项目的业务代码中,通过 @Value
注解动态读取配置项:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ConfigController {
@Value("${app.message:Default Message}")
private String message;
@GetMapping("/message")
public String getMessage() {
return message;
}
}
@Value("${app.message:Default Message}")
从 Nacos 配置中读取app.message
的值,若没有找到,则使用默认值Default Message
。
使用 @RefreshScope
实现配置的动态刷新
为了支持配置的动态更新,可以在类上添加 @RefreshScope
注解。这样,当 Nacos 中的配置发生变化时,Spring Cloud 会自动刷新配置到应用中。
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RefreshScope
public class ConfigController {
@Value("${app.message:Default Message}")
private String message;
@GetMapping("/message")
public String getMessage() {
return message;
}
}
@RefreshScope
注解使当前 Bean 支持配置的动态刷新。当配置在 Nacos 中发生更改时,该 Bean 中的配置值会自动更新。
总结
- 引入依赖:在
pom.xml
中添加 Nacos 配置中心的依赖。 - 增加配置:将 Nacos 相关配置放在
bootstrap.properties
中,确保在应用启动时优先加载。 - 创建配置:在 Nacos 控制台中新增配置文件,并写入配置内容。
- 加上注解:使用
@Value
注解读取配置,使用@RefreshScope
注解实现配置的动态刷新。
注册中心配置
## nacos server注册中心地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.cloud.nacos.discovery.namespace=train