一、首先解决的集群问题
1.docker集群各节点IP问题
nacos使用docker容器进行部署,发现nacos地址是docker网卡的地址。导致ip地址无法访问。
docker内ip地址
官方关于配置介绍
源码分析
com.alibaba.nacos.sys.env.Constants
String NACOS_SERVER_IP = "nacos.server.ip";
String IP_ADDRESS = "nacos.inetutils.ip-address";
com.alibaba.nacos.sys.utils.InetUtils
/**
* Get ip address from environment
* System property nacos.server.ip
* Spring property nacos.inetutils.ip-address.
*
* @return ip address
*/
private static String getNacosIp() {
String nacosIp = System.getProperty(NACOS_SERVER_IP);
if (StringUtils.isBlank(nacosIp)) {
nacosIp = EnvUtil.getProperty(IP_ADDRESS);
}
if (!StringUtils.isBlank(nacosIp)) {
if (!(InternetAddressUtil.isIP(nacosIp) || InternetAddressUtil.isDomain(nacosIp))) {
throw new RuntimeException("nacos address " + nacosIp + " is not ip");
}
}
return nacosIp;
}
/**
* refresh ip address.
*/
private static void refreshIp() {
String tmpSelfIp = getNacosIp();
if (StringUtils.isBlank(tmpSelfIp)) {
tmpSelfIp = getPreferHostnameOverIP();
}
if (StringUtils.isBlank(tmpSelfIp)) {
tmpSelfIp = Objects.requireNonNull(findFirstNonLoopbackAddress()).getHostAddress();
}
if (InternetAddressUtil.PREFER_IPV6_ADDRESSES && !tmpSelfIp.startsWith(InternetAddressUtil.IPV6_START_MARK)
&& !tmpSelfIp.endsWith(InternetAddressUtil.IPV6_END_MARK)) {
tmpSelfIp = InternetAddressUtil.IPV6_START_MARK + tmpSelfIp + InternetAddressUtil.IPV6_END_MARK;
if (StringUtils.contains(tmpSelfIp, InternetAddressUtil.PERCENT_SIGN_IN_IPV6)) {
tmpSelfIp = tmpSelfIp.substring(0, tmpSelfIp.indexOf(InternetAddressUtil.PERCENT_SIGN_IN_IPV6))
+ InternetAddressUtil.IPV6_END_MARK;
}
}
if (!Objects.equals(selfIP, tmpSelfIp) && Objects.nonNull(selfIP)) {
IPChangeEvent event = new IPChangeEvent();
event.setOldIP(selfIP);
event.setNewIP(tmpSelfIp);
NotifyCenter.publishEvent(event);
}
selfIP = tmpSelfIp;
}
代码分析:
1. 首先查看JVM属性是否配置了nacos.server.ip没有 ;如果有ip地址就是它;
可以通过jvm设置环境变量 来设置本节点nacos的ip
例如:JAVA_OPT=“${JAVA_OPT} -Dnacos.server.ip=你的服务器的ip”
当然在docker compose中也有类似配置
2. 如果1没有满足,则看看配置文件application.properties中有没有属性nacos.inetutils.ip-address=IP地址;
可以在application.properties中直接设置该IP
如果有就是它
3.如果还没有,那判断是否优先使用hostname;preferHostnameOverIp 的判断逻辑是;
先判断JVM属性有没有配置nacos.preferHostnameOverIp=true/false;
如果false,再去判断配置文件application.properties中有没有属性 nacos.inetutils.prefer-hostname-over-ip=true/false;
如果有的话 就优先获取hostname; inetAddress.getHostName();
4. 否则的话 就获取所有网卡中第一个非回环地址 selfIp = findFirstNonLoopbackAddress().getHostAddress();
就是不会找到 127.0.0.1这样的回环地址;
2. 多数据源问题
官方文档说明:
Config模块
参数名 | 含义 | 可选值 | 默认值 | 支持版本 |
db.num | 数据库数目 | 正整数 | 0 | >= 0.1.0 |
db.url.0 | 第一个数据库的URL | 字符串 | 空 | >= 0.1.0 |
db.url.1 | 第二个数据库的URL | 字符串 | 空 | >= 0.1.0 |
db.user | 数据库连接的用户名 | 字符串 | 空 | >= 0.1.0 |
db.password | 数据库连接的密码 | 字符串 | 空 | >= 0.1.0 |
spring.datasource.platform | 数据库类型 | 字符串 | mysql | >=1.3.0 |
db.pool.config.xxx | 数据库连接池参数,使用的是hikari连接池,参数与hikari连接池相同,如 | 字符串 | 同hikariCp对应默认配置 | >=1.4.1 |
当前数据库配置支持多数据源。通过db.num
来指定数据源个数,db.url.index
为对应的数据库的链接。db.user
以及db.password
没有设置index
时,所有的链接都以db.user
和db.password
用作认证。如果不同数据源的用户名称或者用户密码不一样时,可以通过符号,
来进行切割,或者指定db.user.index
,db.user.password
来设置对应数据库链接的用户或者密码。需要注意的是,当db.user
和db.password
没有指定下标时,因为当前机制会根据,
进行切割。所以当用户名或者密码存在,
时,会把,
切割后前面的值当成最后的值进行认证,会导致认证失败。
Nacos从1.3版本开始使用HikariCP连接池,但在1.4.1版本前,连接池配置由系统默认值定义,无法自定义配置。在1.4.1后,提供了一个方法能够配置HikariCP连接池。 db.pool.config
为配置前缀,xxx
为实际的hikariCP配置,如db.pool.config.connectionTimeout
或db.pool.config.maximumPoolSize
等。更多hikariCP的配置请查看HikariCP 需要注意的是,url,user,password会由db.url.n
,db.user
,db.password
覆盖,driverClassName则是默认的MySQL8 driver(该版本mysql driver支持mysql5.x)
二、docker compose部署集群示例
application.properties配置
cluster.conf配置
dockerfile
docker-compose1.yaml
version : '3.8'
services:
xxxxxx-nacos:
container_name: xxxxx-nacos
image: cr.registry.res.xxxxxxxx.cn/zhcj/tools:xxx-nacos-2.0.3
environment:
- MODE=cluster
- NACOS_SERVERS=172.19.86.250:8848,172.19.86.247:8848,172.19.86.251:8848
- NACOS_SERVER_IP=172.19.86.250
- TZ=Asia/Shanghai
volumes:
- /home/xxxx/nacos/logs:/home/nacos/logs
- /home/xxxxx/nacos/logs/tomcat:/data/log/nacos
- /home/xxx/nacos/conf/application.properties:/home/nacos/conf/application.properties
- /home/xxx/nacos/conf/cluster.conf:/home/nacos/conf/cluster.conf
hostname: xxxx-host-nacos
ports:
- "8848:8848"
- "9848:9848"
- "9849:9849"
networks:
- xxxxlocalhost
docker-compose2.yaml
version : '3.8'
services:
xxxxxx-nacos:
container_name: xxxxx-nacos
image: cr.registry.res.xxxxxxxx.cn/zhcj/tools:xxx-nacos-2.0.3
environment:
- MODE=cluster
- NACOS_SERVERS=172.19.86.250:8848,172.19.86.247:8848,172.19.86.251:8848
- NACOS_SERVER_IP=172.19.86.257
- TZ=Asia/Shanghai
volumes:
- /home/xxxx/nacos/logs:/home/nacos/logs
- /home/xxxxx/nacos/logs/tomcat:/data/log/nacos
- /home/xxx/nacos/conf/application.properties:/home/nacos/conf/application.properties
- /home/xxx/nacos/conf/cluster.conf:/home/nacos/conf/cluster.conf
hostname: xxxx-host-nacos
ports:
- "8848:8848"
- "9848:9848"
- "9849:9849"
networks:
- xxxxlocalhost
docker-compose3.yaml
version : '3.8'
services:
xxxxxx-nacos:
container_name: xxxxx-nacos
image: cr.registry.res.xxxxxxxx.cn/zhcj/tools:xxx-nacos-2.0.3
environment:
- MODE=cluster
- NACOS_SERVERS=172.19.86.250:8848,172.19.86.247:8848,172.19.86.251:8848
- NACOS_SERVER_IP=172.19.86.251
- TZ=Asia/Shanghai
volumes:
- /home/xxxx/nacos/logs:/home/nacos/logs
- /home/xxxxx/nacos/logs/tomcat:/data/log/nacos
- /home/xxx/nacos/conf/application.properties:/home/nacos/conf/application.properties
- /home/xxx/nacos/conf/cluster.conf:/home/nacos/conf/cluster.conf
hostname: xxxx-host-nacos
ports:
- "8848:8848"
- "9848:9848"
- "9849:9849"
networks:
- xxxxlocalhost
结果: