分布式配置中心概念
配置中心产生背景:
在项目中定义配置文件,最大的缺陷?如果在生产环境正在运行的时候突然需要修改配置文件的话,必须重启我们的服务器。
使用专门的服务器统一存放管理我们整个的微服务的配置文件,能够完全动态实现对我们配置文件修改、新增,是不需要重启我们的服务器。
分布式配置中心可以实现不需要重启我们的服务器,动态的修改我们的配置文件内容。
常见的配置中心有携程的阿波罗(属于比较重的分布式配置)、SpringCloud Config、Nacos轻量级的配置中心、disconfig(百度的)等。
轻量级:部署架构设计原理都比较简单,学习成本也是比较低;
重量级:部署、架构设计、体量都是非常大,学习成本也高;
分布式配置中心实现原理
1.本地应用读取我们云端分布式配置中心文件(第一次建立长连接)
2.本地应用读取到配置文件之后,本地jvm和硬盘中都会缓存一份
3.本地应用与分布式配置中心服务端一直保持长连接
4.当我们的配置文件发生变化(MD5|版本号)实现区分,将变化结果通知给我们的本地应用及时的刷新我们的配置文件。完全百分之百动态化修改我们的配置文件。
如何判断配置文件是否发生改变:采用 版本、MD5
使用nacos作为配置中心
发布规则:
Dataid名称:默认的应用服务名称-版本.yml | properties
版本:dev、test、prd 等等。
使用规则:
1、引入 nacos 相关 maven 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>0.2.2.RELEASE</version>
</dependency>
2、在nacos服务端添加配置文件
3、springboot项目添加bootstrap.yml
文件指定nacos 配置
注意指定命名空间(默认public)、当前环境、组名、文件类型。
spring:
application:
name: kaico-member
profiles:
#指定环境(开发环境、生产环境)
active: dev
cloud:
nacos:
discovery:
###服务注册地址
server-addr: 127.0.0.1:8848
config:
###配置中心连接地址
server-addr: 127.0.0.1:8848
###分组
group: DEFAULT_GROUP
###类型
file-extension: properties
#指定命名空间
namespace: dev001
server:
port: 8081
4、代码使用配置的内容
@Value("${kaico.name}")
private String userName;
@RequestMapping("/getConfig")
public String getConfig() {
return userName;
}
项目启动后动态更新配置信息
启动类上增加注解:@RefreshScope
,就可以实现了。
实现多环境配置
首先根据命名规则新增不同环境的配置文件。
在项目中bootstrap.yml配置文件中spring.profiles.active=dev
指定环境名称即可。
持久化到数据库
默认的情况下,分布式配置中心的数据存放到本地data目录下,但是这种情况如果nacos集群的话无法保证数据的同步性。
在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:
1.安装数据库,版本要求:5.6.5+
2.初始化mysql数据库,数据库初始化文件:nacos-mysql.sql
3.修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root