4、基于nacos构建分布式配置中心

前言

本文是根据蚂蚁课堂余胜军老师的课程所作笔记,记录的要点,部分本身的理解可能有所误差,不当之处会进行修改。java

分布式配置中心产生的背景

若是生产环境正在运行的时候忽然须要修改配置文件的话,必须重启服务器。mysql

分布式配置中心就是使用专门的服务器统一存放管理咱们整个的微服务的配置文件,可以彻底动态实现对咱们配置文件修改、新增,是否须要重启咱们的服务器。nginx

分布式配置中心实现原理

  1. 本地应用读取云端分布式配置中心文件(第一次读取时创建长链接)
  2. 本地应用读取到配置文件后,本地jvm和硬盘都会缓存一份。
  3. 本地应用于分布式配置中心服务器端一直保持长链接
  4. 当咱们的配置文件发生变化(根据版本号|MID判断)。将变化结果通知本地应用及时刷新配置文件。

Nacos是将门户网站、配置中心、注册中心都部署在同一个应用中,就是一个单体的应用。git

本地应用读取Nacos配置中心

首先建立一个项目,依赖以下github

<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属于整个应用程序配置,最早被加载。web

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配置中心新建一个配置spring

Data ID要与项目的服务名一致。sql

在配置中心的配置文件中添加属性github.name,咱们在本地应用上获取并使用。数据库

@Value("${github.name}")
private String name;

@GetMapping("/config")
public String getConfig() {
    return name;
}

要在程序运行时可以动态修改配置文件,须要使用注解@RefreshScopebootstrap

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 #注册中心地址

实际上,只要将服务注册到集群上的一个节点,整个集群的节点都能获取到该服务