Docker搭建nacos集群

一、先搭建MySQL主从模式

Nacos使用delby作为内嵌数据库,在使用集群作为部署方式时,内嵌数据库无法保持数据同步与数据一致,故一般使用外接MySQL数据库的方式保存配置文件。使用一主一从的方式搭建,实现主从复制与读写分离。

1.拉取MySQL镜像
docker pull mysql:5.7
2.定义挂载目录
mkdir -p /usr/local/src/mysql-master/{data,conf}
3.准备挂载文件

先启动一个mysql的测试容器,并将该容器的my.cnf配置文件拷贝到刚创建的conf目录中。

// 先启动个测试容器
docker run -itd -p 3306:3306 \
--name mysql\
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
// 再将容器的配置文件拷贝到conf中
docker cp mysql:/etc/my.cnf /usr/local/src/mysql-master/conf
// 再复制一个子节点的配置文件
cp -r /usr/local/src/mysql-master /usr/local/src/mysql-slave
// 删掉刚启动的测试容器
docker stop mysql
docker rm mysql
4.创建主从容器
## 先创建master容器
docker run -itd -p 3301:3306 \
--name mysql-master \
-v /usr/local/src/mysql-master/conf/my.cnf:/etc/my.cnf \
-v /usr/local/src/mysql-master/data:/var/lib/mysql \
--privileged=true \
--restart=always \
-e MYSQL_ROOT_PASSWORD=root \
-e TZ=Asia/Shanghai \
mysql:5.7

## 再创建slave容器
docker run -itd -p 3302:3306 \
--name mysql-slave \
-v /usr/local/src/mysql-slave/conf/my.cnf:/etc/my.cnf \
-v /usr/local/src/mysql-slave/data:/var/lib/mysql \
--privileged=true \
--restart=always \
-e MYSQL_ROOT_PASSWORD=root \
-e TZ=Asia/Shanghai \
mysql:5.7
5.修改master主配置和slave从配置

按照如下分别修改主从节点的配置,修改完后需要重启容器。

## 修改master配置
vim /usr/local/src/mysql-master/conf/my.cnf

# 保持唯一
server_id=1
# 给log起个名字,可以随意,有意义就行
log-bin=master-bin
# 关闭只读模式,对于只读模式的解释看下文
read-only=0

# 配置需要忽略的库(也就是不需要同步),也可以配置多个
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-ignore-db=performance_schema
binlog-ignore-db=sys


## 修改slave配置
vim /usr/local/src/mysql-slave/conf/my.cnf
# 保持唯一
server_id=2
# 开启只读模式,对于只读模式的解释看下文
read-only=1
## 以下配置文件只在从节点的数据需要同步到其他的节点时使用
# 给log起个名字,可以随意,有意义就行
log-bin=slave-bin
6.在master节点创建数据同步用户
1.先进入master节点容器中
docker exec -it 7381b6866818 bash
2.登录到mysql并创建一个同步用户slave,再给这个用户授权
mysql -uroot -p 
create user 'slave'@'%' identified with mysql_native_password by '123456';
grant replication slave on *.* to 'slave'@'%';
flush privileges;
3.查看数据库的状态,记录file和position的值,后续要用
show master status;

在这里插入图片描述

7.配置slave容器

先查看master容器的ip,后续配置slave节点时需要用到这个ip
docker inspect --format='{{.NetworkSettings.IPAddress}}' 7381b6866818
在这里插入图片描述

1.先进入slave节点容器中
docker exec -it 9dd309c3559a bash
2.登录到mysql
mysql -uroot -p 
3.设置如下配置
mysql> change master to
    -> master_host='172.17.0.2',  					## 查询master容器的ip
    -> master_port=3306,  		 					## 端口
    -> master_user='slave',							## 上面创建的同步用户账号
    -> master_password='123456',					## 同步账号密码
    -> get_master_public_key=1,						## mysql8配置主从复制必须的
    -> master_log_file='master-bin.000001',   		## show master status中查询到的那两个信息
    -> master_log_pos=858;							## show master status中查询到的那两个信息
4.启动slave节点
start slave;
5.查看slave的状态
show slave status\G;

Slave_IO_Running以及Slave_SQL_Running都为Yes代表成功。
在这里插入图片描述

8.创建nacos数据库

在master节点的数据库中执行创建nacos数据库的脚本。

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info   */
/******************************************/
CREATE DATABASE nacos_config;
USE nacos_config;

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(255) DEFAULT NULL,
  `content` longtext NOT NULL COMMENT 'content',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(20) DEFAULT NULL COMMENT 'source ip',
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  `encrypted_data_key` text NOT NULL 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';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_aggr   */
/******************************************/
CREATE TABLE `config_info_aggr` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(255) NOT NULL COMMENT 'group_id',
  `datum_id` varchar(255) NOT NULL COMMENT 'datum_id',
  `content` longtext NOT NULL COMMENT '内容',
  `gmt_modified` datetime NOT NULL COMMENT '修改时间',
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';


/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_beta   */
/******************************************/
CREATE TABLE `config_info_beta` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `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',
  `beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(20) DEFAULT NULL COMMENT 'source ip',
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  `encrypted_data_key` text NOT NULL COMMENT '秘钥',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_tag   */
/******************************************/
CREATE TABLE `config_info_tag` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `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',
  `tag_id` varchar(128) NOT NULL COMMENT 'tag_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 '2010-05-05 00:00:00' COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(20) DEFAULT NULL COMMENT 'source ip',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = 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,
  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';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = 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 '2010-05-05 00:00:00' COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = his_config_info   */
/******************************************/
CREATE TABLE `his_config_info` (
  `id` bigint(64) unsigned NOT NULL,
  `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00',
  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00',
  `src_user` text,
  `src_ip` varchar(20) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  `encrypted_data_key` text NOT NULL COMMENT '秘钥',
  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='多租户改造';


/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = 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 '2010-05-05 00:00:00' COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' 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,
	password varchar(500) NOT NULL,
	enabled boolean NOT NULL
);

CREATE TABLE roles (
	username varchar(50) NOT NULL,
	role varchar(50) NOT NULL,
	constraint uk_username_role UNIQUE (username,role)
);

CREATE TABLE permissions (
    role varchar(50) NOT NULL,
    resource varchar(512) NOT NULL,
    action varchar(8) NOT NULL,
    constraint uk_role_permission UNIQUE (role,resource,action)
);

INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);

INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');

二、搭建单个NACOS服务

1.拉取nacos镜像
## 如果是部署在Linux系统的话拉取的是nacos/nacos-server这个镜像
docker pull nacos/nacos-server
## 如果是部署在macOS系统的话拉取的是zhusaidong/nacos-server-m1:2.0.3这个镜像
docker pull zhusaidong/nacos-server-m1:2.0.3
2.启动nacos容器
docker run -itd \
--network=host \
-e PREFER_HOST_MODE=ip \
-e MODE=standalone \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=127.0.0.1 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=password \
-e JVM_XMS=256m \
-e JVM_XMX=256m \
-e JVM_XMN=256m \
-p 8848:8848 \
--name nacos \
--privileged=true \
--restart=always \
nacos/nacos-server

参数定义:
--network=host:设置网络模式为主机模式,容器启动后就可以使用主机的IP地址进行网络通信;
PREFER_HOST_MODE:是否支持hostname,值为:hostname / ip,默认为:ip;
MODE:部署模式,值为:cluster / standalone,默认为:cluster;
SPRING_DATASOURCE_PLATFORM:standalone 支持 mysql,mysql / empty,默认为:empty;
MYSQL_SERVICE_HOST:mysql 主节点host;
MYSQL_SERVICE_PORT:mysql 主节点端口;
MYSQL_SERVICE_USER:mysql 主节点用户名;
MYSQL_SERVICE_PASSWORD:mysql 主节点用户密码;

在2.2.2版本之前的Nacos默认控制台,无论服务端是否开启鉴权,都会存在一个登录页;这导致很多用户被误导认为Nacos默认是存在鉴权的。Nacos自2.2.2版本开始,在未开启鉴权时,默认控制台将不需要登录即可访问,同时在控制台中给予提示,提醒用户当前集群未开启鉴权。在用户开启鉴权后,控制台才需要进行登录访问。通过docker拉取的官方镜像启动的nacos容器需要在上面的启动命令添加几个环境变量参数才能开启鉴权进行使用。参数如下:

-e NACOS_AUTH_ENABLE=true \   		## 是否开启权限系统
-e NACOS_AUTH_IDENTITY_KEY=test \	## 配置自定义身份识别的 key 
-e NACOS_AUTH_IDENTITY_VALUE=test \	## 配置自定义身份识别的 value
-e NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE=true \    ## 鉴权白名单功能
-e NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789 \
3.登录nacos管理页面

在浏览器中输入http://ip:8848/nacos,使用 username:nacos,password:nacos 登录系统。
在这里插入图片描述

三、搭建NACOS集群

由于只部署单个节点的话,可靠性还是相对较差,一旦nacos宕机,所有服务将不可用了,所以我们可以搭建nacos集群来增加服务的可靠性。

1.创建多个nacos容器

既然是要搭建集群,那肯定是要创建多个容器,创建容器的命令与创建单个节点类似,主要区别在于,创建集群需要添加下面两个配置:

-e MODE=cluster \     -- 这里选择部署模式为集群
-e NACOS_SERVERS="127.0.0.1:8846 127.0.0.1:8847 127.0.0.1:8848" \  
 --这里是设置集群中每个节点的ip和端口,如果是单台服务器上部署多个节点的话,每个节点的ip一样的话就要保证每个节点的端口不同,如果是多台服务器部署的话,每个节点的ip不同,就可以保持每个节点的端口相同。
1.1 创建第一个nacos容器
docker run -itd \
-e PREFER_HOST_MODE=ip \
-e MODE=cluster  \
-e NACOS_SERVERS="127.0.0.1:8846 127.0.0.1:8847 127.0.0.1:8848"  \
-e NACOS_SERVICE_IP=127.0.0.1 \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=127.0.0.1 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
-e JVM_XMS=256m \
-e JVM_XMX=256m \
-e JVM_XMN=256m \
-p 8846:8848 \
--name nacos1 \
--privileged=true \
--restart=always \
nacos/nacos-server
1.2 创建第二个nacos容器
docker run -itd \
-e PREFER_HOST_MODE=ip \
-e MODE=cluster  \
-e NACOS_SERVERS="127.0.0.1:8846 127.0.0.1:8847 127.0.0.1:8848"  \
-e NACOS_SERVICE_IP=127.0.0.1 \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=127.0.0.1 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
-e JVM_XMS=256m \
-e JVM_XMX=256m \
-e JVM_XMN=256m \
-p 8847:8848 \
--name nacos2 \
--privileged=true \
--restart=always \
nacos/nacos-server
1.3 创建第三个nacos容器
docker run -itd \
-e PREFER_HOST_MODE=ip \
-e MODE=cluster  \
-e NACOS_SERVERS="127.0.0.1:8846 127.0.0.1:8847 127.0.0.1:8848"  \
-e NACOS_SERVICE_IP=127.0.0.1 \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=127.0.0.1 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
-e JVM_XMS=256m \
-e JVM_XMX=256m \
-e JVM_XMN=256m \
-p 8848:8848 \
--name nacos3 \
--privileged=true \
--restart=always \
nacos/nacos-server

四、配置nginx反向代理实现负载均衡

参考我的另一篇文章: https://blog.csdn.net/qq_33807380/article/details/128841504

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值