Java开发 - 消息队列之Kafka初体验

大数据之Kafka————java来实现kafka相关操作 生产者多线程是一种常见的技术实践,可以提高消息生产的并发性和吞吐量。通过将消息生产任务分配给多个线程来并行地发送消息,可以有效地利用系统资源,加快消息的发送速度。Java中写在生产者输入内容在kafka中可以让消费者提取。(2)、Producer进行多线程操作。一、在java中配置pom。通过java来实现消费者。(2)、设置多人访问。 阅读详情

目录

前言

Kafka

什么是Kafka

Kafka软件结构

Kafka的特点

怎么启动Kafka

下载Kafka

配置Kafka 

Zookeeper

启动Kafka

Kafka案例

添加依赖

添加配置

配置启动类

创建生产者

创建消费者

测试

结语


前言

前几日总结了消息队列的一些知识,相信看完的同学们对消息队列的功能和作用都多少有了些基础的了解,为了让大家更快的上手消息队列,今天将给大家带来一篇大数据中常用的Kafka的介绍和实战教程,学完此篇,你将了解什么是Kafka,怎么使用Kafka和怎么将Kafka应用到项目中。

Kafka

什么是Kafka

Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。

Kafka软件结构

Producer:生产者,消息发送方,消息来源;

Consumer:消费者,消息接收方;

Topic:话题,消息收发方根据话题才能找到对的那个人,不会乱发;

Record:消息记录,是生产者和消费者传递的内容,保存在指定Topic内。

Kafka的特点

前文提到,Kafka是针对大数据设计的,官方号称并发1w/s,运行时堪比内存,可见其功能还是很强大的。

实际运行中,Kafka将消息队列中的信息保存在硬盘,它堪比内存的效率是因为对硬盘的读取规则做了优化,这点很强。主要是:顺序读写,零拷贝,日志压缩等技术。详情推荐这篇博客:整理了一周的Kafka规划和优化方案

Kafka在处理队列中的数据时,能够一直向服务器硬盘中保存队列信息,理论上没有大小限制,除非服务器硬盘满了。默认信息保存7天,时间可配置,数据量比较大的情况一天一处理,可以有效提高服务器性能,减少Kafka消耗。

怎么启动Kafka

下载Kafka

下载地址:Kafka下载地址

下载后博主是放在一个叫Kafka的文件夹内,文件夹下放下载后解压的Kafka和一个用来存储Kafka运行过程中产生数据的data(空目录)文件:

配置Kafka 

进入 kafka_2.13-2.4.1/config文件,用记事本打开如下文件:

 将dataDir后面的路径修改成你自己的data文件夹地址:

保存,关闭。再打开server.properties文件:

 修改log.dirs后面的路径为你自己电脑上data的地址,和上面的地址是一样的:

做完这些记得保存啊,不保存啥用也没有。

Zookeeper

说起Zookeeper,其实我们上面的配置是配置的Zookeeper,但却和Kafka息息相关,想知道他们之间的关系吗?我们继续往下看。

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

上面的解释很官方,不是很好理解。通俗地说就是:早期的服务器软件安装后都有各自的配置,但是要安装的软件很多,配置多了就不好管理了,Zookeeper可以修改服务器系统中所有软件的配置,久而久之,很多软件就删除了自己写配置文件的功能,改从Zookeeper中获取。ZooKeeper就像一个动物园的饲养员,为什么说是动物园饲养员呢,你看MySql的标志是不是海豚,Tomcat是只猫,等等,你去看,这些软件都是动物标志,像个动物园一样。

启动Kafka

启动kafka要先启动zookeeper,mac电脑终端进入Kafka的bin文件目录下:

# 进入Kafka文件夹
cd Desktop/JAVATOOL/kafka/kafka_2.13-2.4.1/bin
# 启动Zookeeper服务
./zookeeper-server-start.sh ../config/zookeeper.properties 
# 启动Kafka服务
./kafka-server-start.sh ../config/server.properties 

zookeeper启动后终端输出: 

kafka启动后终端输出:

主要是看到这个started字样。

关闭Kafka命令: 

# 关闭Kafka服务
./kafka-server-stop.sh 
# 启动Zookeeper服务
./zookeeper-server-stop.sh

需要先关闭Kafka,再关闭zookeeper,否则Kafka会一直报断开连接的错。 

文件路径写你自己的,不要写博主的,两个服务启动用两个窗口来运行命令,运行期间窗口不要关闭。

Windows电脑需要进入到kafka/bin/windows目录下,接着输入以下命令:

启动zookeeper:

zookeeper-server-start.bat ..\..\config\zookeeper.properties

启动kafka: 

kafka-server-start.bat ..\..\config\server.properties

window关闭服务直接x掉窗口就可以。 

Kafka案例

我们在此前微服务项目的cart子项目中演示Kafka的消息收发,下面跟着博主一步步来做吧。

添加依赖

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
</dependency>

这里特别提醒下,没有看前面微服务项目的童鞋你需要添加的依赖会少一些,建议先去看看微服务内容,把微服务基础项目先搭建起来,后续的开发很多都会在此基础上进行。 传送门:Java开发 - 数风流人物,还看“微服务”

添加配置

spring:
  kafka:
    # 定义kafka的位置
    bootstrap-servers: localhost:9092
    # 话题的分组名称,是必须配置的
    # 为了区分当前项目和其他项目使用的,防止不同项目相同话题的干扰
    # 本质是在话题名称前添加项目名称为前缀来防止的
    consumer:
      group-id: cart

配置启动类

在启动类上添加两个注解:

// 启动kafka的功能
@EnableKafka
// 为了测试kafka,我们可以周期性的发送消息到消息队列
// 使用SpringBoot自带的调度工具即可
@EnableScheduling

  

创建生产者

在cart包下新建一个kafka包,包下建一个叫Producer的类:

package com.codingfire.cloud.cart.kafka;

import com.codingfire.cloud.commons.pojo.cart.entity.Cart;
import com.google.gson.Gson;
import org.apache.commons.lang.math.RandomUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

// 我们需要周期性的向Kafka发送消息
// 需要将具备SpringBoot调度功能的类保存到Spring容器才行
@Component
public class Producer {
    // 能够实现将消息发送到Kafka的对象
    // 只要Kafka配置正确,这个对象会自动保存到Spring容器中,我们直接装配即可
    // KafkaTemplate<[话题名称的类型],[传递消息的类型]>
    @Autowired
    private KafkaTemplate<String,String> kafkaTemplate;

    // 每隔10秒向Kafka发送信息
    int i=1;
    // fixedRate是周期运行,单位毫秒 10000ms就是10秒
    @Scheduled(fixedRate = 10000)
    // 这个方法只要启动SpringBoot项目就会按上面设置的时间运行
    public void sendMessage(){
        // 实例化一个Cart类型对象,用于发送消息
        Cart cart=new Cart();
        cart.setId(i++);
        cart.setCommodityCode("PC100");
        cart.setPrice(RandomUtils.nextInt(100)+200);
        cart.setCount(RandomUtils.nextInt(5)+1);
        cart.setUserId("UU100");
        // 将cart对象转换为json格式字符串
        Gson gson=new Gson();
        // 执行转换
        String json=gson.toJson(cart);
        System.out.println("本次发送的消息为:"+json);
        // 执行发送
        // send([话题名称],[发送的消息]),需要遵循上面kafkaTemplate声明的泛型类型
        kafkaTemplate.send("myCart",json);

    }
}

创建消费者

在kafka包下创建Consumer类:

package com.codingfire.cloud.cart.kafka;

import com.codingfire.cloud.commons.pojo.cart.entity.Cart;
import com.google.gson.Gson;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;

// 因为Kafka接收消息是自动的,所以这个类也必须交由Spring容器管理0
@Component
public class Consumer {

    // SpringKafka框架接收Kafka中的消息使用监听机制
    // SpringKafka框架提供一个监听器,专门负责关注指定的话题名称
    // 只要该话题名称中有消息,会自动获取该消息,并调用下面方法
    @KafkaListener(topics = "myCart")
    // 上面注解和下面方法关联,方法的参数就是接收到的消息
    public void received(ConsumerRecord<String,String> record){
        // 方法参数类型必须是ConsumerRecord
        // ConsumerRecord<[话题名称类型],[消息类型]>
        // 获取消息内容
        String json=record.value();
        // 要想在java中使用,需要转换为java对象
        Gson gson=new Gson();
        // 将json转换为java对象,需要提供转换目标类型的反射
        Cart cart=gson.fromJson(json,Cart.class);
        System.out.println("接收到对象为:"+cart);
    }


}

测试

下面,我们启动项目,由于我们的项目配置了nacos和seata,所以这两个服务要保证是开启的。如果你是新起的项目可以不用。

项目运行后,根据我们的代码,我们应该是每10s能到一条消息输入和输出的,我们在控制台看一下:

说明我们的测试是成功的,我们已经完成了一个完整的消息发送和接收的过程。 

但是,这也只是Kafka一个最简单的使用案例,关于Kafka肯定不止是做这么一点点事情,关于Kafka更多的功能,博主也还在学习中,推荐一个网址给大家学习:kafka中文教程

结语

最后了,说点什么吧。只能说,Kafka博大精深,微服务深不可测,真不是三言两语,三篇两篇就能说得清楚的,这篇博客就如标题一样,只能算是初体验了,相较于es和redis来说,这篇博客只能算是皮毛,要学的东西还有很多很多,最重要的是实战。

最后要说的是专注,学习不要好高骛远,专注于一个点去学习,光是微服务中任何一个辅助软件都足够研究很久了,先学会用,其次再深入学习,关于更多Kafka的实战应用,后期博主吃透后会给大家详细剖析,一起努力吧。

kafka:java集成 kafka(springboot集成、客户端集成) 对于java的kafka集成,一般选用springboot集成kafka,但可能由于对接方kafka老旧、kafka不安全等问题导致kafak版本与spring版本不兼容,这个时候就得自己根据kafka客户端api集成了。 阅读详情

相关推荐

Java+Kafka消息队列

本文主要针对,Java端对Kafka消息队列的生产和消费。Kafka的安装部署,请看查看相关文章。 笔者最近所用的是Spring mvc,监听文件路径,然后将读取到的文件内容发送到消息队列中。由另外系统去消费消息。 当然消息队列作为消息交换机,本系统既有生产消息也有消费消息。不做详述。 生成者代码相对简单很多。 package com.dhc.test.kafka; im

王奇的博客 3394

Kafka 使用java实现,快速入门

【代码】Kafka 集成 SpringBoot, 快速入门。

Qynwang的博客 9393

消息队列kafka的面试问题汇总

1.为什么要使用消息队列MQ? kafka的作用:解耦,异步,削峰(解决高峰期瘫痪) 2.架构中引入MQ之后可能存在的问题? 系统的可用性降低了,因为一旦MQ遇到故障,整个系统就歇菜了 系统的复杂性变高,因为多加了一个环节 一致性问题 3.消息队列的比较 activeMQ:吞吐量万级,但社区维护慢 RabbitMQ:吞吐量万级,社区好性能可以,有后台管理界面,但是erlang语言开发,源码不好解读...

XDSXHDYY的博客 2031

通过java方式使用Kafka

基于Java API方式使用Kafka

libaowenBlog的博客 1万+

Kafka入门(5) -- Java编程操作Kafka

1. 同步生产消息到Kafka中 1.1 需求 接下来,我们将编写Java程序,将1-100的数字消息写入到Kafka中。 1.2 开发步骤 导入Maven Kafka POM依赖 使用以下方式来编写第一个Kafka示例程序 参考以下文档:参考文档 创建用于连接Kafka的Properties配置 创建一个生产者对象 发送消息到指定 Topic 关闭生产者 参考代码: /** * 生产者程序:将1-100的数字消息写入到Kafka中 */ public class _1ProducerTest

erainm 1588

Java与Kafka:消息队列使用指南

Apache Kafka 是一个分布式的流处理平台,它可以用来构建实时数据管道和流应用程序。Kafka 以一种高吞吐量、低延迟的方式处理数据,非常适合用于实时数据流场景。主题(Topic):Kafka 中的数据被组织成主题,每个主题就是一个消息队列。分区(Partition):为了提高吞吐量和容错性,主题被分成多个分区。生产者(Producer):负责向 Kafka 发布消息。消费者(Consumer):负责从 Kafka 中读取消息。消费者组。

java专栏 1438

Java开发 - 消息队列之RabbitMQ初体验

RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。所以在Java业务中使用很多,目前我所知道的很多都是用的此消息队列,只不过大家评价都是:功能强,性能一般。与其相反的,就是Kafka了:性能强,功能弱。

CodingFire的博客 4907

Java消息队列应用:Kafka、RabbitMQ选择与优化

Kafka与RabbitMQ是Java应用中两种主流消息队列技术。Kafka采用分布式架构,以高吞吐量和顺序消息见长,适合大数据实时处理场景;RabbitMQ基于AMQP协议,支持灵活路由和多种消息模型,适用于复杂业务场景。本文对比了两者的架构特点、性能表现和适用场景,并提供了Java代码示例(包括生产者和消费者实现)。选择时应考虑消息模型、吞吐量需求、持久性要求等因素:RabbitMQ适合企业应用集成和微服务通信,而Kafka则更擅长日志收集和流数据处理。

shrgegrb的博客 1479

基于 Java 的消息队列选型年度总结:RabbitMQ、RocketMQ、Kafka 实战对比

消息队列技术选型分析:RabbitMQ、RocketMQ与Kafka对比 本文从实战角度对三大主流消息队列进行多维度对比分析。RabbitMQ基于AMQP协议,提供灵活路由和图形化管理,适合中小型系统;RocketMQ由阿里开发,具备金融级高可靠性和高吞吐特性;Kafka则专为高吞吐流处理设计,与大数据生态深度集成。三者各具特色:RabbitMQ路由灵活但吞吐有限,RocketMQ在事务消息和顺序消息方面表现优异,Kafka则在大规模数据处理上优势明显。文章通过架构图、性能指标表和典型场景分析,为开发者提供

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

Halcon-AOI外观缺陷检测系列

Halcon-AOI外观缺陷检测系列

Jumy_S的博客 1668

S32K144 LPI2C Master/Slave模式配置与多设备通信实战

本文详细介绍了NXP S32K144微控制器中LPI2C模块的主从模式配置与多设备通信实战。内容涵盖硬件连接、引脚配置、主从模式深度设置、中断/DMA应用,并通过AT24C16 EEPROM、SHT30传感器等实例,解析了多设备通信中的地址切换、时序控制及常见问题排查技巧,帮助开发者高效实现基于LPI2C的稳定通信。

weixin_29158047的博客 269

【Kafka 进阶之路】Kafka 消息队列详解

✋ 简介:大家好 ~ 欢迎来到青蛙的池塘,这里是技术分享的池塘 ~📕 系列专栏:Java 源码系列、优化方案系列、生产问题系列等💡 博主正在努力完成 2025 - 2026 年计划:基石计划✍️ 雄关漫道真如铁,而今迈步从头越!

Y1zH1yuan的博客 3114

告别手动抓信号!Synopsys AXI VIP的Port Monitor实战:5分钟搞定与Scoreboard的TLM连接

本文详细介绍了Synopsys AXI VIP的Port Monitor功能,帮助验证工程师快速实现与Scoreboard的TLM连接,5分钟内完成自动数据收集。通过实战指南和常见问题排查,提升验证效率,告别手动抓信号的繁琐流程。

weixin_30565327的博客 300

Java工具08-Java消息队列:Kafka与RabbitMQ

Java消息队列:Kafka与RabbitMQ对比指南 本文全面对比了Java生态中两大主流消息队列Kafka和RabbitMQ的核心差异。Kafka是一种高吞吐量的分布式流处理平台,基于日志流模型,适合大数据场景;RabbitMQ则是灵活路由的企业级消息中间件,基于AMQP协议,适合业务解耦。 在架构设计上,Kafka采用主题/分区模型,强调批量处理和顺序存储;RabbitMQ通过交换器/队列实现多模式路由。性能方面,Kafka吞吐量更高但延迟较大,RabbitMQ延迟更低但吞吐量中等。两者在可靠性保障、

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

github创建账号第一步始终出错

github创建账号总结:第一次注册GitHub,填好用户名邮箱密码后进入下一步就卡在哪里,上面还提示Unable to verify your captcha response等,进入网址的解决办法以及下载其他的浏览器也无法解决,用手机浏览器抱着试一试的心态竟然成功了,分享给大家。手机下载谷歌浏览器,进入GitHub正常注册,能向下继续,邮箱验证完以后再用电脑登陆就ok啦

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 4377

CAPL编程规范与最佳实践

通过本文的学习,读者应该对CAPL编程规范与最佳实践有了初步的了解,并能够编写高质量的CAPL脚本。在实际项目中,CAPL的应用非常广泛,希望读者能够通过不断的学习和实践,掌握更多的CAPL技巧,提高自己的开发能力。

闲人编程的博客 1750

Java开发之消息队列

简介 介绍消息队列的重要性 介绍Java程序员常用的Kafka消息队列 介绍Kafka内部的一些机制及注意问题 为什么要使用消息队列? 比较常见的作用有3点,解耦、异步处理、流量削峰,这里分别一一介绍这些特点。 解耦 我们在设计微服务的时候经常会出现几个模块之间需要相互依赖,例如A和B服务相互依赖,那么部署一个A,必须部署一个B,导致A模块和B模块之间形成了强耦合。如果此时我们在A和B模块之间引入消息队列,那么A可以不用依赖B,只需要A和B之间规定通用的消息格式即可,这样A和B就解耦了,这样以后别的模块

shadon178 博客 8941

SPI 总线信号完整性与时序一致性测试

SPI总线测试的核心目标是验证其电气与时序行为是否满足芯片规格要求,确保通信可靠性

硬核科技 330

Java中消息队列——ActiveMQ、RabbitMQ、RocketMQ、Kafka

本文详细介绍了四种主流消息队列(ActiveMQ、RabbitMQ、RocketMQ、Kafka)及其特点和使用场景,并附上了丰富的代码示例,帮助您更好地理解和应用这些消息队列。希望本文能够为您的项目选择合适的消息队列提供参考。

小蜗牛的珍贵百宝箱 2069

【git】win 10 / win 11:git 首次拉取云效平台代码详细教程

git 首次拉取云效平台代码详细教程:Git 生成 SSH 公钥、云效工作台添加 SSH 公钥、git 使用 SSH / HTTP 链接拉取云效代码

顾三殇 —— 博客空间(软件测试) 4219

数字游民产业小报告 · 2025

2025 年全球数字游民约(不同统计口径差异很大,低估法约 4,000 万,高估法 8,000 万),美国来源占比最高。:2025 Q1 约岗位允许一定程度远程;2024 年美国员工至少部分远程(全球 2023 年约 28%)。:到 2025 年,提供数字游民/远程工作签证(媒体口径 50–73 个不等;福布斯 66、Citizen Remote 50+、有机构清单称 73)。:以英国为例,期望未来一年全勤到岗、企业因强制返岗出现离职,说明“灵活/远程”仍是劳动力市场的筹码之一。

Anthony1453的博客 1469

【Kafka】消息队列Kafka基础

【Kafka】消息队列Kafka基础

学习笔记 1840

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Kafka实现消息队列——Java

1. Kafka的安装部署可从之前一篇文章看到 Kafka安装部署完整教程——包含常遇到的各种错误https://blog.youkuaiyun.com/qq_37842366/article/details/99966001 2. 在本地写Java程序 1)创建Maven项目 点击Next,写好项目名称,Finish,目录结构如下 2)在pom.xml中添加kafka依赖项 <dependenc...

qq_37842366的博客 1881

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

SpringBoot开发案例之整合Kafka实现消息队列

快速访问 1 安装 2 配置远程访问 2.1修改节点ip地址配置 2.2添加用户 2.2.1 控制后台方式 2.2.2 命令行 1 安装 brew指令可以安装、更新和卸载应用,通过brew指令安装RabbitMQ很简单。如果不确定是否已安装HomeBrew,可在终端中使用 brew -v 查看,如果打印HomeBrew版本信息表示已经安装。 打开新的终端窗口,回到根目录 cd 之后输入 brew...

一个天秤座的架构师 2万+

【消息队列】 一文搞懂 Kafka

消息队列是实现应用程序和应用程序之间通信的中间件产品Kafka是Apache开源的一款基于zookeeper协调的分布式消息系统,具有高吞吐率、高性能、实时、高可靠等特点,可实时处理流式数据。它最初由LinkedIn公司开发,使用Scala语言编写。Kafka历经数年的发展,从最初纯粹的消息引擎,到近几年开始在流处理平台生态圈发力,多个组织或公司发布了各种不同特性的产品。:最“正统”的Kafka也是开源版,它是后面其他所有发行版的基础。

weixin_74412978的博客 1848

快速入门Kafka系列(1)——消息队列,Kafka基本介绍

        自Redis快速入门系列结束后,博主决定后面几篇博客为大家带来关于Kafka的知识分享~作为快速入门Kafka系列的第一篇博客,本篇为大家带来的是消息队列和Kafka的基本介绍~         码字不易,先赞后看! 文章...

大数据梦想家 6283
上一篇: Java开发 - 消息队列前瞻
下一篇: Java开发 - 消息队列之RabbitMQ初体验
CodingFire
CodingFire  2022年度博客之星移动开发领域TOP 5 2022年度博客之星移动开发领域TOP 5 领域专家: 移动开发技术领域 领域专家: 移动开发技术领域
博客等级 码龄11年 7927粉丝 387原创
评论 24
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodingFire

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值