• (Nacos)—nacos server集群+docker compose+节点IP问题+多数据库


    一、首先解决的集群问题

    1.docker集群各节点IP问题

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

    docker内ip地址

     

    官方关于配置介绍

    Nacos系统参数介绍

    源码分析

    1. com.alibaba.nacos.sys.env.Constants
    2. String NACOS_SERVER_IP = "nacos.server.ip";
    3. String IP_ADDRESS = "nacos.inetutils.ip-address";

     

    1. com.alibaba.nacos.sys.utils.InetUtils
    2. /**
    3. * Get ip address from environment
    4. * System property nacos.server.ip
    5. * Spring property nacos.inetutils.ip-address.
    6. *
    7. * @return ip address
    8. */
    9. private static String getNacosIp() {
    10. String nacosIp = System.getProperty(NACOS_SERVER_IP);
    11. if (StringUtils.isBlank(nacosIp)) {
    12. nacosIp = EnvUtil.getProperty(IP_ADDRESS);
    13. }
    14. if (!StringUtils.isBlank(nacosIp)) {
    15. if (!(InternetAddressUtil.isIP(nacosIp) || InternetAddressUtil.isDomain(nacosIp))) {
    16. throw new RuntimeException("nacos address " + nacosIp + " is not ip");
    17. }
    18. }
    19. return nacosIp;
    20. }
    21. /**
    22. * refresh ip address.
    23. */
    24. private static void refreshIp() {
    25. String tmpSelfIp = getNacosIp();
    26. if (StringUtils.isBlank(tmpSelfIp)) {
    27. tmpSelfIp = getPreferHostnameOverIP();
    28. }
    29. if (StringUtils.isBlank(tmpSelfIp)) {
    30. tmpSelfIp = Objects.requireNonNull(findFirstNonLoopbackAddress()).getHostAddress();
    31. }
    32. if (InternetAddressUtil.PREFER_IPV6_ADDRESSES && !tmpSelfIp.startsWith(InternetAddressUtil.IPV6_START_MARK)
    33. && !tmpSelfIp.endsWith(InternetAddressUtil.IPV6_END_MARK)) {
    34. tmpSelfIp = InternetAddressUtil.IPV6_START_MARK + tmpSelfIp + InternetAddressUtil.IPV6_END_MARK;
    35. if (StringUtils.contains(tmpSelfIp, InternetAddressUtil.PERCENT_SIGN_IN_IPV6)) {
    36. tmpSelfIp = tmpSelfIp.substring(0, tmpSelfIp.indexOf(InternetAddressUtil.PERCENT_SIGN_IN_IPV6))
    37. + InternetAddressUtil.IPV6_END_MARK;
    38. }
    39. }
    40. if (!Objects.equals(selfIP, tmpSelfIp) && Objects.nonNull(selfIP)) {
    41. IPChangeEvent event = new IPChangeEvent();
    42. event.setOldIP(selfIP);
    43. event.setNewIP(tmpSelfIp);
    44. NotifyCenter.publishEvent(event);
    45. }
    46. selfIP = tmpSelfIp;
    47. }

    代码分析:

    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配置

    cluster.conf配置

    dockerfile

     

    docker-compose1.yaml

    1. version : '3.8'
    2. services:
    3. xxxxxx-nacos:
    4. container_name: xxxxx-nacos
    5. image: cr.registry.res.xxxxxxxx.cn/zhcj/tools:xxx-nacos-2.0.3
    6. environment:
    7. - MODE=cluster
    8. - NACOS_SERVERS=172.19.86.250:8848,172.19.86.247:8848,172.19.86.251:8848
    9. - NACOS_SERVER_IP=172.19.86.250
    10. - TZ=Asia/Shanghai
    11. volumes:
    12. - /home/xxxx/nacos/logs:/home/nacos/logs
    13. - /home/xxxxx/nacos/logs/tomcat:/data/log/nacos
    14. - /home/xxx/nacos/conf/application.properties:/home/nacos/conf/application.properties
    15. - /home/xxx/nacos/conf/cluster.conf:/home/nacos/conf/cluster.conf
    16. hostname: xxxx-host-nacos
    17. ports:
    18. - "8848:8848"
    19. - "9848:9848"
    20. - "9849:9849"
    21. networks:
    22. - xxxxlocalhost

    docker-compose2.yaml

    1. version : '3.8'
    2. services:
    3. xxxxxx-nacos:
    4. container_name: xxxxx-nacos
    5. image: cr.registry.res.xxxxxxxx.cn/zhcj/tools:xxx-nacos-2.0.3
    6. environment:
    7. - MODE=cluster
    8. - NACOS_SERVERS=172.19.86.250:8848,172.19.86.247:8848,172.19.86.251:8848
    9. - NACOS_SERVER_IP=172.19.86.257
    10. - TZ=Asia/Shanghai
    11. volumes:
    12. - /home/xxxx/nacos/logs:/home/nacos/logs
    13. - /home/xxxxx/nacos/logs/tomcat:/data/log/nacos
    14. - /home/xxx/nacos/conf/application.properties:/home/nacos/conf/application.properties
    15. - /home/xxx/nacos/conf/cluster.conf:/home/nacos/conf/cluster.conf
    16. hostname: xxxx-host-nacos
    17. ports:
    18. - "8848:8848"
    19. - "9848:9848"
    20. - "9849:9849"
    21. networks:
    22. - xxxxlocalhost

    docker-compose3.yaml

    1. version : '3.8'
    2. services:
    3. xxxxxx-nacos:
    4. container_name: xxxxx-nacos
    5. image: cr.registry.res.xxxxxxxx.cn/zhcj/tools:xxx-nacos-2.0.3
    6. environment:
    7. - MODE=cluster
    8. - NACOS_SERVERS=172.19.86.250:8848,172.19.86.247:8848,172.19.86.251:8848
    9. - NACOS_SERVER_IP=172.19.86.251
    10. - TZ=Asia/Shanghai
    11. volumes:
    12. - /home/xxxx/nacos/logs:/home/nacos/logs
    13. - /home/xxxxx/nacos/logs/tomcat:/data/log/nacos
    14. - /home/xxx/nacos/conf/application.properties:/home/nacos/conf/application.properties
    15. - /home/xxx/nacos/conf/cluster.conf:/home/nacos/conf/cluster.conf
    16. hostname: xxxx-host-nacos
    17. ports:
    18. - "8848:8848"
    19. - "9848:9848"
    20. - "9849:9849"
    21. networks:
    22. - xxxxlocalhost

    结果:

     

  • 相关阅读:
    ssm和springboot整合
    CV复习:常用优化器总结
    PHP跌出前十,Python依然霸占榜首,C#有望摘得年度编程语言 TIOBE 12 月编程语言排行榜
    j2ee [ 自定义MVC实现增删改查分页 ]
    【LeetCode刷题-链表】--25.K个一组翻转链表
    小程序分包的详细流程
    Hive学习笔记2
    电商新趋势:阿里巴巴1688.item_password API引领智能分享新风尚
    RuntimeError: ANTLR version mismatch
    FullCalendarDemo5 控件的实例讲解—拖拽实现值班排班(五)
  • 原文地址:https://blog.csdn.net/yilvqingtai/article/details/127110479