Nacos集群在Rainbond上的部署及应用制作

什么是Nacos

  • Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
  • Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
  • 更多更详细的信息可以通过Nacos官网进一步了解

在rainbond平台如何使用Nacos集群

  • 从应用市场一键安装

    目前我们已经将1.14版本的Nacos集群发布到了应用市场,如果你想要快速安装及使用Nacos集群,你只需要在应用市场搜索Nacos,点击安装:

    稍等一会后Nacos集群就会部署到你的rainbond平台上了,等到它所有组件都处于运行中之后,你就可以很方便的使用它了

  • 通过对外端口访问控制台

    点击访问之后,在域名后加上/nacos就可以进入登陆界面了,默认的账户密码都是nacos,登陆之后可以自行修改密码

    控制台详细的使用方式可通过Nacos控制台手册来学习使用

  • API指南

    Nacos Open API 的功能是很丰富的,对于如何去使用这些功能,官方也给出了很详细的说明,详情请参考Nacos Open API指南

  • 通过环境变量自定义Nacos集群属性

    在rainbond的Nacos集群中支持的环境变量很多,想要自行配置的朋友可以参照Nacos环境变量说明,来对Nacos进行一些自定义的设定,其中部分环境变量在适配rainbond平台时做了优化处理,在此特别说明:

    • NACOS_SERVERS:

    该变量用于设置集群地址,调整为会根据实例数目,自行将所有实例添加到集群内,不过需要在伸缩实例数目后重新启动实例,以使实例重新读取相关配置文件

    • JVM_XMS:

    该变量用于设定JVM的最小运行内存大小,调整为根据实例内存自动配置为合适的数值

    • JVM_XMX:

    该变量用于设定JVM的最大运行内存大小,调整为根据实例内存自动配置为合适的数值

    • JVM_XMN:

    该变量用于设定JVM新生代堆栈的大小,调整为根据实例内存自动配置为合适的数值

应用是如何制作的

​ 制作好之后的Nacos集群在rainbond平台上使用起来十分方便,那么我们是如何制作这个应用的呢?

​ 应用制作时,主要通过阅读Nacos官方的docker-compose,获取应用之间的依赖关系,需要配置的环境变量,然后依据rainbond平台的应用制作规范作出调整,以使Nacos应用可以在平台上方便快捷的使用

​ 在制作Nacos服务时,考虑到集群的伸缩需求,主要需要实现以下两点:

  • Nacos有集群和单机两种,由环境变量MODE值来决定,MODE值可选cluster/standalone,默认为cluster,当Nacos实例数目为1时,需要调整为单机模式,也就是要将MODE值设定为standalone,为实现该功能,在启动脚本中添加如下内容
[[ "${SERVICE_POD_NUM}" == 1 ]] && export MODE=standalone

​ 其中SERVICE_POD_NUM为rainbond平台启动组件是默认注入的环境变量,表示应用实例的数量,依据SERVICE_POD_NUM是否为一来判断Nacos应该选择单机还是集群模式,这样就可以自由调整Nacos的实例数而无需再去手动修改配置了

  • 当Nacos在集群模式下时,需要将所有Nacos实例的主机名都注册到集群内,官方推荐通过设置NACOS_SERVERS变量来实现这一点,NACOS_SERVERS实际上是nacos cluster所有节点的地址,类似于ip1,ip2,ip3这样的形式,通过对Nacos启动脚本的阅读,注意到在启动脚本中对Nacos集群的设置是由以下脚本来实现的
    echo "" > "$CLUSTER_CONF"
    for server in ${NACOS_SERVERS}; do
            echo "$server" >> "$CLUSTER_CONF"
    done

​ 观察本段内容,可以发现是读取变量NACOS_SERVERS中的内容,写入到CLUSTER_CONF(Nacos集群配置文件)中,最终生成类似如下内容

nacos1:8848
nacos2:8848
nacos3:8848

​ 为实现在rainbond平台上可以将Nacos所有实例自动注册到集群中,利用Rainbond平台启动组件时默认注入以下环境变量将脚本修改为下

export CLUSTER_NUM=$[$SERVICE_POD_NUM - 1]
    echo "" > "$CLUSTER_CONF"
    for i in $(seq 0 $CLUSTER_NUM );do
						echo $SERVICE_NAME-$i.$SERVICE_NAME.$TENANT_ID.svc.cluster.local.:8848 >> "$CLUSTER_CONF"
    done

​ 其中SERVICE_POD_NUM为应用实例的数量,在rainbond平台上有状态服务的多个实例之间主机名遵循$SERVICE_NAME-(0,1,2...)的规律,最后一个实例的主机名就是$SERVICE_NAME-(实例数-1) 了,其中SERVICE_NAME为服务名称,在容器内通过env命令即可查看,利用默认注入的环境变量可以拼接成出一个这样$SERVICE_NAME-$i.$SERVICE_NAME.$TENANT_ID.svc.cluster.local.的域名,在rainbond平台的同一个应用内可以通过这样的域名直接访问到其他的服务,其中TENANT_ID为租户名称,这样就可以在Nacos的所有实例中将集群信息写入都指定的配置文件,每次更改完实例数目之后,只需要重启服务,使Nacos重新读取配置文件即可了

  • 除此之外,因为Nacos是使用Java来启动的,在启动时需要指定JVM_XMS,JVM_XMX,JVM_XMN变量来设置Java的-Xms,-Xmx,-Xmn参数,在Nacos的官方脚本中是通过

    JAVA_OPT="${JAVA_OPT} -server -Xms${JVM_XMS} -Xmx${JVM_XMX} -Xmn${JVM_XMN} -XX:MetaspaceSize=${JVM_MS} -XX:MaxMetaspaceSize=${JVM_MMS}"

    来实现的,这样设置的话,如果对实例进行垂直伸缩之后,也需要相应的修改这些变量,否则可能会因为内存不足而导致Nacos服务无法启动,于是将这一部分脚本修改为如下内容,来实现根据分配的内存自动设置Java的启动参数

      case ${MEMORY_SIZE:-small} in
        "micro")
          JAVA_OPT="${JAVA_OPT} -server -Xms90m -Xmx90m -Xmn45m -XX:MetaspaceSize=${JVM_MS} -XX:MaxMetaspaceSize=${JVM_MMS}"
          echo "Optimizing java process for 128M Memory...." >&2
          ;;
        "small")
          JAVA_OPT="${JAVA_OPT} -server -Xms180m -Xmx180m -Xmn90m -XX:MetaspaceSize=${JVM_MS} -XX:MaxMetaspaceSize=${JVM_MMS}"
          echo "Optimizing java process for 256M Memory...." >&2
          ;;
        "medium")
          JAVA_OPT="${JAVA_OPT} -server -Xms360m -Xmx360m -Xmn180m -XX:MetaspaceSize=${JVM_MS} -XX:MaxMetaspaceSize=${JVM_MMS}"
          echo "Optimizing java process for 512M Memory...." >&2
          ;;
        "large")
          JAVA_OPT="${JAVA_OPT} -server -Xms720m -Xmx720m -Xmn360m -XX:MetaspaceSize=${JVM_MS} -XX:MaxMetaspaceSize=${JVM_MMS}"
          echo "Optimizing java process for 1G Memory...." >&2
          ;;
        "2xlarge")
          JAVA_OPT="${JAVA_OPT} -server -Xms1420m -Xmx1420m -Xmn710m -XX:MetaspaceSize=${JVM_MS} -XX:MaxMetaspaceSize=${JVM_MMS}"
          echo "Optimizing java process for 2G Memory...." >&2
          ;;
        "4xlarge")
          JAVA_OPT="${JAVA_OPT} -server -Xms2840m -Xmx2840m -Xmn1420m -XX:MetaspaceSize=${JVM_MS} -XX:MaxMetaspaceSize=${JVM_MMS}"
          echo "Optimizing java process for 4G Memory...." >&2
          ;;
        "8xlarge")
          JAVA_OPT="${JAVA_OPT} -server -Xms5680m -Xmx5680m -Xmn2840m -XX:MetaspaceSize=${JVM_MS} -XX:MaxMetaspaceSize=${JVM_MMS}"
          echo "Optimizing java process for 8G Memory...." >&2
          ;;
        16xlarge|32xlarge|64xlarge)
          JAVA_OPT="${JAVA_OPT} -server -Xms8G -Xmx8G -Xmn4G -XX:MetaspaceSize=${JVM_MS} -XX:MaxMetaspaceSize=${JVM_MMS}"
          echo "Optimizing java process for biger Memory...." >&2
          ;;
        *)
          JAVA_OPT="${JAVA_OPT} -server -Xms128m -Xmx128m -Xmn64m -XX:MetaspaceSize=${JVM_MS} -XX:MaxMetaspaceSize=${JVM_MMS}"
          echo "Optimizing java process for 256M Memory...." >&2
          ;;
      esac
    

    其中MEMORY_SIZE表示当前应用实例的内存大小设置,脚本根据MEMORY_SIZE不同的值分别设置合适的-Xms,-Xmx,-Xmn值,这样就无需手动调整JVM_XMS,JVM_XMX,JVM_XMN变量了,在使用过程中也可以很方便的根据自己的需求来调整实例内存大小而不必担心服务不可用

将启动脚本调整完成后重新构建Nacos镜像,通过Docker镜像创建相关的服务,最终拓扑图如下

最后进行测试,确定所有功能及优化均已实现后,点击发布到市场,编辑相关的信息,即可发布了

2 Likes

大佬辛苦。又解决了一个难题。

1 Like