19.SpringCloud整合Nacos配置中心
1. Nacos
Nacos 作为分布式微服务架构体系中的一个优秀组件,可以替代Eureka做服务注册中心,可以替代Config做服务配置中心。让微服务的发现、管理、共享、组合更加容易。Nacos = Eureka + Config + bus Nacos作为服务注册中心使用参看: SpringCloud整合Nacos服务注册与发现
Nacos作为服务配置中心:Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config,可以在 Nacos Server 集中管理 Spring Cloud 应用的外部属性配置。
2. Nacos 服务端初始化
下载并启动好Nacos Server。启动方式参看 Nacos简介、安装、运行详解。接下来在 Nacos 的控制台新增一个dataId为yaml为扩展名的配置,如下所示:
注意📢:dataId是以 properties(默认的文件扩展名方式)为扩展名,也可以支持yaml。
3. Nacos客户端配置
3.1 添加依赖
父pom中引入spring-cloud-alibaba-dependencies
依赖后,子pom中引入spring-cloud-starter-alibaba-nacos-config
依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
注意:如果想使用bootstrap文件配置,springboot2.4以后的版本需要添加spring-cloud-starter-bootstrap依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
3.2 启动类
@SpringBootApplication
@ComponentScan(basePackages = {"com.qytest"})
@MapperScan(basePackages = {"com.qytest.**.dao"})
@EnableDiscoveryClient
public class CloudPayment {
public static void main(String[] args) {
SpringApplication.run(CloudPayment.class, args);
}
}
Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能,作为配置中心时不加也可以。
3.3 yml配置
在日常开发中如果遇到多套环境下的不同配置,可以通过Spring 提供的 ${spring.profiles.active} 这个配置项来配置。所以这里我们使用多环境配置文件。
bootstrap.yml(用来指定激活的环境)
spring:
profiles:
active: dev
bootstrap-dev.yml(注意层级关系)
server:
port: 8001
spring:
application:
name: cloud-payment #微服务应用的名字
datasource:
type: com.alibaba.druid.pool.DruidDataSource #当前数据源操作类型
driver-class-name: com.mysql.jdbc.Driver #mysql驱动包
url: jdbc:mysql://localhost:3306/test?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false #useSSL安全加固
username: root
password: 12345678
cloud:
nacos:
discovery:
# 配置 nacos 的服务地址
server-addr: http://localhost:8848
config:
## nacos 作为配置中心地址
server-addr: ${spring.cloud.nacos.discovery.server-addr}
## 指定yaml格式的配置,默认为:properties
file-extension: yaml
## 分组 默认为:DEFAULT_GROUP
## group: DEFAULT_GROUP
## 命名空间 默认为 public
## namespace: public
management:
endpoints:
web:
exposure:
include: '*'
mybatis-plus:
mapper-locations: classpath*:mapper/**/*.xml
#实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.qytest.springcloud.entitites
dataid 规则 : $ {prefix}-$ {spring.profiles.active}.$ {file-extension} $ {spring.application.name}-$ {spring.profiles.active}.${file-extension} 所以本例中应该去nacos拉取dataid为cloud-payment-dev.yaml的配置。也就是开头Nacos 服务端初始化我们创建的配置。
注意📢:当使用域名的方式来访问 Nacos 时,spring.cloud.nacos.config.server-addr 配置的方式为 域名:port。 例如 Nacos 的域名为abc.com.nacos,监听的端口为 80,则 spring.cloud.nacos.config.server-addr=abc.com.nacos:80。 注意 80 端口不能省略。
3.4 测试
编写简单的业务类ConfigController.java,添加自动刷新注解@RefreshScope
,
@RestController
@RefreshScope
public class ConfigController {
//从nacos读取配置文件中内容
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public CommonResult<String> getConfigInfo() {
return new CommonResult<>(200, "success", configInfo);
}
}
Spring Cloud 原生注解 @RefreshScope 实现配置自动更新。再学习SpringCloud Config配置中心时提到过这个注解。
访问http://localhost:8001/config/info 成功读取到nacos界面配置的文件中的内容。
Nacos支持配置的动态更新。也可以通过配置 spring.cloud.nacos.config.refresh.enabled=false 来关闭动态刷新
4. 自定义配置
4.1 自定义Namespace(默认Public)
关于Nacos 的 Namespace 用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。默认使用的是 Nacos 上 Public 这个namespace。
如果需要使用自定义的命名空间,可以通过以下配置来实现:
spring:
cloud:
nacos:
config:
namespace: cca3ee80-0eb9-4813-9284-55b975ef2640
4.2 自定义 Group 配置(默认DEFAULT_GROUP)
cloud:
nacos:
discovery:
config:
group: MY_GROUP
4.3 自定义扩展的 Data Id 配置
Spring Cloud Alibaba Nacos Config 从 0.2.1 版本后,可支持自定义 Data Id 的配置。 通过自定义扩展的 Data Id 配置,既可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件。
Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置。
- A: 通过 spring.cloud.nacos.config.shared-configs[n].data-id 支持多个共享 Data Id 的配置
- B: 通过 spring.cloud.nacos.config.extension-configs[n].data-id 的方式支持多个扩展 Data Id 的配置
- C: 通过内部相关规则(应用名、应用名+ Profile )自动生成相关的 Data Id 配置
当三种方式共同使用时,他们的一个优先级关系是:A < B < C