一、首先解决的集群问题

1.docker集群各节点IP问题

nacos使用docker容器进行部署,发现nacos地址是docker网卡的地址。导致ip地址无法访问。

docker内ip地址

docker和宿主机的ip docker nacos 宿主机 discovery.ip_nacos server

 

官方关于配置介绍

Nacos系统参数介绍

源码分析

com.alibaba.nacos.sys.env.Constants


 
    String NACOS_SERVER_IP = "nacos.server.ip";

    String IP_ADDRESS = "nacos.inetutils.ip-address";

docker和宿主机的ip docker nacos 宿主机 discovery.ip_nacos集群部署_02

 

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连接池相同,如db.pool.config.connectionTimeoutdb.pool.config.maximumPoolSize

字符串

同hikariCp对应默认配置

>=1.4.1

当前数据库配置支持多数据源。通过db.num来指定数据源个数,db.url.index为对应的数据库的链接。db.user以及db.password没有设置index时,所有的链接都以db.userdb.password用作认证。如果不同数据源的用户名称或者用户密码不一样时,可以通过符号,来进行切割,或者指定db.user.index,db.user.password来设置对应数据库链接的用户或者密码。需要注意的是,当db.userdb.password没有指定下标时,因为当前机制会根据,进行切割。所以当用户名或者密码存在,时,会把,切割后前面的值当成最后的值进行认证,会导致认证失败。

Nacos从1.3版本开始使用HikariCP连接池,但在1.4.1版本前,连接池配置由系统默认值定义,无法自定义配置。在1.4.1后,提供了一个方法能够配置HikariCP连接池。 db.pool.config为配置前缀,xxx为实际的hikariCP配置,如db.pool.config.connectionTimeoutdb.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配置

docker和宿主机的ip docker nacos 宿主机 discovery.ip_nacos server_03

cluster.conf配置

docker和宿主机的ip docker nacos 宿主机 discovery.ip_nacos集群部署_04

dockerfile

docker和宿主机的ip docker nacos 宿主机 discovery.ip_docker_05

 

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

结果:

docker和宿主机的ip docker nacos 宿主机 discovery.ip_nacos集群部署_06