在使用nacos的时候我们有用过nacos作为配置中心,也就是在nacos上创建的yml配置文件。
会发现关闭nacos然后后面再次启动nacos时,这些yml配置信息并没有消失。
为什么yml配置信息没有消失?
原因在于nacos带有一个嵌入式的小型数据库derby,哪些配置信息都被持久化到derby数据库中。因此当nacos启动的时候就会将持久化的数据再次读取出来。
derby存的数据路径在
由此引发思考,如果要做nacos的集群,那么首要的目的就是这些持久化数据在每一台nacos实例上都要一致。
而nacos每一台实例启动的时候就会使用derby作为数据源(相当于是本地的数据源
),因此每一台nacos实例的持久化数据是不一样的!
也就是说要想做nacos集群,得将数据源提取出来(相当于是远程的数据源
)到MySQL(目前只支持MySQL
),所有nacos实例使用得数据源都是同一个数据源!
解决方案 第一步、使用MySQL替代derby作为数据源
第1步、在MySQL上创建对应的表
首先创建一个数据库名字可以自定义例如nacos_config
然后在conf目录下找到执行sql脚本nacos-mysql.sql就是
执行完成后检查一下数据库是否创建成功了
第2步、修改nacos的conf/application.properties
文件
因为nacos也是用java编写的springboot项目,因此修改application.properties将数据源配置为MySQL作为数据源
和以前MySQL配置差不多要填用户名、密码、数据库链接的URL、使用的数据源驱动
spring.datasource.platform=mysql
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=123456
然后保存,启动nacos即可,依此启动多个nacos实例即可,因为数据源是一致的(最后MySQL也做集群),所以就不用担心数据不一致。
引发第二个问题:不同实例的nacos他们的主机ip不同,如何让我们的微服务使用nacos作为配置中心和注册中心?难不成填多个nacos地址?
nacos官网推荐的方式是:
其中VIP指的是虚拟ip,全称Virtual ip
我们可以怎么理解这张图呢?
一种方式是让3台nacos使用keepalived进行争抢虚拟ip(这种方式我认为不能充分利用服务器,推荐使用下面一种)
个人比较推荐的方式:
使用nginx进行代理,nginx我们可以做集群,然后通过域名访问nginx集群,然后nginx代理多台nacos实例进行流量分发,我们可以可以使用负载均衡算法(轮询、权重、最快响应时间等)进行负载均衡。
第二步、添加nacos集群节点地址到配置文件中
将 conf下的新建一个cluster.conf
并且填入nacos的地址
ip:端口
这里就以一台服务器ip为192.168.117.210 不同端口模拟集群
192.168.117.210:8847
192.168.117.210:8848
192.168.117.210:8849
第三步、修改启动脚步,添加端口参数选项
nacos本质是springboot项目,所以端口信息以及启动配置文件都在conf下的application.properties
文件中定义的server.port定义服务器端口(可以直接修改源文件中的server.port值)然后运行启动脚本
可以通过-Dserver.port=8847来依次启动jar
vim ./startup.sh
./startup.sh -P 8847
./startup.sh -P 8848
./startup.sh -P 8849