在系统开发过程中,开发者通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进行适配。配置管理一般包含在系统部署的过程中,由系统管理员或者运维人员完成。配置变更是调整系统运行时的行为的有效手段。
如果微服务架构中没有使用统一配置中心时,所存在的问题:
配置文件分散在各个项目里,不方便维护
配置内容安全与权限
更新配置后,项目需要重启
使用同一配置: 比如,多台服务器组成的集群,假如后端使用同一数据库,那么每台服务器都是用相同的配置。
使用不同的配置: 比如典型的场景是,开发,测试,生产使用相同的系统,但使用不同的数据库。
创建模块
选择配置中心组件
<dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>${spring-cloud-alibaba.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
建立 bootstrap.properties 配置文件, 这个文件在application.properties配置文件之前加载
配置文件中spring.application.name的值必须与Nacos创建的配置中Data Id匹配( Nacos配置文件的扩展名可以是.properties或者.yml)
# 应用名称
spring.application.name=sca-nacos-config
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos
spring.cloud.nacos.config.contextPath=/nacos
# 设置配置中心服务端地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# Nacos 配置中心的namespace。需要注意,如果使用 public 的 namcespace ,请不要填写这个值,直接留空即可
# spring.cloud.nacos.config.namespace=
package com.yuan.scanacosconfig.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @RefreshScope
* 当 配置中心的信息发生改变时, 取得信息自动变化
*/
@RefreshScope
@RestController
@RequestMapping("/testConfig")
public class ConfigController {
@Value("${test.msg}")
private String testProp;
@RequestMapping("/showProperties")
public String showProperties(){
return "配置信息是:" + this.testProp;
}
}
在 application.properties 配置文件中 加入
test.msg=local_msg
通过浏览器访问
直接 通过 浏览器 访问, 显示信息变成 配置中的内容
在使用配置中心时,我们会经常关注一个问题:如何实现多环境的配置管理,即在不同的场景下加载不同的配置文件。
Nacos为我们提供了三个管理级别的概念Data ID, Group, Namespace。
可以新建 配置
# 应用名称
spring.application.name=sca-nacos-config
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos
spring.cloud.nacos.config.contextPath=/nacos
# 设置配置中心服务端地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# Nacos 配置中心的namespace。这里可以 写命名空间的ID, 这里写的是test空间的ID
spring.cloud.nacos.config.namespace=de502140-986d-4605-90f3-f381254f4909
重启项目后, 再通过浏览器访问
可以通过 克隆的形式 在同一命名空间中 复制新的配置, 但 组名不同
# 应用名称
spring.application.name=sca-nacos-config
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos
spring.cloud.nacos.config.contextPath=/nacos
# 设置配置中心服务端地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# Nacos 配置中心的namespace。这里可以 写命名空间的ID, 这里写的是test空间的ID
spring.cloud.nacos.config.namespace=de502140-986d-4605-90f3-f381254f4909
# 增加分组信息 分组 与 配置中心的 组名对应上
spring.cloud.nacos.config.group=NEW_GROUP
重启项目后, 再通过浏览器访问
分别对应:
datasource.yml
# 数据库驱动:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
# 数据源名称
name: defaultDataSource
# 数据库连接地址
url: jdbc:mysql://localhost:3306/manymanygood?serverTimezone=UTC
# 数据库用户名&密码:
username: root
password: root
nacosdiscovery.yml
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
spring:
cloud:
nacos:
discovery:
username: nacos
password: nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
server-addr: 127.0.0.1:8848
# 注册到 nacos 的指定 namespace,默认为 public
namespace: public
other.yml
# 应用名称
spring:
application:
name: sca-nacos-config
# 应用服务 WEB 访问端口
server:
port: 8080
#自定义信息
test:
msg: new_new_msg
并删除 原来 的application.properties 对应的内容
增加
spring.cloud.nacos.config.extension-configs[0].data-id=datasource.yml
spring.cloud.nacos.config.extension-configs[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.extension-configs[0].refresh=true
spring.cloud.nacos.config.extension-configs[1].data-id=nacosdiscovery.yml
spring.cloud.nacos.config.extension-configs[1].group=DEFAULT_GROUP
spring.cloud.nacos.config.extension-configs[1].refresh=true
spring.cloud.nacos.config.extension-configs[2].data-id=other.yml
spring.cloud.nacos.config.extension-configs[2].group=DEFAULT_GROUP
spring.cloud.nacos.config.extension-configs[2].refresh=true
重启项目后, 再通过浏览器访问
logging.level.com.alibaba.nacos.client.naming=error
spring:
application:
name: renren-fast
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
namespace: 10000
extension-configs[0]:
data-id: common-redis.properties
group: DEFAULT_GROUP
refresh: true
logging:
level:
com:
alibaba:
nacos:
client:
naming: error