XXL-JOB执行器集群及分片功能

系统架构图

在这里插入图片描述

XXL-JOB职责划分

在这里插入图片描述

准备工作

1.下载代码

https://gitee.com/xuxueli0323/xxl-job/tree/2.3.0/

2.将xxl-job sql执行

在这里插入图片描述
在这里插入图片描述

3.修改xxl-job-admin数据库链接及账号密码

在这里插入图片描述

4.创建日志目录修改日志文件指定输出目录

在这里插入图片描述
在这里插入图片描述

5.启动项目后访问xxl-job-admin

http://localhost:8080/xxl-job-admin
在这里插入图片描述
初次登录 admin 123456

创建执行器

1.创建新项目

在这里插入图片描述

2.添加依赖

        <!-- xxl-job-core -->
        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.3.0</version>
        </dependency>

3.添加配置文件application.properties

server.port=8088
### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin

### xxl-job, access token
xxl.job.accessToken=default_token

### xxl-job executor appname
xxl.job.executor.appname=xxl-job-executor-sample
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
xxl.job.executor.address=
### xxl-job executor server-info
xxl.job.executor.ip=
xxl.job.executor.port=9998
### xxl-job executor log-path
xxl.job.executor.logpath=/Users/hejiawang/IdeaProjects/xxl-job-demo
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays=30

4.添加配置类

XxlJobConfig

package com.hejiawang.xxljobdemo.config;

import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class XxlJobConfig {
    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);

    @Value("${xxl.job.admin.addresses}")
    private String adminAddresses;

    @Value("${xxl.job.accessToken}")
    private String accessToken;

    @Value("${xxl.job.executor.appname}")
    private String appname;

    @Value("${xxl.job.executor.address}")
    private String address;

    @Value("${xxl.job.executor.ip}")
    private String ip;

    @Value("${xxl.job.executor.port}")
    private int port;

    @Value("${xxl.job.executor.logpath}")
    private String logPath;

    @Value("${xxl.job.executor.logretentiondays}")
    private int logRetentionDays;


    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        logger.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppname(appname);
        xxlJobSpringExecutor.setAddress(address);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

        return xxlJobSpringExecutor;
    }
}

5.添加简单的执行类

package com.hejiawang.xxljobdemo.job;

import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.concurrent.TimeUnit;

@Component
public class SimpleXxlJob {
    /**
     * 1、简单任务示例(Bean模式)
     */
    @XxlJob("demoJobHandler")
    public void demoJobHandler() throws Exception {
        System.out.println("执行定时任务,执行时间:"+new Date());
    }
}

6.测试

启动执行器,通过xxl-job管理页面查看到有新的执行任务
http://localhost:8080/xxl-job-admin
在这里插入图片描述

7.通过调度中心出发执行器

新增调度任务,在xxl-job-admin页面中新增调度任务5s一次
在这里插入图片描述
启动任务
在这里插入图片描述
在执行器中即可看到 5s打印一次demoJobHandler
在这里插入图片描述

GLUE模式运行

1.新增调度任务

在这里插入图片描述
在这里插入图片描述

2.新增调用代码 并保存

package com.xxl.job.service.handler;

import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.IJobHandler;
import com.hejiawang.xxljobdemo.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;

public class DemoGlueJobHandler extends IJobHandler {
	@Autowired
    HelloService helloService;
	@Override
	public void execute() throws Exception {
		XxlJobHelper.log("XXL-JOB, Hello World.");
	}

}

在这里插入图片描述

3.在执行器中添加HelloService类

package com.hejiawang.xxljobdemo.service;

import org.springframework.stereotype.Service;

@Service
public class HelloService {
    public void methodA(){
        System.out.println("执行methodA的方法");
    }
    public void methodB(){
        System.out.println("执行methodB的方法");
    }
}

在这里插入图片描述

4.测试

执行一次
在这里插入图片描述
执行器中方法被执行
在这里插入图片描述
启动即可10s执行一次
在这里插入图片描述

执行器集群

1.在IDEA中添加一个进程

在IDEA中添加启动JVM参数
-Dserver.port=8088 -Dxxl.job.executor.port=9998
在这里插入图片描述
-Dserver.port=8089 -Dxxl.job.executor.port=9999
在这里插入图片描述
启动2个Springboot进程
在这里插入图片描述
在xxl-job-admin中查看注册上来2个端口
在这里插入图片描述

2.启动之前的定时任务5s一次

在这里插入图片描述
只在8088进程中执行
在这里插入图片描述

3.调整集群模式下调度任务路由策略

在这里插入图片描述
修改为轮训再次启动
在这里插入图片描述
8088进程
在这里插入图片描述
8089进程
在这里插入图片描述

分片功能

1.准备工作

创建分片表
在这里插入图片描述
执行sql xxl_job_demo.sql导入数据
一共2000行数据
在这里插入图片描述

2.工程中添加xxl-job依赖

        <!--MyBatis驱动-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.2.0</version>
        </dependency>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--lombok依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>

3.添加配置

spring.datasource.url=jdbc:mysql://localhost:3306/xxl_job_demo?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.username=xxx
spring.datasource.password=xxx

4.添加实体类

@Data
public class UserMobilePlan {
    private Long id;//主键
    private String username;//用户名
    private String nickname;//昵称
    private String phone;//手机号码
    private String info;//备注
}

5.添加mapper类

@Mapper
public interface UserMobilePlanMapper {
    @Select("select * from t_user_mobile_plan")
    List<UserMobilePlan> selectAll();
}

6.在job类中添加发送短信模拟方法

    @XxlJob("sendMsgHandler")
    public void sendMsgHandler() throws Exception{
        List<UserMobilePlan> userMobilePlans = userMobilePlanMapper.selectAll();
        System.out.println("任务开始时间:"+new Date()+",处理任务数量:"+userMobilePlans.size());
        Long startTime = System.currentTimeMillis();
        userMobilePlans.forEach(item->{
            try {
                //模拟发送短信动作
                TimeUnit.MILLISECONDS.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        System.out.println("任务结束时间:"+new Date());
        System.out.println("任务耗时:"+(System.currentTimeMillis()-startTime)+"毫秒");
    }

7.启动执行器

8.在xxl-job-admin中创建调度器并且未分片执行

1分钟执行一次,并且启动
在这里插入图片描述
在执行器中可以看到一次读了2000条数据,并未分片,并且需要20s才处理完
在这里插入图片描述

9.在执行器中分片执行

将调度任务路由策略修改为分片广播的形式
在这里插入图片描述

在这里插入图片描述
修改mapper方法,新增取模条件查询

@Mapper
public interface UserMobilePlanMapper {
    @Select("select * from t_user_mobile_plan")
    List<UserMobilePlan> selectAll();
    @Select("select * from t_user_mobile_plan where mod(id,#{shardingTotal})=#{shardingIndex}")
    List<UserMobilePlan> selectByMod(@Param("shardingIndex") Integer shardingIndex, @Param("shardingTotal")Integer shardingTotal);
}

修改 sendMsgHandler

  @XxlJob("sendMsgHandler")
  public void sendMsgHandler() throws Exception {
    int shardIndex = XxlJobHelper.getShardIndex();
    int shardTotal = XxlJobHelper.getShardTotal();
    System.out.println("分片的总数:"+shardTotal+",分片的索引:"+shardIndex);
    List<UserMobilePlan> userMobilePlans = null;
    if(shardTotal==1){
      //如果没有分片就直接查询所有数据
      userMobilePlans = userMobilePlanMapper.selectAll();
    }else{
      userMobilePlans = userMobilePlanMapper.selectByMod(shardIndex,shardTotal);
    }
    System.out.println("处理任务数量:"+userMobilePlans.size());
    Long startTime = System.currentTimeMillis();
    userMobilePlans.forEach(
        item -> {
          try {
            // 模拟发送短信动作
            TimeUnit.MILLISECONDS.sleep(10);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        });
    System.out.println("任务结束时间:" + new Date());
    System.out.println("任务耗时:" + (System.currentTimeMillis() - startTime) + "毫秒");
  }

重启2个执行器进程
在这里插入图片描述
将调度任务改为分片广播启动
即可看到每个进程处理一半的数据并且每个都10s处理完
在这里插入图片描述
在这里插入图片描述

【分布式任务调度】(一)XXL-JOB调度中心集群部署配置 XXL-JOB是一款轻量级的分布式任务调度中间件,默认支持6000个定时任务,如果生产环境的任务数量在这个范围内,可以选择使用 XXL-JOB。操作更简单,学习成本更低使用异步化调度,性能更好有配套的运维后台系统,提供了配置、监控、日志、统计报表等功能拥有更简单的集群部署方案,服务的注册与发现等功能详情参考《官方文档》本文的内容在官方文档上都可以找到,只是在这基础上做了一点细节补充,有经验的同学可以直接查阅官方文档。多个节点使用同一个数据库。多台机器的系统时间配置成一样的。 阅读详情

相关推荐

【分布式任务调度】XXL-JOB调度中心集群部署配置(一)

XXL-JOB是一款轻量级的分布式任务调度中间件,默认支持6000个定时任务,如果生产环境的任务数量在这个范围内,可以选择使用 XXL-JOB。操作更简单,学习成本更低使用异步化调度,性能更好有配套的运维后台系统,提供了配置、监控、日志、统计报表等功能拥有更简单的集群部署方案,服务的注册与发现等功能本文的内容是在官方文档的基础上做了一点细节补充,有经验的同学可以直接查阅《官方文档》。综上,一个基本的调度中心集群就搭建好了,是不是非常简单呢?

DreamSun的博客 5946

XXL-JOB任务分片

如果我们需要在本任务执行结束并且执行成功的时候触发另外一个任务,那么就可以把另外的任务作为本任务的子任务运行,就只需要在本任务里填入另外一个任务的jobId即可(可以在任务列表查看JobId)那么,可以把这几个任务当成一个大任务来串行处理,即在一个任务的末尾触发另一个任务。集群模式:启动多个任务实例,这里可以把每个实例的端口号都改为不同,可以看到同一个任务类有多个机器。对于多10条数据,我们可以创建多个任务每个任务完成不同的ID数据,只要ID不重合,那么就不会重复执行对应的事务。

牧竹子 7294

xxl-job快速入门(最全)

某电商平台需要每天上午10点,下午3点,晚上8点发放一批优惠券某银行系统需要在信用卡到期还款日的前三天进行短信提醒某财务系统需要在每天凌晨0:10分结算前一天的财务数据,统计汇总以上场景就是任务调度所需要解决的问题任务调度是为了自动完成特定任务,在约定的特定时刻去执行任务的过程XXL-Job:是大众点评的分布式任务调度平台,是一个轻量级分布式任务调度平台, 其核心设计目标是开发迅速、学习简单、轻量级、易扩展大众点评目前已接入XXL-JOB,该系统在内部已调度约100万次,表现优异。

gnwu1111的专栏 1702

XXL-Job集群部署和⾼可⽤最佳实战

XXL-Job集群部署和⾼可⽤最佳实战

Gblfy_Blog 8966

XXL-JOB定时框架

我们使用 mybatis-plus 可以节省我们大量的代码,尽量不要同时导入 mybatis 和 mybatisplus!会有版本的差异!

weixin_44378507的博客 340

从CLIP到AnomalyCLIP:零样本异常检测的跨领域进化之路

本文探讨了从CLIP到AnomalyCLIP的技术演进,重点介绍了零样本异常检测在跨领域应用中的突破。AnomalyCLIP通过对象无关提示学习和多尺度特征提取,显著提升了工业质检、医疗影像等领域的检测精度,实现了高达96.4%的金属螺母划痕检测精度和85.7%的皮肤癌敏感度。这一技术为多模态模型在异常检测中的应用开辟了新路径。

r2s3t4的博客 111

【概念与实践】XXL-JOB

XXL-Job:是大众点评的分布式任务调度平台,是一个轻量级分布式任务调度平台, 其核心设计目标是开发迅速、学习简单、轻量级、易扩展大众点评目前已接入XXL-JOB,该系统在内部已调度约100万次,表现优异。目前已有多家公司接入xxl-job,包括比较知名的大众点评,京东,优信二手车,360金融 (360),联想集团 (联想),易信 (网易)等等官网地址 https://www.xuxueli.com/xxl-job/系统架构图设计思想。

goat的博客 1173

QT实现Word读写

在windows环境下,我们可以通过ActiveQt实现Office自动化,相当于VB的VBA功能。 以下是一个实例: #include #include #include int main(int argc, char *argv[]) {     QApplication a(argc, argv);     //显示的打开一个word应用程序     QAxW

nameofhsw的专栏 1万+

XXL-JOB快速上手

某电商平台需要每天上午10点,下午3点,晚上8点发放一批优惠券某银行系统需要在信用卡到期还款日的前三天进行短信提醒某财务系统需要在每天凌晨0:10分结算前一天的财务数据,统计汇总以上场景就是任务调度所需要解决的问题视频地址:XXL-JOB资料地址:资料任务调度是为了自动完成特定任务,在约定的特定时刻去执行任务的过程XXL-Job:是大众点评的分布式任务调度平台,是一个轻量级分布式任务调度平台, 其核心设计目标是开发迅速、学习简单、轻量级、易扩展。

qq_22075913的博客 887

systermverilog中for循环中的fork join执行情况分析

仅为本人学习记录,如有错误感谢指正!

qq_63807221的博客 1461

unity打包流程整理-Windows/Mac/Linux平台

1.Platform(平台)功能: 选择目标构建的目标平台选项PC, Mac & Linux Standalone: 适用于 Windows、Mac 和 Linux 平台2.Target Platform(目标平台)功能: 选择具体的操作系统版本选项Windows: 针对 Windows 操作系统Mac: 针对 macOS 操作系统Linux: 针对 Linux 操作系统3.Architecture(架构)功能: 选择应用程序的目标处理器架构选项x86: 针对 32 位系统。

weixin_42333247的博客 5136

任务调度框架--XXL-JOB

XXL-Job:是大众点评的分布式任务调度平台,是一个轻量级分布式任务调度平台, 其核心设计目标是开发迅速、学习简单、轻量级、易扩展大众点评目前已接入XXL-JOB,该系统在内部已调度约100万次,表现优异。目前已有多家公司接入xxl-job,包括比较知名的大众点评,京东,优信二手车,360金融 (360),联想集团 (联想),易信 (网易)等等官网地址系统架构图设计思想将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。

llg3189609554的博客 1032

基于互相关(NCC)模板匹配——find_ncc_model_defocused.hdev

相关性原理:仅在NCC(r,c) = ±1时,模板与图像完全匹配; NCC绝对值越大,表示模板与正在检测部分图像越接近; NCC绝对值越接近于零,表示模板与图像越不一致。 线性光照变化不会影响NCC计算结果。 重要函数一: 创建模板:create_ncc_model( Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Metric : ModelID) 参数列表: Template(in):单通道灰度图像,它的区域可被创建为模板。 Num

m0_51271525的博客 3413

xxl-job学习笔记及期间问题记录(自用,待补充完整)

之前2000+条数据只在一台机器上执行需要20+秒才能完成任务,分片后,有两台机器可以共同完成2000+条数据,每台机器处理1000+条数据,这样的话只需要10+秒就能完成任务。如果采用分片广播的形式的话,一次任务调度将会广播触发对应集群中所有执行器执行一次任务,同时系统自动传递分片参数,可根据分片参数开发分片任务。2000+条数据,如果不采取分片形式的话,任务只会在一台机器上执行,这样的话就需要20+秒才能执行完任务。需求:我们现在是先这样的需求,在指定节假日需要给平台的所有用户去发送祝福的短信。

haleyha的博客 859

Zookeeper+Hadoop+Spark+Flink+Kafka+Hbase+Hive 完全分布式高可用集群搭建(保姆级超详细含图文) 附安装包网盘下载

Hadoop+Spark+Flink+Zookeeper+Kafka+Hbase+Hive完全分布式高可用集群搭建 Hadoop高可用集群搭建 Spark高可用集群搭建 Flink高可用集群搭建 Zookeeper高可用集群搭建 Kafka高可用集群搭建 Hbase高可用集群搭建 Hive高可用集群搭建 mysql搭建 jdk部署 大数据集群环境搭建

Mr.L-OAM的博客 2万+

基于opencv的鱼群检测和数量统计识别鱼群密度带界面

摘要:本项目利用OpenCV图像处理技术实现了视频鱼类自动检测计数系统。通过背景减除、形态学处理和轮廓检测等方法,在视频帧中标记鱼类并统计数量。系统包含视频读取、前景提取、轮廓分析、中心点跟踪等核心功能,可实时显示计数结果。适用于水产养殖、生态监测等领域,具有实用价值。未来可通过参数优化、引入深度学习和多目标跟踪技术进一步提升准确性。(147字)

1720

分布式任务调度框架xxl-job使用手册

官网地址:https://www.xuxueli.com/xxl-job/

qq_30166465的博客 2266

【时时三省】tessy 进入调试模式 教程

山不在高,有仙则名。水不在深,有龙则灵。----优快云 时时三省。

时时三省的博客 771

xxl-job学习

xxl-job官方文档【分布式任务调度】三、XXL-JOB详细介绍xxljob从入门到精通-全网段最全解说XXL-JOB分布式任务调度框架(一)-基础入门 XXL-JOB分布式任务调度框架(二)-策略详解 XXL-JOB分布式任务调度框架(三)-集群部署 XXL-JOB分布式任务调度框架(四)-源码分析-调度中心对执行器的上下线感知实现原理 XXL-JOB分布式任务调度框架(五)-源码分析-任务调度执行流程及实现原理xxl-job源码解析(看这一篇就够了,超简约且详细)【XXL-JOB】XXL-JOB部

pscool的博客 1545

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

XXL-Job与Elastic-Job详细对比

XXL-Job 和 Elastic-Job 都支持任务并行执行,但是 Elastic-Job 相比于 XXL-Job,在并行度限制和分片机制上具备更好的功能。XXL-Job 和 Elastic-Job 都支持高可用集群部署,并且都支持主备模式,但是 Elastic-Job 相比于 XXL-Job,在高可用策略上具备更好的功能。但是,两者的监控数据存储方式有所不同,XXL-Job的监控数据存储在数据库中,而Elastic-Job的监控数据存储在Zookeeper中,并且可以通过REST API获取监控数据。

HelloBug的博客 1955

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

一文搞懂XXL-JOB任务调度平台

一、概述 在平时的业务场景中,经常有一些场景需要使用定时任务,比如: 时间驱动的场景:某个时间点发送优惠券,发送短信等等。 批量处理数据:批量统计上个月的账单,统计上个月销售数据等等。 固定频率的场景:每隔5分钟需要执行一次。 所以定时任务在平时开发中并不少见,而且对于现在快速消费的时代,每天都需要发送各种推送,消息都需要依赖定时任务去完成,应用非常广泛。 二、为什么需要任务调度平台 在Java中,传统的定时任务实现方案,比如Timer,Quartz等都或多或少存在一些问题: 不支持集群、不支持统计、

qq_33449307的博客 2218

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

XXL-JOB分布式调度快速入门.跟学B站XXL-JOB一小时掌握课程笔记

XXL-JOB分布式任务调度平台快速入门

心向阳光的天域的博客 920

分布式调度XXL-JOB

某电商平台需要每天上午10点,下午3点,晚上8点发放一批优惠券某图书系统需要在图书借阅到期前两天进行消息提醒某银行系统需要在信用卡到期还款日的前三天进行短信提醒某财务系统需要在每天凌晨0:10分结算前一天的财务数据,统计汇总以上场景在项目实战中就是任务调度所需要解决的问题任务调度是为了自动完成特定任务,在约定的特定时刻去执行任务的过程XXL-JOB:是大众点评的分布式任务调度平台,是一个轻量级分布式任务调度平台, 其核心设计目标是开发迅速、学习简单、轻量级、易扩展。

码上言 784

分布式任务调度平台XXL-JOB

XXL-JOB源码和教程 源码和教程 github源码 中文教程

qq_43026811的博客 563

elastic-job 和 xxl-job 的对比

一、综合对比 许雪里软件作者 05/23 18:47 #xxl-job#即将发布的新版本,将会自研触发组件,移除quartz依赖,并精简掉11张表,大大降低线程和内存开销。在第三方依赖上不断做减法,在功能上不断做加法。 感谢quartz在历史版本中对xxl-job提供的支持,但是它逐渐跟不上xxl-job的发展,xxl-job即将踏上新的道路 …… XXL-JOB v2.1.0,分布式任务调度平台 1 xuxueli · 22 天前 · 1260 次点击 v2.0.2 ...

南夏一木子的博客 2995

分布式任务调度平台——XXL-JOB

本文介绍了 XXL-JOB 相关的知识。

代码星辰的博客 897
上一篇: 谷粒商城第二篇服务功能-商品服务-三级分类
下一篇: Dubbo3.0 Demo
Persistence___
博客等级 码龄8年 47粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值