From c4d75c03a6e4e6b51755fc29a9133d1b61f4753a Mon Sep 17 00:00:00 2001 From: Meng Sen Date: Tue, 29 Apr 2025 11:51:05 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=20Nacos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Meng Sen --- apps/nacos-derby/3.0.0/data.yml | 123 ++++++++++++ apps/nacos-derby/3.0.0/docker-compose.yml | 27 +++ apps/nacos-derby/3.0.0/envs/default.env | 2 + apps/nacos-derby/3.0.0/envs/global.env | 2 + apps/nacos-derby/3.0.0/init/mysql-schema.sql | 188 +++++++++++++++++++ apps/nacos-derby/3.0.0/scripts/init.sh | 26 +++ apps/nacos-derby/3.0.0/scripts/uninstall.sh | 10 + apps/nacos-derby/3.0.0/scripts/upgrade.sh | 17 ++ apps/nacos-derby/README.md | 125 ++++++++++++ apps/nacos-derby/data.yml | 16 ++ apps/nacos-derby/logo.png | Bin 0 -> 34308 bytes apps/nacos/3.0.0/data.yml | 20 +- apps/nacos/3.0.0/docker-compose.yml | 3 +- 13 files changed, 555 insertions(+), 4 deletions(-) create mode 100644 apps/nacos-derby/3.0.0/data.yml create mode 100644 apps/nacos-derby/3.0.0/docker-compose.yml create mode 100644 apps/nacos-derby/3.0.0/envs/default.env create mode 100644 apps/nacos-derby/3.0.0/envs/global.env create mode 100644 apps/nacos-derby/3.0.0/init/mysql-schema.sql create mode 100644 apps/nacos-derby/3.0.0/scripts/init.sh create mode 100644 apps/nacos-derby/3.0.0/scripts/uninstall.sh create mode 100644 apps/nacos-derby/3.0.0/scripts/upgrade.sh create mode 100644 apps/nacos-derby/README.md create mode 100644 apps/nacos-derby/data.yml create mode 100644 apps/nacos-derby/logo.png diff --git a/apps/nacos-derby/3.0.0/data.yml b/apps/nacos-derby/3.0.0/data.yml new file mode 100644 index 000000000..4cd8af7af --- /dev/null +++ b/apps/nacos-derby/3.0.0/data.yml @@ -0,0 +1,123 @@ +additionalProperties: + formFields: + - default: "1panel-network" + edit: true + envKey: NETWORK_MODE + labelEn: Drive path + labelZh: 网络模式 + required: true + type: select + values: + - label: 主机网络模式 + value: "host" + - label: 桥接网络模式 + value: "bridge" + - label: 无网络模式 + value: "none" + - label: 1panel-network + value: "1panel-network" + - default: "/home/nacos" + edit: true + envKey: NACOS_ROOT_PATH + labelZh: 数据持久化路径 + labelEn: Data persistence path + required: true + type: text + - default: 8080 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelZh: WebUI 端口 + labelEn: WebUI port + required: true + rule: paramPort + type: number + - default: 8848 + edit: true + envKey: PANEL_APP_PORT_API + labelZh: WebUI API 端口 + labelEn: WebUI API port + required: true + rule: paramPort + type: number + - default: 9848 + edit: true + envKey: PANEL_APP_PORT_GRPC + labelZh: Nacos gRPC 端口 + labelEn: Nacos gRPC port + required: true + rule: paramPort + type: number + - default: "ip" + envKey: PREFER_HOST_MODE + labelZh: IP模式/域名模式 + labelEn: IP mode/hostname mode + required: true + type: select + values: + - label: IP模式 + value: "ip" + - label: 域名模式 + value: "hostname" + - default: "" + edit: true + envKey: NACOS_SERVER_IP + labelZh: 服务IP + labelEn: Server IP + required: true + type: text + - default: "serverIdentity" + edit: true + envKey: NACOS_AUTH_IDENTITY_KEY + labelZh: Nacos身份验证密钥键 + labelEn: Nacos auth identity key + required: true + type: text + - default: "security" + edit: true + envKey: NACOS_AUTH_IDENTITY_VALUE + labelZh: Nacos身份验证密钥值 + labelEn: Nacos auth identity value + required: true + type: text + - default: "SecretKey012345678901234567890123456789012345678901234567890123456789" + edit: true + envKey: NACOS_AUTH_TOKEN + labelZh: Nacos身份验证令牌(至少32位字符的Base64编码) + labelEn: Nacos auth token + required: true + type: text + - default: "512m" + edit: true + envKey: JVM_XMS + labelZh: JVM_XMS (初始内存大小) + labelEn: JVM_XMS (Initial memory size) + required: true + type: text + - default: "2g" + edit: true + envKey: JVM_XMX + labelEn: JVM_XMX (Maximum memory size) + labelZh: JVM_XMX (最大内存大小) + required: true + type: text + - default: "128m" + edit: true + envKey: JVM_XMN + labelEn: JVM_XMN (New generation memory) + labelZh: JVM_XMN (新生代内存) + required: true + type: text + - default: "128m" + edit: true + envKey: JVM_MS + labelEn: JVM_MS (Initial metaspace) + labelZh: JVM_MS (初始元空间大小) + required: true + type: text + - default: "320m" + edit: true + envKey: JVM_MMS + labelEn: JVM_MMS (Maximum metaspace) + labelZh: JVM_MMS (最大元空间大小) + required: true + type: text diff --git a/apps/nacos-derby/3.0.0/docker-compose.yml b/apps/nacos-derby/3.0.0/docker-compose.yml new file mode 100644 index 000000000..3b2215c2d --- /dev/null +++ b/apps/nacos-derby/3.0.0/docker-compose.yml @@ -0,0 +1,27 @@ +networks: + 1panel-network: + external: true + +services: + nacos: + image: nacos/nacos-server:v3.0.0 + container_name: ${CONTAINER_NAME} + restart: always + labels: + createdBy: "Apps" + network_mode: ${NETWORK_MODE} + ports: + - ${PANEL_APP_PORT_HTTP}:8080 + - ${PANEL_APP_PORT_API}:8848 + - ${PANEL_APP_PORT_GRPC}:9848 + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + volumes: + - ${NACOS_ROOT_PATH}/logs:/home/nacos/logs + - ${NACOS_ROOT_PATH}/data:/home/nacos/data + environment: + - MODE=standalone + - NACOS_CONSOLE_PORT=${PANEL_APP_PORT_HTTP:-8080} + - NACOS_SERVER_PORT=${PANEL_APP_PORT_API:-8848} + - NACOS_AUTH_ENABLE=true diff --git a/apps/nacos-derby/3.0.0/envs/default.env b/apps/nacos-derby/3.0.0/envs/default.env new file mode 100644 index 000000000..cd05f46e6 --- /dev/null +++ b/apps/nacos-derby/3.0.0/envs/default.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +ENV_FILE=.env diff --git a/apps/nacos-derby/3.0.0/envs/global.env b/apps/nacos-derby/3.0.0/envs/global.env new file mode 100644 index 000000000..e10989fe4 --- /dev/null +++ b/apps/nacos-derby/3.0.0/envs/global.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +TZ=Asia/Shanghai diff --git a/apps/nacos-derby/3.0.0/init/mysql-schema.sql b/apps/nacos-derby/3.0.0/init/mysql-schema.sql new file mode 100644 index 000000000..d45ac956b --- /dev/null +++ b/apps/nacos-derby/3.0.0/init/mysql-schema.sql @@ -0,0 +1,188 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/******************************************/ +/* 表名称 = config_info */ +/******************************************/ +CREATE TABLE `config_info` +( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` varchar(255) NOT NULL COMMENT 'data_id', + `group_id` varchar(128) DEFAULT NULL COMMENT 'group_id', + `content` longtext NOT NULL COMMENT 'content', + `md5` varchar(32) DEFAULT NULL COMMENT 'md5', + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', + `src_user` text COMMENT 'source user', + `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip', + `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', + `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', + `c_desc` varchar(256) DEFAULT NULL COMMENT 'configuration description', + `c_use` varchar(64) DEFAULT NULL COMMENT 'configuration usage', + `effect` varchar(64) DEFAULT NULL COMMENT '配置生效的描述', + `type` varchar(64) DEFAULT NULL COMMENT '配置的类型', + `c_schema` text COMMENT '配置的模式', + `encrypted_data_key` varchar(1024) NOT NULL DEFAULT '' COMMENT '密钥', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info'; + +/******************************************/ +/* 表名称 = config_info since 2.5.0 */ +/******************************************/ +CREATE TABLE `config_info_gray` +( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` varchar(255) NOT NULL COMMENT 'data_id', + `group_id` varchar(128) NOT NULL COMMENT 'group_id', + `content` longtext NOT NULL COMMENT 'content', + `md5` varchar(32) DEFAULT NULL COMMENT 'md5', + `src_user` text COMMENT 'src_user', + `src_ip` varchar(100) DEFAULT NULL COMMENT 'src_ip', + `gmt_create` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP (3) COMMENT 'gmt_create', + `gmt_modified` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP (3) COMMENT 'gmt_modified', + `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', + `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id', + `gray_name` varchar(128) NOT NULL COMMENT 'gray_name', + `gray_rule` text NOT NULL COMMENT 'gray_rule', + `encrypted_data_key` varchar(256) NOT NULL DEFAULT '' COMMENT 'encrypted_data_key', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_configinfogray_datagrouptenantgray` (`data_id`,`group_id`,`tenant_id`,`gray_name`), + KEY `idx_dataid_gmt_modified` (`data_id`,`gmt_modified`), + KEY `idx_gmt_modified` (`gmt_modified`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='config_info_gray'; + +/******************************************/ +/* 表名称 = config_tags_relation */ +/******************************************/ +CREATE TABLE `config_tags_relation` +( + `id` bigint(20) NOT NULL COMMENT 'id', + `tag_name` varchar(128) NOT NULL COMMENT 'tag_name', + `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type', + `data_id` varchar(255) NOT NULL COMMENT 'data_id', + `group_id` varchar(128) NOT NULL COMMENT 'group_id', + `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id', + `nid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增长标识', + PRIMARY KEY (`nid`), + UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`), + KEY `idx_tenant_id` (`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation'; + +/******************************************/ +/* 表名称 = group_capacity */ +/******************************************/ +CREATE TABLE `group_capacity` +( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群', + `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值', + `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量', + `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', + `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值', + `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值', + `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量', + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_group_id` (`group_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表'; + +/******************************************/ +/* 表名称 = his_config_info */ +/******************************************/ +CREATE TABLE `his_config_info` +( + `id` bigint(20) unsigned NOT NULL COMMENT 'id', + `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增标识', + `data_id` varchar(255) NOT NULL COMMENT 'data_id', + `group_id` varchar(128) NOT NULL COMMENT 'group_id', + `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', + `content` longtext NOT NULL COMMENT 'content', + `md5` varchar(32) DEFAULT NULL COMMENT 'md5', + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', + `src_user` text COMMENT 'source user', + `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip', + `op_type` char(10) DEFAULT NULL COMMENT 'operation type', + `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', + `encrypted_data_key` varchar(1024) NOT NULL DEFAULT '' COMMENT '密钥', + `publish_type` varchar(50) DEFAULT 'formal' COMMENT 'publish type gray or formal', + `gray_name` varchar(50) DEFAULT NULL COMMENT 'gray name', + `ext_info` longtext DEFAULT NULL COMMENT 'ext info', + PRIMARY KEY (`nid`), + KEY `idx_gmt_create` (`gmt_create`), + KEY `idx_gmt_modified` (`gmt_modified`), + KEY `idx_did` (`data_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造'; + + +/******************************************/ +/* 表名称 = tenant_capacity */ +/******************************************/ +CREATE TABLE `tenant_capacity` +( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID', + `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值', + `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量', + `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', + `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数', + `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值', + `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量', + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_tenant_id` (`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表'; + + +CREATE TABLE `tenant_info` +( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `kp` varchar(128) NOT NULL COMMENT 'kp', + `tenant_id` varchar(128) default '' COMMENT 'tenant_id', + `tenant_name` varchar(128) default '' COMMENT 'tenant_name', + `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc', + `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source', + `gmt_create` bigint(20) NOT NULL COMMENT '创建时间', + `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`), + KEY `idx_tenant_id` (`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info'; + +CREATE TABLE `users` +( + `username` varchar(50) NOT NULL PRIMARY KEY COMMENT 'username', + `password` varchar(500) NOT NULL COMMENT 'password', + `enabled` boolean NOT NULL COMMENT 'enabled' +); + +CREATE TABLE `roles` +( + `username` varchar(50) NOT NULL COMMENT 'username', + `role` varchar(50) NOT NULL COMMENT 'role', + UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE +); + +CREATE TABLE `permissions` +( + `role` varchar(50) NOT NULL COMMENT 'role', + `resource` varchar(128) NOT NULL COMMENT 'resource', + `action` varchar(8) NOT NULL COMMENT 'action', + UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE +); diff --git a/apps/nacos-derby/3.0.0/scripts/init.sh b/apps/nacos-derby/3.0.0/scripts/init.sh new file mode 100644 index 000000000..19193ac7b --- /dev/null +++ b/apps/nacos-derby/3.0.0/scripts/init.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + sed -i '/^GLOBAL_ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + echo "GLOBAL_ENV_FILE=${CURRENT_DIR}/envs/global.env" >> .env + + if command -v mysql &> /dev/null; then + if [[ -f ./init/mysql-schema.sql ]]; then + mysql -u"$MYSQL_SERVICE_USER" -p"$MYSQL_SERVICE_PASSWORD" -h"$MYSQL_SERVICE_HOST" -P"$MYSQL_SERVICE_PORT" --protocol=TCP "$MYSQL_SERVICE_DB_NAME" < ./init/mysql-schema.sql + else + echo "mysql-schema.sql not found." + fi + else + echo "mysql command not found." + fi + + echo "Check Finish." +else + echo "Error: .env file not found." +fi diff --git a/apps/nacos-derby/3.0.0/scripts/uninstall.sh b/apps/nacos-derby/3.0.0/scripts/uninstall.sh new file mode 100644 index 000000000..c86c4fbca --- /dev/null +++ b/apps/nacos-derby/3.0.0/scripts/uninstall.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/nacos-derby/3.0.0/scripts/upgrade.sh b/apps/nacos-derby/3.0.0/scripts/upgrade.sh new file mode 100644 index 000000000..07fb8c3fe --- /dev/null +++ b/apps/nacos-derby/3.0.0/scripts/upgrade.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + sed -i '/^GLOBAL_ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + echo "GLOBAL_ENV_FILE=${CURRENT_DIR}/envs/global.env" >> .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/nacos-derby/README.md b/apps/nacos-derby/README.md new file mode 100644 index 000000000..054a85854 --- /dev/null +++ b/apps/nacos-derby/README.md @@ -0,0 +1,125 @@ +# Nacos + +一个易于使用的动态服务发现、配置和服务管理平台,用于构建云原生应用。 + +![Nacos](https://github.com/alibaba/nacos/raw/develop/doc/Nacos_Logo.png) + +![](https://img.shields.io/badge/%E6%96%B0%E7%96%86%E8%90%8C%E6%A3%AE%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E5%B7%A5%E4%BD%9C%E5%AE%A4-%E6%8F%90%E4%BE%9B%E6%8A%80%E6%9C%AF%E6%94%AF%E6%8C%81-blue) + +## 安装说明 + +Nacos +2.x默认使用的端口为8848(HTTP管理端口)、9848(客户端gRPC请求服务端端口)和9849(服务端gRPC请求服务端端口)。客户端在连接时,虽然主要配置的是管理端访问端口8848,但实际上客户端会根据服务端的配置自动计算其他端口进行通信。 + +因此我们推荐使用 `host` 模式部署,以避免端口冲突。 + +> 安全路径:`/nacos` +> +> 用户名:`nacos` +> +> 自版本 `2.4.0` 起,取消了默认密码,首次启动需要自行设置密码。 +> 密码:`nacos` + +### 初始化数据库 + +安装前,需要先创建数据库,数据库初始化文件:`mysql-schema.sql` +,可前往[Nacos](https://github.com/alibaba/nacos/blob/master/distribution/conf/mysql-schema.sql)下载。 + +或安装完成后,进入安装目录,在 `init` 文件夹下,导入 `mysql-schema.sql` 文件。 + +### 加密配置 + ++ `Nacos身份验证令牌` + +32位字符串,并使用Base64编码。 + +### JVM参数 + ++ `JVM_XMS` + +这个参数设置 Java 虚拟机堆的初始内存大小。 + +它指定了 JVM 在启动时分配的堆内存大小。 + +例如,-Xms512m 表示 JVM 在启动时将分配 512MB 的堆内存。 + ++ `JVM_XMX` + +这个参数设置 Java 虚拟机堆的最大内存大小。 + +它指定了 JVM 堆内存的上限。 + +例如,-Xmx1024m 表示 JVM 的堆内存最多可以使用 1024MB。 + ++ `JVM_XMN` + +这个参数用于设置新生代的大小。 + +新生代是 JVM 堆内存中的一部分,用于存放新创建的对象。 +设置 -Xmn 参数可以控制新生代的初始大小。 + +例如,-Xmn256m 表示将新生代的初始大小设置为 256MB。 + ++ `JVM_MS` + +这个参数用于设置 JVM 的初始元空间大小。 + +元空间是用于存储类元数据的区域,它在 Java 8 中取代了永久代。 + +例如,-XX: MetaspaceSize=128m 表示将初始的元空间大小设置为 128MB。 + ++ `JVM_MMS` + +这个参数用于设置 JVM 的最大元空间大小。 + +它指定了元空间能够增长的最大限制。 + +例如,-XX:MaxMetaspaceSize=256m 表示将元空间的最大大小限制为 256MB。 + +```shell +- JVM_XMS=64m #-Xms default :1g +- JVM_XMX=64m #-Xmx default :1g +- JVM_XMN=16m #-Xmn default :512m +- JVM_MS=8m #-XX:MetaspaceSize default :128m +- JVM_MMS=8m #-XX:MaxMetaspaceSize default :320m +``` + +## 升级说明 + +> [升级手册](https://nacos.io/docs/latest/manual/admin/upgrading/) + +### 2.5.0 + +表结构发生变化 + +```sql +/******************************************/ +/* 表名称 = config_info since 2.5.0 */ +/******************************************/ +CREATE TABLE `config_info_gray` +( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` varchar(255) NOT NULL COMMENT 'data_id', + `group_id` varchar(128) NOT NULL COMMENT 'group_id', + `content` longtext NOT NULL COMMENT 'content', + `md5` varchar(32) DEFAULT NULL COMMENT 'md5', + `src_user` text COMMENT 'src_user', + `src_ip` varchar(100) DEFAULT NULL COMMENT 'src_ip', + `gmt_create` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP (3) COMMENT 'gmt_create', + `gmt_modified` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP (3) COMMENT 'gmt_modified', + `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', + `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id', + `gray_name` varchar(128) NOT NULL COMMENT 'gray_name', + `gray_rule` text NOT NULL COMMENT 'gray_rule', + `encrypted_data_key` varchar(256) NOT NULL DEFAULT '' COMMENT 'encrypted_data_key', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_configinfogray_datagrouptenantgray` (`data_id`,`group_id`,`tenant_id`,`gray_name`), + KEY `idx_dataid_gmt_modified` (`data_id`,`gmt_modified`), + KEY `idx_gmt_modified` (`gmt_modified`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='config_info_gray'; + +``` + +--- + +![Ms Studio](https://file.lifebus.top/imgs/ms_blank_001.png) diff --git a/apps/nacos-derby/data.yml b/apps/nacos-derby/data.yml new file mode 100644 index 000000000..79d52020d --- /dev/null +++ b/apps/nacos-derby/data.yml @@ -0,0 +1,16 @@ +additionalProperties: + key: nacos + name: Nacos + tags: + - WebSite + - Tool + - Middleware + - Local + shortDescZh: 动态服务发现、配置管理和服务管理平台 + shortDescEn: Dynamic service discovery, configuration and service management platform + type: website + crossVersionUpdate: true + limit: 0 + website: https://nacos.io/ + github: https://github.com/alibaba/nacos/ + document: https://nacos.io/docs/latest/what-is-nacos/ diff --git a/apps/nacos-derby/logo.png b/apps/nacos-derby/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e2bc7018468fa9fe881ff7df0c3ae396cd3d3e2b GIT binary patch literal 34308 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%0DWkPvdZrS@P(Qaj{!v2h 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