public static synchronized String initNodeId(String id) {
        if (nodeId != null) {
            return nodeId;
        }
        if (StringUtils.isBlank(id)) {
            id = RandomStringUtils.randomAlphabetic(8)
                    .toLowerCase();
            LOGGER.warn(
                    "A random node ID ({}) has been used. You should better set a node ID manually in production",
                    id);
        } else {
            if (id.length() > NodeProperties.NODE_ID_MAX_LENGTH) {
                throw new IllegalArgumentException(
                        "The length of node ID must be less than or equal to "
                                + NodeProperties.NODE_ID_MAX_LENGTH);
            }
            if (!id.matches("^[a-zA-Z_]\\w*$")) {
                throw new IllegalArgumentException(
                        "The node ID must start with a letter or underscore, "
                                + "and matches zero or more of characters [a-zA-Z0-9_] after the beginning");
            }
        }
        nodeId = id;
        return nodeId;
    }
@param propertiesManager is used to get local properties and listen to their changes
turms-server-common/src/main/java/im/turms/server/common/infra/cluster/node/Node.java