1)SpringCloud Alibaba微服务实战一 基础环境准备

 根据版本说明中的推荐,我们这里选择SpringBoot的版本为2.4.2,SpringCloud Alibaba的版本则为2021.1,组件对应关系如下

内容主要基于三个微服务:用户服务UserService,订单服务OrderService,账单服务AccountService。

贯穿这3个项目模块,其他的还可以比如 支付 活动 库存的,但是先这3个,以及再加,在大项目面用到的组件有:

  • 注册中心、配置中心 Nacos
  • 限流 Sentinel
  • 分布式事务 Seata
  • 网关 SpringCloud Gateway
  • 认证授权 Spring Cloud Oauth2
  • docker、docker-compose

本篇内容就是使用Dokcer-compose部署Nacos,Sentinel,MySQL,作为后面的文章的基础环境

Nacos是阿里的一个开源产品,是针对微服务架构中的服务发现、配置管理、服务治理的综合型解决方案。(用来实现配置中心和服务注册中心)

 官网:什么是 Nacos

1.在Docker中安装docker-compose

curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

赋予权限

chmod +x /usr/local/bin/docker-compose

查看版本号

docker-compose --version

2.Mysql容器化

由于nacos需要依赖于MySQ作为资L源存储,所以在编写完整docker-compose之前我会先用docker启动临时的mysql容器,然后准备好nacos需要的数据库

创建临时容器

docker run --rm --name mysql -e MYSQL_ROOT_PASSWORD=root -v /app/cloud/mysql/data:/var/lib/mysql -p 3306:3306 -d mysql:5.7

使用MySQL客户端链接,导入nacos数据库

/*

 * 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.

 */

/******************************************/

/*   数据库全名 = nacos_config   */

/*   表名称 = 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(255) DEFAULT NULL,

  `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,

  `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,

  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 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',

  `tenant_id` varchar(128) DEFAULT '' 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 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',

  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 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容量信息表';

/******************************************/

/*   数据库全名 = 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 CURRENT_TIMESTAMP,

  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,

  `src_user` text,

  `src_ip` varchar(50) DEFAULT NULL,

  `op_type` char(10) DEFAULT NULL,

  `tenant_id` varchar(128) DEFAULT '' 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 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,

  `password` varchar(500) NOT NULL,

  `enabled` boolean NOT NULL

);

CREATE TABLE `roles` (

  `username` varchar(50) NOT NULL,

  `role` varchar(50) NOT NULL,

  UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE

);

CREATE TABLE `permissions` (

    `role` varchar(50) NOT NULL,

    `resource` varchar(255) NOT NULL,

    `action` varchar(8) NOT NULL,

    UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE

);

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

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

停止容器,由于加了--rm参数,所以容器会自动删除

docker stop [容器ID|容器名称]

3.配置文件

创建/usr/local/docker/cloud-alibaba目录

cd  /usr/local/docker/cloud-alibaba

在cloud-alibaba目录下创建docker-compose.yaml配置文件

vim docker-compose.yaml

 文件内容

version: "3.8"
services:
  mysql:
    image: mysql:5.7
    restart: always
    ports:
      - "3306:3306"
    environment:
      - "MYSQL_ROOT_PASSWORD=root"
    volumes:
      - /app/cloud/mysql/data:/var/lib/mysql

  nacos:
    image: nacos/nacos-server:1.4.1
    container_name: nacos
    hostname: nacos
    restart: always
    environment:
      - MODE=standalone
      - TZ=Asia/Shanghai
      - NACOS_SERVER_PORT=8848
      - JVM_XMS=256m
      - JVM_XMX=256m
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_SERVICE_HOST=192.168.44.132
      - MYSQL_SERVICE_PORT=3306
      - MYSQL_SERVICE_DB_NAME=nacos_config
      - MYSQL_SERVICE_USER=root
      - MYSQL_SERVICE_PASSWORD=root
      - PREFER_HOST_MODE=hostname
    volumes:
      - /app/cloud/nacos/logs:/home/nacos/logs
    ports:
      - "8848:8848"
  rabbitmq:
    hostname: rabbitmq
    environment:
      RABBITMQ_DEFAULT_VHOST: "root"
      RABBITMQ_DEFAULT_USER: "root"
      RABBITMQ_DEFAULT_PASS: "root"
    image: "rabbitmq:3.9.14-management"
    restart: always


    volumes:
      - "/usr/local/coin/rabbitmq/data:/var/lib/rabbitmq"
      - "/usr/local/coin/rabbitmq/log:/var/lib/rabbitmq/log"
    ports:
      - "15672:15672"
      - "4369:4369"
      - "5672:5672"
      - "25672:25672"

  sentinel:
    image: bladex/sentinel-dashboard:1.8.0
    container_name: sentinel
    ports:
      - "8858:8858"
    restart: always


  portainer:
    image: portainer/portainer  
    container_name: portainer
    restart: always


    ports:
      - "9000:9000"
    volumes:
      - ./data:/data
      - /var/run/docker.sock:/var/run/docker.sock

  seata-server:
    image: seataio/seata-server:1.3.0
    hostname: seata-server
    ports:
      - 8091:8091
    environment:
      - SEATA_PORT=8091
      - STORE_MODE=file
    expose:
      - 8091
    restart: always


  nginx:    
    image: nginx:1.9.9    
    container_name: nginx199 
    ports:
      - "80:80"          
    restart: always


  redis-server:    
    image: redis:4.0.0    
    container_name: redis4.0 
    ports:
      - "6379:6379"          
    volumes: 
      - /usr/local/redis/conf/redis.conf:/redis.conf
      - /usr/local/redis/data:/data
    restart: always  
 
  zookeeper-server:    
    image: wurstmeister/zookeeper    
    container_name: zookeeper 
    ports:
      - "2181:2181"          
    restart: always

  redis-server:    
    image: redis:4.0.0    
    container_name: redis4.0 
    ports:
      - "6379:6379"          
    volumes: 
      - /usr/local/redis/conf/redis.conf:/redis.conf
      - /usr/local/redis/data:/data
    restart: always
 

  •  - MYSQL_SERVICE_HOST=192.168.44.132  修改成自己的主机IP地址
  • - JVM_XMS=256m:表示JVM启动时分配的堆内存为256MB
  • - JVM_XMX=256m :同时堆内存的最大限制也为256MB。可以避免JVM占用过多的系统资源

  1. MySQL Service(mysql):

    • 使用MySQL 5.7的官方镜像。
    • 映射端口3306到主机,允许外部访问数据库。
    • 设置了MySQL的root用户密码,并且将数据卷挂载到主机的/app/cloud/mysql/data目录。
  2. Nacos Service(nacos):

    • 使用Nacos 1.4.1的官方镜像。
    • 设置了Nacos的环境变量,包括使用的数据库、时区等配置。
    • 映射端口8848到主机,允许外部访问Nacos服务。
    • 将日志文件挂载到主机的/app/cloud/nacos/logs目录。
  3. RabbitMQ Service(rabbitmq):

    • 使用RabbitMQ 3.9.14的官方镜像,并启用了管理插件。
    • 设置了RabbitMQ的默认虚拟主机、用户和密码。
    • 将数据卷挂载到主机的/usr/local/coin/rabbitmq/data/usr/local/coin/rabbitmq/log目录。
    • 映射了几个RabbitMQ相关的端口到主机,允许外部访问RabbitMQ服务和管理界面。
  4. Sentinel Service(sentinel):

    • 使用BladeX Sentinel Dashboard 1.8.0的镜像。
    • 映射端口8858到主机,允许外部访问Sentinel服务。
  5. Portainer Service(portainer):

    • 使用Portainer的官方镜像。
    • 映射端口9000到主机,允许外部访问Portainer管理界面。
    • 将容器的数据挂载到主机的./data目录和Docker的Unix套接字。
  6. Seata Server Service(seata-server):

    • 使用Seata 1.3.0的官方镜像。
    • 映射端口8091到主机,允许外部访问Seata Server。
    • 设置了Seata的环境变量,包括存储模式等配置。
  7. Nginx Service(nginx):

    • 使用Nginx 1.9.9的官方镜像。
    • 映射端口80到主机,允许外部访问Nginx服务。
  8. Redis Service(redis-server):

    • 使用Redis 4.0.0的官方镜像。
    • 映射端口6379到主机,允许外部访问Redis服务。
    • 将Redis的配置文件和数据目录挂载到主机。
  9. Zookeeper Service(zookeeper-server):

    • 使用wurstmeister制作的Zookeeper镜像。
    • 映射端口2181到主机,允许外部访问Zookeeper服务。

4.在cloud-alibaba目录下执行 docker-compose up -d 命令启动

docker-compose up -d

 启动成功

关闭

docker-compose down

4.环境验证

nacos

Nacos是一个用于动态服务发现、配置管理和服务元数据的开源平台,由阿里巴巴集团开发并开源。它提供了服务注册与发现、配置管理和服务元数据管理等功能,帮助构建和管理云原生应用。

 http://192.168.44.132:8848/nacos

        账号:nacos

        密码:nacos

在服务配置中添加一条数据

nacos安装成功!

sentinel

Sentinel是一款开源的分布式系统的流量防卫兵,由阿里巴巴集团开发并开源。它旨在解决分布式系统中流量控制、熔断降级、系统负载保护等问题,提供了实时的监控和保护机制。

http://192.168.44.132:8858/#/login

        账号:sentinel

        密码:sentinel

sentinel安装成功!

Portainer

Portainer是一个轻量级的容器管理工具,它提供了直观易用的用户界面,帮助用户更轻松地管理 Docker 环境。通过 Portainer,您可以方便地查看和管理 Docker 主机上的容器、镜像、卷和网络等资源,而无需熟悉复杂的命令行操作。

http://192.168.44.132:9000

        账号:admin

        密码:12345678

这里我们选择本地连接

RabbitMQ 

RabbitMQ是一个开源的消息代理软件,它实现了高级消息队列协议(AMQP),可以作为消息中间件在分布式系统中进行消息传递。RabbitMQ由Erlang语言编写,具有高度可靠、高可用性、高扩展性和跨平台等特点,被广泛应用于企业级应用程序的消息传递和异步处理。

http://192.168.44.132:15672

        账号:root

        密码:root

内网穿透

C:\Windows\System32\drivers\etc\host文件中添加"192.168.44.132 microservice"的作用是将microservice这个主机名指向IP地址为192.168.44.132的虚拟机。这样,当在本地计算机上访问microservice时,会直接使用指定的IP地址进行通信,而不需要通过DNS服务器进行解析。这种方式可以在一定程度上加快访问速度,同时也方便了开发和测试过程中对不同主机名和IP地址的管理和配置。

通常情况下,我们可以将一些测试用的服务发布在内网环境下,通过将其对应的域名或主机名映射到对应的IP地址,使得本地计算机可以直接访问内网中的服务

去文件夹中修改host

C:\Windows\System32\drivers\etc\host


端口开放

如果进不去可能是端口没有开放

查询有哪些端口是开启的:

firewall-cmd --list-port

开启端口:

firewall-cmd --zone=public --add-port=3306/tcp --permanent

firewall-cmd --zone=public --add-port=8848/tcp --permanent

firewall-cmd --zone=public --add-port=8858/tcp --permanent

firewall-cmd --zone=public --add-port=8019/tcp --permanent

firewall-cmd --zone=public --add-port=9000/tcp --permanent

firewall-cmd --zone=public --add-port=80/tcp --permanent

firewall-cmd --zone=public --add-port=6379/tcp --permanent

firewall-cmd --zone=public --add-port=2181/tcp --permanent

重启防火墙

firewall-cmd --reload

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值