前言
本文是根据蚂蚁课堂余胜军老师的课程所做笔记,记录的要点,部分自己的理解可能有所偏差,不当之处会进行修改。
分布式配置中心产生的背景
如果生产环境正在运行的时候突然需要修改配置文件的话,必须重启服务器。
分布式配置中心就是使用专门的服务器统一存放管理我们整个的微服务的配置文件,能够完全动态实现对我们配置文件修改、新增,是否需要重启我们的服务器。
分布式配置中心实现原理
- 本地应用读取云端分布式配置中心文件(第一次读取时建立长连接)
- 本地应用读取到配置文件后,本地jvm和硬盘都会缓存一份。
- 本地应用于分布式配置中心服务器端一直保持长连接
- 当我们的配置文件发生变化(根据版本号|MID判断)。将变化结果通知本地应用及时刷新配置文件。
Nacos是将门户网站、配置中心、注册中心都部署在同一个应用中,就是一个单体的应用。
本地应用读取Nacos配置中心
首先创建一个项目,依赖如下
<parent>
<groupId>org.springframework.boot</groupId>
<version>2.0.0.RELEASE</version>
<artifactId>spring-boot-starter-parent</artifactId>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-config</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
</dependencies>
配置文件如下,要注意下面的配置文件不是在application中,而是在bootstrap.yml的配置文件中。bootstrap.yml属于整个应用程序配置,最先被加载。
spring:
cloud:
nacos:
discovery:
server-addr: 39.97.169.159:8848 #注册中心地址
config:
server-addr: 39.97.169.159:8848 #配置中心地址
group: DEFAULT_GROUP
file-extension: properties
application:
name: config-nacos #服务名
在Nacos配置中心新建一个配置
Data ID要与项目的服务名一致。
在配置中心的配置文件中添加属性github.name,我们在本地应用上获取并使用。
@Value("${github.name}")
private String name;
@GetMapping("/config")
public String getConfig() {
return name;
}
要在程序运行时能够动态修改配置文件,需要使用注解@RefreshScope
Nacos实现多环境配置
就像SpringBoot的多环境配置一样服务名-dev.yaml
或者服务名-prd.yaml
,只需要在本地指定激活的环境即可
profiles:
active: dev
Nacos配置集群
Nacos配置中心集群部署原理
nacos单机模式使用嵌入式数据库来实现数据的存储。也可以使用mysql数据源来存储。
需要初始化数据库,sql文件nacos-mysql.sql
集群,只需要用mysql数据源持久化存储数据,让多个nacos配置中心都访问mysql数据库即可。
Nacos配置中心持久化到数据库
在mysql中新建一个数据库nacos-config,执行上面的sql文件
在nacos的conf的配置文件application.properties中添加如下配置
spring.datasource.platform=mysql
# 数据库的数量以及url,根据情况配置
db.num=1
db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
#数据库的用户名
db.user=nacos_devtest
#数据库的密码
db.password=youdontknow
基于Nginx实现Nacos实现集群部署
这里是在一台服务器上进行的配置,准备三个Nacos,修改配置文件分别使用8848,8849,8850端口,数据库配置一致。
在nacos的conf目录下,创建cluster.conf配置文件,每行为ip:port。注意,ip为内网地址,不要为127.0.0.1,否则会报错
172.x.x.x:8848
172.x.x.x:8849
172.x.x.x:8850
启动nacos
sh startup.sh -p embedded
使用内置数据源
sh startup.sh
使用外置数据源,我们采用这种方式启动
若多个nacos启动失败,可能是内存不足的问题,修改启动脚本start.sh。可适当将-server后的jvm内存分配参数调小,系统默认的是:-server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m
#===========================================================================================
# JVM Configuration
#===========================================================================================
if [[ "${MODE}" == "standalone" ]]; then
JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"
JAVA_OPT="${JAVA_OPT} -Dnacos.standalone=true"
else
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/java_heapdump.hprof"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"
fi
配置nginx,修改nginx的conf目录下的nginx.conf配置文件
http {
...
#集群节点的地址
upstream nacoscluster {
server 127.0.0.1:8848;
server 127.0.0.1:8849;
server 127.0.0.1:8850;
}
server {
listen 80;
server_name localhost;
...
location /nacos/ {
proxy_pass http://nacoscluster/nacos/;
}
}
}
启动nginx后,直接访问nginx服务器地址+/nacos便可以访问集群.
登入管理页面,可以看到集群的节点列表
本地服务注册到nacos集群
直接将集群的地址配置在配置文件中即可
spring:
cloud:
nacos:
discovery:
server-addr: ip:8848,ip:8849,ip:8850 #注册中心地址
实际上,只要将服务注册到集群上的一个节点,整个集群的节点都能获取到该服务