Kafka安裝以及基本使用,新手友好

Kafka介绍及Go操作kafka详解 每个业务系统都有日志,当系统出现问题时,需要通过日志信息来定位和解决问题。当系统机器比较少时,登陆到服务器上查看即可满足当系统机器规模巨大,登陆到机器上查看几乎不现实(分布式的系统,一个系统部署在十几台机器上)LogAgent:日志收集客户端,用来收集服务器上的日志Kafka:高吞吐量的分布式队列(Linkin开发,Apache顶级开源项目)ElasticSearch:开源的搜索引擎,提供基于HTTP RESTful的web接口Kibana:开源的ES数据分析和可视化工具。 阅读详情

1. kafka安裝

对于后端开发而已,不宜在环境安装方面耗费宝贵的精力。相对于tar包安装等方式,docker安装省时省力。下面主要介绍,如何使用docker安装kafka。

1.1 安装命令

事实上,仅需如下两条命令即可完成kafka安装。

  1. zookeeper安装:docker run -d --restart=always --log-driver json-file --log-opt max-size=100m --log-opt max-file=2 --name zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime wurstmeister/zookeeper
  2. kafka安装:docker run -d --restart=always --log-driver json-file --log-opt max-size=100m --log-opt max-file=2 --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=192.168.1.10:2181/kafka -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.1.10:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -v /etc/localtime:/etc/localtime wurstmeister/kafka

1.2 参数说明

-e KAFKA_BROKER_ID=0  在kafka集群中,kafka的唯一ID
-e KAFKA_ZOOKEEPER_CONNECT=172.16.0.13:2181/kafka 配置zookeeper管理kafka的路径
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.1.10:9092  把kafka的地址端口注册给zookeeper
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 配置kafka的监听端口
-v /etc/localtime:/etc/localtime 容器同步宿主机时间,docker基本都要配置此参数

1.3 注意事项

安装过程可能会遇到一些问题,我这里简单说几点

  1. docker命令不熟悉:请移步到另一篇博客简单学习一下:docker常用命令
  2. 下载速度缓慢:更新docker镜像为国内源
    • 修改配置文件:vim /etc/docker/daemon.json,修改为:{ "registry-mirrors":["https://n62k26ut.mirror.aliyuncs.com"] }
    • 重启docker服务:service docker restart
  3. kafka无法启动,可能原因为swap空间为0:自行百度如何给linux扩展swap空间

2. Kafka基本概念

3. Kafka生产与消费

3.1 简单消费写法

3.1.1 配置消费者

将配置好的消费者工厂类DefaultKafkaConsumerFactory注册到kafka监听工厂KafkaListenerContainerFactory,具体代码如下所示:

@Configuration
@EnableKafka
public class KafkaConfiguration {

	//定义消费者组:当更换此选项,offset会从0开始
    @Value("${person.groupId}")
    private String groupId;

    @Bean
    @ConditionalOnMissingBean(name = "kafkaListenerContainerFactory")
    KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<String, String>> kafkaListenerContainerFactory() {
        ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
        //并发数量
        factory.setConcurrency(2);
        factory.setConsumerFactory(consumerFactory());
        //批量监听:一次消费多条数据
        factory.setBatchListener(true);
        factory.getContainerProperties().setPollTimeout(20000);
        return factory;
    }

    @Bean
    public Map<String, Object> consumerConfigs() {
        Map<String, Object> propsMap = new HashMap<>();
        propsMap.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
        propsMap.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"192.168.1.10:21005");
        propsMap.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, "1000");
        propsMap.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, "15000");
        propsMap.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
        //Key序列化为字符串
        propsMap.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        //Value序列化为字符串
        propsMap.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        propsMap.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, 500);
        propsMap.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
        return propsMap;
    }

    private ConsumerFactory<String, String> consumerFactory() {
        return new DefaultKafkaConsumerFactory<>(consumerConfigs());
    }

}

3.1.2 具体消费

消费起来也非常简单,直接使用kafkaListener即可对相关topics进行监听

@Component
@Slf4j
public class KafkaReceiver {

    @KafkaListener(topics = {"xxx"}, containerFactory = "kafkaListenerContainerFactory")
    public void process(List<ConsumerRecord<?, ?>> records) {
        try {
            for (ConsumerRecord<?, ?> record : records) {
                Optional<?> kafkaMessage = Optional.ofNullable(record.value());
                if (kafkaMessage.isPresent()) {
                    //实际的消息处理逻辑写在此处
                }
            }
      
        } catch (Exception e) {
            log.error( e.getMessage(), e);
        } 
    }
}

3.2 生产者

3.2.1 生产者配置

生产者配置实际上就是配置kafkaTemplate,比消费者代码更为简单。

package xyz.yq56.kafka.common.config;

import java.util.Map;

import org.apache.commons.collections4.map.HashedMap;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.common.serialization.StringDeserializer;
import org.apache.kafka.common.serialization.StringSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
import org.springframework.kafka.config.KafkaListenerContainerFactory;
import org.springframework.kafka.core.DefaultKafkaConsumerFactory;
import org.springframework.kafka.core.DefaultKafkaProducerFactory;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.core.ProducerFactory;
import org.springframework.kafka.listener.ConcurrentMessageListenerContainer;

import com.google.common.collect.Maps;

@Configuration
public class KafkaConfig {

	// ******************************************* 生产者配置
	// **************************************************//
	@Bean
	public KafkaTemplate<String, String> kafkaTemplate() {
		return new KafkaTemplate<>(producerFactory());
	}

	@Bean
	public ProducerFactory<String, String> producerFactory() {
		return new DefaultKafkaProducerFactory<>(producerConfigs());
	}

	@Bean
	public Map<String, Object> producerConfigs() {
		Map<String, Object> props = Maps.newHashMap();
		props.put(ProducerConfig.ACKS_CONFIG, "0");
		props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "122.51.21.35:9092");
		props.put(ProducerConfig.RETRIES_CONFIG, 3);
		props.put(ProducerConfig.BATCH_SIZE_CONFIG, 150);
		props.put(ProducerConfig.LINGER_MS_CONFIG, 1);
		props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 33554432);
		props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
		props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
		return props;
	}

	// ******************************************* 消费者配置
	// **************************************************//

	@Bean(value = "kafkaListenerContainerFactory")
	public KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<String, String>> kafkaListenerContainerFactory() {
		ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
		// 并发数量
		factory.setConcurrency(2);
		factory.setConsumerFactory(consumerFactory());
		// 批量监听:一次消费多条数据
		factory.setBatchListener(true);
		factory.getContainerProperties().setPollTimeout(20000);
		return factory;

	}

	public DefaultKafkaConsumerFactory<String, String> consumerFactory() {
		return new DefaultKafkaConsumerFactory<>(ConsumerConfig());
	}

	public Map<String, Object> ConsumerConfig() {
		Map<String, Object> propsMap = new HashedMap<>();
		propsMap.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
		propsMap.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "122.51.21.35:9092");
		propsMap.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, "1000");
		propsMap.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, "15000");
		propsMap.put(ConsumerConfig.GROUP_ID_CONFIG, "123465");
		// Key序列化为字符串
		propsMap.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
		// Value序列化为字符串
		propsMap.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
		propsMap.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, 500);
		propsMap.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
		return propsMap;
	}
}

3.2.2 生产者使用

注入kafkaTemplate,然后调用send方法即可

package xyz.yq56.kafka.mq;

import javax.annotation.Resource;

import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Component;

import lombok.extern.slf4j.Slf4j;

@Component
@Slf4j
public class KafkaProducer {

	@Resource
	private KafkaTemplate<String, String> kafkaTemplate;

	public void send(String topic, String message) {
		kafkaTemplate.send(topic, message);
		log.info("发送消息");
	}

}

Kafka服务端(含Zookeeper)一键自启软件 本文介绍了一款集成图形化界面配置和一键自启功能的Kafka与Zookeeper服务管理软件。该软件通过直观易用的图形界面,使用户能够轻松完成Kafka和Zookeeper的配置工作,有效避免了手动编辑配置文件可能带来的错误和不便。同时,软件还提供了详细的错误日志记录功能,帮助用户快速定位并解决潜在问题,极大提升了服务部署和管理的便捷性和效率。对于Kafka和Zookeeper的新手用户而言,这款软件无疑是一款非常友好且实用的工具。 阅读详情

相关推荐

Kafka Manager 1.3.3.14:安装指南及深度解析

Kafka Manager是一个开源的管理工具,主要用于管理和监控Kafka集群。它提供了一个直观的Web界面,让开发者和运维人员能够轻松地执行各种集群操作,比如创建、删除和管理主题,以及查看集群状态和性能指标。使用Kafka Manager可以有效地减少管理负担,提高工作效率。Kafka Manager还具备一些高级功能,适用于特定的使用场景。这些功能包括集群操作的自动化、多集群的统一管理,以及集成外部系统的监控。

weixin_42600407的博客 1249

深入理解KAFKA_ADVERTISED_LISTENERS

(1)内网访问(2)外网访问于是springboot程序通过外网访问的时候,配置 改成这样 (1)程序首先是从zookeeper中获取broker地址。然后用这个地址去连kafka。如果配置的地址是外网程序找不到的一个地址,那就连不上了。(2)zookeeper中的地址是通过这个关键句来配置的。

weixin_39766667的博客 1万+

百度智能云训练图像分割模型+python调用模型并分割图像

目录 训练模型阶段 发布图像分割API 调用图像分割API 创建应用后显示以下两个代码 在pycharm中可以调用API mask解码 依赖库pycocotools安装步骤: 依赖库urllib2的安装 源码下载: 最近上课听老师介绍了一个训练图像分割模型的网站,把数据集上传之后做图像标注,然后进行训练就能得到准确率等指标。 训练模型阶段 图像分割:https://ai.baidu.com/easydl/vision/ 图像分割-->创建模型-->上传数据--&gt

icecreamdinner的博客 1389

kafka listeners和advertised配置

listeners listeners就是主要用来定义Kafka Broker的Listener的配置项。 advertised.listeners advertised.listeners参数的作用就是将Broker的Listener信息发布到Zookeeper中 inter.broker.listener.name inter.broker.listener.name:专门用于Kafka集群中Broker之间的通信

未来在这儿的专栏 5550

金智维KRPA实战:Excel自动化数据处理全流程解析

本文详细解析了金智维KRPA在Excel自动化数据处理中的全流程应用,涵盖COM接口和文件读写两种核心技术方案,以及销售报表生成、数据清洗和可视化仪表盘等实战案例。通过企业级应用的异常处理、性能优化和安全合规实践,显著提升数据处理效率和准确性,助力企业降本增效。

weixin_30329623的博客 598

Python量化交易实战:如何用pytdx库快速解析通达信.day文件(附完整代码)

本文详细介绍了如何使用Python的pytdx库高效解析通达信.day本地数据文件,构建免费、稳定的量化交易数据源。文章提供了从环境配置、基础数据读取、复权处理到板块信息获取的完整实战代码,并演示了如何将处理后的数据无缝接入Backtrader等回测框架,为量化策略开发提供可靠的数据基础。

ppp33的博客 1146

一文搞懂 Kafka 中的 listeners 和 advertised.listeners 以及其他通信配置

listeners 和 advertised.listeners 以及其他通信配置

卷心菜投手 1万+

DNF单机版搭建全攻略:从零开始到局域网联机(含常见问题解决)

本文提供详细的DNF单机版搭建指南,从环境配置到局域网联机设置,涵盖服务端安装、数据库配置及常见问题解决方案。适合新手和有经验的玩家,帮助快速搭建专属游戏服务器,重温经典游戏体验。

weixin_30832143的博客 849

【Docker】Kafka 容器化部署

Kafka标准软件基于Bitnami Kafka 构建。当前版本为3.6.1你可以通过轻云UC部署工具直接安装部署,也可以手动按如下文档操作。

Qinghub‘博客 3118

基于STM32的半导体制冷片温度控制

制冷片温度控制,温控范围15℃~45℃,本人菜鸡一枚,大佬绕路。 #include "stm32f10x_gpio.h" #include "relay.h" void relay_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//Ê...

大白兔的博客 9017

Lossless-Claw 插件实战:告别上下文截断,让 OpenClaw 永不遗忘

本文介绍了OpenClaw的Lossless-Claw插件,这是一个基于LCM论文的DAG摘要系统,能有效解决上下文截断问题。文章包含10个部分,从插件原理到实操指南: 核心原理:通过DAG结构持久化存储所有原始消息,将旧消息分块摘要并形成层级结构,保持上下文在模型Token限制内。 性能优势:在OOLONG基准测试中得分74.8,优于Claude Code的70.3,尤其在长上下文场景表现更佳。 功能特点: 提供lcm_grep、lcm_describe等工具主动回忆历史 摘要始终链接回原文,实现真正无损

u014798858的博客 2620

kafka中listener和advertised.listeners的作用

但是在集群外部时,kafka客户端进行连接,它是需要有能力访问kafka的每一个broker节点的,所以需要在advertised.listeners中配置公网IP,并存储在zookeeper中,这样kafka客户端就能拿到所有broker节点的公网IP并进行访问。kafka客户端连接kafka broker时,会先获取所有brokers的元数据信息,获取到endpoints的信息,然后再通过其中的endpint进行对broker进行连接操作。​的,也就是只有通过绑定的地址才能够访问到该Broker。

Crazy博客 2475

【DaVinci Developer专题】-8-创建一个枚举Enum ADT(Application Data Type)

目录 1 创建一个枚举Value ADT(Application Data Type) 1.1 命名application data type 1.2 创建一个computation method计算方法属性 1.3 创建一个Contraint约束条件属性 2 创建了一个新的Type Mapping Sets 3 创建了一个S/R Port Interface 4 SWC引用Type Mapping set 5 导入CFG生成代码的总结 6 结尾 <--返回「实战篇」博文-总目录-

「汽车电子助手」的博客 2293

kafka-console-ui的简介及安装使用

kafka-console-ui 是一款轻量级的kafka可视化管理平台,安装、配置特别简单,一般来说只需要配置一个kafka集群地址启动即可。为了开发的省事,没有国际化支持,页面只支持中文展示。不是一个企业级的平台,目前看来只适合中、小型集群的管理。这个工具看起来是挺low的,但是对于刚接触kafka急需一个合适工具进行管理的同学来说,还是挺友好的,没有国际化支持,全是中文展示。支持broker相关配置的查看及修改。

初夏0811的博客 7420

C#上位机性能优化全攻略:彻底解决界面卡顿+多线程死锁+PLC数据延迟,产线实测稳定运行2年

一开始我们用的是网上找的零散优化代码,根本满足不了要求,后来花了2个月的时间,把之前27条产线的代码整理、重构、优化,做了一套这套方案上线后,连续稳定运行2年零3个月:界面响应时间稳定在50ms以内,多线程死锁率持续为0,PLC数据延迟稳定在150ms以内,系统可用率≥99.99%,帮客户一年省下了超过480万的停线损失、罚款损失和人工成本,客户第二年就把剩下的22条产线也全部交给我们做了,还介绍了3家同行。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 294

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Kafka系列(六)、Kafka开发套件kafka lenses 安装及使用(带WebUI)

Lenses 是kafka的一个商用套件,本次我们使用docker安装他们给我们提供的开源版本,该开源版本包含超多组件,对于平时开发使用来说很友好,不需要去安装一堆开发组件,它自带了Apache Kafka, Kafka Connect, Zookeeper, Confluent Schema Registry,Confluent REST Proxy 以及几个lenses开源的管理ui界面kafka-topics-ui, schema-registry-ui, kafka-connect-ui,

王义凯 的博客 2242

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

零基础入门:5分钟用Docker安装Kafka

最近在学习消息队列技术,发现Kafka是个不错的选择,但对于新手来说环境配置比较麻烦。后来发现用Docker可以轻松解决这个问题,下面分享我的安装过程,连我这个小白都能搞定。如果还没装,可以去Docker官网下载对应系统的安装包,安装过程基本都是下一步下一步就行。整个过程比我想象的简单多了,特别是用了Docker之后省去了很多配置步骤。不需要自己搭建环境,直接就能运行,对初学者特别友好。整个过程比我预想的顺利很多,建议想尝试Kafka的同学可以试试这个方法。上完成的实验,发现它的一键部署功能特别方便。

SnowflakeJaguar14的博客 745

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Kafka Lens 安装与配置指南

Kafka Lens 安装与配置指南 1. 项目基础介绍 Kafka Lens 是一个用于监控 Apache Kafka 集群的工具,它可以帮助开发者轻松地检查 Kafka 集群,并在问题发生时进行故障排除。Kafka Lens 提供了一个用户友好的界面,通过它可以监控消息如何在 Kafka 主题和分区之间发布,而无需使用命令行界面或昂贵的云解决方案。 该项目主要使用 JavaScript 进行开...

gitblog_01153的博客 345

Kafka - 可视化工具推荐:Kafka-Manager、Offset Explorer使用教程

Kafka 可视化工具推荐:Kafka-Manager 和 Offset Explorer 使用教程 摘要: 本文推荐两款 Kafka 可视化工具,帮助开发者更高效地管理 Kafka 集群。Kafka-Manager(CMAK)提供 Web 端集群级管理功能,支持多集群监控、Topic 管理、消费者组偏移量重置等核心功能,兼容 KRaft 模式。Offset Explorer(原 Kafka Tool)是桌面客户端,提供消息内容查看、偏移量管理等开发者友好功能。文章详细介绍了工具的安装配置步骤,并通过 Ja

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

在 Docker 上安装和配置 Kafka、选择用于部署 Kafka 的操作系统

摘要:本文介绍了消息代理Apache Kafka的特性及跨平台部署方案。Kafka作为分布式消息系统,具有高吞吐量、容错能力和低延迟等优势,适合构建实时数据管道。文章详细对比了Windows、macOS、Linux及Docker四种部署方式的优缺点,其中Linux是首选方案,而Docker提供了便捷的跨平台部署。云服务Hostman可简化Kafka部署流程。Kafka支持长期数据存储和发布-订阅模式,能与多种大数据系统集成,成为处理实时数据的理想选择。

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 1087

c#连接kafka_.Net(c#)使用 Kafka 小结

.Net(c#)使用 Kafka 小结1.开篇由于项目中必须使用 kafka 来作为消息组件,所以使用 kafka 有一段时间了。不得不感叹 kafka 是一个相当优秀的消息系统。下面直接对使用过程做一总结,希望对大家有用。1.1.kafka 部署kafka 的简单搭建我们使用 docker 进行,方便快捷单节点。生产环境不推荐这样的单节点 kafka 部署。1.1.1.确保安装了 docker ...

weixin_34005314的博客 3210

KafkaTool2.0.7linux系统安装包:Apache Kafka集群管理的便捷工具

KafkaTool2.0.7linux系统安装包:Apache Kafka集群管理的便捷工具 【下载地址】KafkaTool2.0.7linux系统安装包 Kafka Tool 2.0.7是一款专为Linux系统设计的实用工具,旨在简化开发者和运维人员对Apache Kafka集群的操作。通过该工具,用户可以轻松管理和监...

gitblog_06753的博客 1048

kafka管理工具

一个好的界面管理工具可以使得开发效率更为高效,因kafka本身没有自研的管理工具!于是尝试安装市面上的一些辅助工具。Conduktorkafka-maneger(已更名cmak)

weixin_49278803的博客 4115

浅谈Kafka2.8+在Windows下的搭建与使用

前言: 周末空闲时间无意找到了一套个性化推荐的源码,整体项目运用了SSH,HDFS,Flume,Hive,Kafka,Spark,Scala等。运行时,本来通过spark计算业务埋点数据时,却发现本地没有Kafka。因为我一直也没使用过Kafka,所以也作为新人,浅谈以下Kafka的环境安装与分别在PHP,Scala中的使用。 对比: 1. 横向,相比其他中间件。 关于kafka与其他消息中间件的比较,网上很多的博主,不管是从运行原理还是中间件架构都有很详细...

北桥苏的博客 2374

嵌入式Kafka测试工具:快速搭建内存中的Kafka环境

#嵌入式Kafka测试工具:快速搭建内存中的Kafka环境 1. 项目基础介绍及编程语言 embedded-kafka 是一个开源项目,旨在为开发人员提供一种简单且高效的方式来在内存中模拟Apache Kafka环境,用于开发和测试目的。该项目主要使用Scala语言开发,同时也兼容Java。Scala语言的函数式特性和简洁的语法使得项目在易用性和维护性方面表现优秀。 2. 核心功能 embedde...

gitblog_01062的博客 1033
上一篇: 虚拟机桥接模式
下一篇: 性能提高:循环中使用map匹配,而不是使用内层循环
一步一结
博客等级 码龄7年 50粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值