将数据存储切换为mysql
默认Nacos使用嵌入式数据库derby实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。
为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储。
在nacos安装目录下的conf/
文件夹下有一个nacos-mysql.sql
文件,使用mysql执行该sql文件,如果没有建database可以先新建database:
create database nacos_config;
use nacos_config;
执行成功之后可以看到下面这些表:

然后修改conf/application.properties
,添加mysql相关配置:
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
重启nacos,进入控制页面可以看到数据全部没了。。
集群部署
如果更改完了数据存储到mysql就可以开始部署集群了,这里还是搭建伪集群,但是会很麻烦,有机器条件的可以直接尝试真刀实枪上集群……
首先让nacos能指定端口启动
修改bin/startup.sh
中的下面两个地方:
#################添加p:(即可以带-p参数)
57 while getopts ":m:f:s:p:" opt
58 do
59 case opt in
60 m)
61 MODE=OPTARG;;
62 f)
63 FUNCTION_MODE=OPTARG;;
64 s)
65 SERVER=OPTARG;;
################添加下面两行
66 p)
67 PORT=$OPTARG;;
83 if [[ "{MODE}" == "standalone" ]]; then
84 JAVA_OPT="{JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"
85 JAVA_OPT="{JAVA_OPT} -Dnacos.standalone=true"
### 集群模式添加jvm启动参数
86 else
87 JAVA_OPT="{JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
88 JAVA_OPT="{JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath={BASE_DIR }/logs/java_heapdump.hprof"
89 JAVA_OPT="{JAVA_OPT} -XX:-UseLargePages"
### 添加这一行
90 JAVA_OPT="{JAVA_OPT} -DServer.port=${PORT}"
91 fi
修改集群配置文件
将conf/cluster.conf.example
复制出来:
cp cluster.conf.example cluster.conf
然后修改cluster.conf
文件,添加下面这几行,注意ip不能填写127.0.0.1,必须是hostname -i
显示的ip(因为内部raft是通过网卡ip进行通信的)
192.168.91.1:3333
192.168.91.1:4444
192.168.91.1:5555
使用nginx做负载均衡
nginx.conf添加以下配置:
upstream cluster{
server 127.0.0.1:3333;
server 127.0.0.1:4444;
server 127.0.0.1:5555;
}
server{
listen 1111;
server_name localhost;
location / {
proxy_pass http://cluster;
}
}
启动集群:
启动三个nacos实例和nginx:
root@DESKTOP-TTLFG6F:~/nacos/bin# bash startup.sh -p 3333
root@DESKTOP-TTLFG6F:~/nacos/bin# bash startup.sh -p 4444
root@DESKTOP-TTLFG6F:~/nacos/bin# bash startup.sh -p 5555
root@DESKTOP-TTLFG6F:/usr/sbin# ./nginx -c /etc/nginx/nginx.conf
访问 http://192.168.91.1:1111/nacos 即可看到熟悉的nacos界面了……
微服务注册进nacos集群
我们以模块cloudalibaba-provider-payment9001
为例,直接将配置文件中的spring.cloud.nacos.discovery.addr
修改为nginx代理的vip
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:1111
management:
endpoints:
web:
exposure:
include: '*'
然后启动服务就可以正常注册了。
伪集群可能会踩的坑
因为伪集群的原因,可能造成实例之间无法通信,注册服务的时候就会看到这种情况:
java.lang.IllegalStateException: failed to req API:/nacos/v1/ns/instance after all servers([192.168.91.1:1111]) tried
at com.alibaba.nacos.client.naming.net.NamingProxy.reqAPI(NamingProxy.java:335)
at com.alibaba.nacos.client.naming.net.NamingProxy.reqAPI(NamingProxy.java:267)
at com.alibaba.nacos.client.naming.net.NamingProxy.registerService(NamingProxy.java:167)
at com.alibaba.nacos.client.naming.NacosNamingService.registerInstance(NacosNamingService.java:170)
at org.springframework.cloud.alibaba.nacos.registry.NacosServiceRegistry.register(NacosServiceRegistry.java:56)
at org.springframework.cloud.alibaba.nacos.registry.NacosServiceRegistry.register(NacosServiceRegistry.java:29)
但nacos服务后台三台机器均启动成功,且后台能正常进入,通过URL访问/nacos/v1/ns/instance,也是能正常访问。
实际上是跟通过主机名获取本机ip地址的原因有关(因为我是用的WSL可能会存在一些问题),这种情况还是修改bin/startup.sh
,加一个虚拟机参数:
83 if [[ "{MODE}" == "standalone" ]]; then
84 JAVA_OPT="{JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"
85 JAVA_OPT="{JAVA_OPT} -Dnacos.standalone=true"
86 else
87 JAVA_OPT="{JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
88 JAVA_OPT="{JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath={BASE_DIR }/logs/java_heapdump.hprof"
89 JAVA_OPT="{JAVA_OPT} -XX:-UseLargePages"
90 JAVA_OPT="{JAVA_OPT} -DServer.port={PORT}"
### 将cluster.conf中配置的ip地址加上
91 JAVA_OPT="{JAVA_OPT} -Dnacos.server.ip=192.168.91.1"
92 fi
原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/nacos%e9%9b%86%e7%be%a4%e6%90%ad%e5%bb%ba%e5%ae%9e%e6%93%8d/