springboot整合xxl-mq学习笔记

Xxl-Job管理spring-amqp消费者 问题描述 技术前提: SpringBoot RabbitMQ Xxl-Job 在SpringBoot中很容易就能集成RabbitMQ并使用,消费者也只需要打上@RabbitListener注解就能开始消费指定的队列了。 但是在架构层面,我们的服务器分为http服务机与队列机;http服务机只提供http服务,队列机进行消费;这是防止队列消费出问题进而影响到http服务。所以需要限定消费者只能在队列机上开启。 在引入Xxl-Job之前,我们是利用@RabbitListener里的autoStartup, 阅读详情

springboot整合xxl-mq学习笔记

首先xxl-mq是大神xuxueli开发的一个消息中间件框架:

与springboot整合过程:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.xuxueli</groupId>
        <artifactId>xxl-mq-samples</artifactId>
        <version>1.3.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>xxl-mq-samples-springboot</artifactId>
    <packaging>jar</packaging>


    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>


    <dependencies>

        <!-- starter-web:spring-webmvc + autoconfigure + logback + yaml + tomcat -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- starter-test:junit + spring-test + mockito -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- freemarker-starter -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>

        <!-- xxl-mq-client -->
        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-mq-client</artifactId>
            <version>${parent.version}</version>
        </dependency>

    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>


</project>

2  propeties

### web
server.port=8081
server.context-path=/

### resources
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/static/

### freemarker
spring.freemarker.templateLoaderPath=classpath:/templates/
spring.freemarker.suffix=.ftl
spring.freemarker.charset=UTF-8
spring.freemarker.request-context-attribute=request
spring.freemarker.settings.number_format=0.##########

# xxl-mq, admin conf 这个配置时admin部署的位置
xxl.mq.admin.address=http://localhost:8080/xxl-mq-admin
### xxl-mq, access token
xxl.mq.accessToken=

index。html

<script src="${request.contextPath}/static/jquery/jquery.min.js"></script>
<body>

    <input type="button" class="send" _type="0" value="并行消费" />
    <br><br>

    <input type="button" class="send" _type="1" value="串行消费" />
    <br><br>

    <input type="button" class="send" _type="2" value="广播消息" />
    <br><br>

    <input type="button" class="send" _type="3" value="延时消息:5分钟后执行" />
    <br><br>

    <input type="button" class="send" _type="4" value="性能测试:批量发送10000条消息" />

    <hr>
    <div id="console"></div>

    <script>
        $(function(){
            $(".send").click(function () {
                var _type = $(this).attr("_type");
                $.post( '${request.contextPath}/produce', {'type':_type}, function(data,status){
                    var temp = "<br>" + new Date().format("yyyy-MM-dd HH:mm:ss") + ":  ";
                    temp += ("SUCCESS" == data)?('成功发送一条消息!'):data;
                    $("#console").prepend(temp);
                });
            });
        });

        // Format
        Date.prototype.format = function(fmt) {
            var o = {
                "M+" : this.getMonth()+1,                 //月份
                "d+" : this.getDate(),                    //日
                "h+" : this.getHours(),                   //小时
                "m+" : this.getMinutes(),                 //分
                "s+" : this.getSeconds(),                 //秒
                "q+" : Math.floor((this.getMonth()+3)/3), //季度
                "S"  : this.getMilliseconds()             //毫秒
            };
            if(/(y+)/.test(fmt))
                fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
            for(var k in o)
                if(new RegExp("("+ k +")").test(fmt))
                    fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
            return fmt;
        }

    </script>

</body>

需要在juery下面引入:

jquery.min.js

日志管理配置:

logback。xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="1 seconds">

    <contextName>logback</contextName>
    <property name="log.path" value="/data/applogs/xxl-mq/xxl-mq-samples-springboot.log"/>

    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
            </pattern>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="console"/>
        <appender-ref ref="file"/>
    </root>

</configuration>

配置XxlMqConf.java:

package com.xxl.mq.sample.springboot.conf;

import com.xxl.mq.client.factory.impl.XxlMqSpringClientFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
public class XxlMqConf {

    // ---------------------- param ----------------------

    @Value("${xxl.mq.admin.address}")
    private String adminAddress;
    @Value("${xxl.mq.accessToken}")
    private String accessToken;


    @Bean
    public XxlMqSpringClientFactory getXxlMqConsumer(){

        XxlMqSpringClientFactory xxlMqSpringClientFactory = new XxlMqSpringClientFactory();
        xxlMqSpringClientFactory.setAdminAddress(adminAddress);
        xxlMqSpringClientFactory.setAccessToken(accessToken);

        return xxlMqSpringClientFactory;
    }

}

controller 根据传入的参数进行设置:




import com.xxl.mq.client.message.XxlMqMessage;
import com.xxl.mq.client.producer.XxlMqProducer;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Calendar;
import java.util.Date;

/**
 * index controller
 * @author xuxueli 2015-12-19 16:13:16
 */
@Controller
public class IndexController {

    @RequestMapping("/")
    public String index(){
        return "index";
    }

    @RequestMapping("/produce")
    @ResponseBody
    public String produce(int type){

        String topic = "topic_1";
        String data = "时间戳:" + System.currentTimeMillis();

        if (type == 0) {

            /**
             * 并行消费
             */
            XxlMqProducer.produce(new XxlMqMessage(topic, data));

        } else if (type == 1) {

            /**
             * 串行消费
             */
            XxlMqProducer.produce(new XxlMqMessage(topic, data, 1L));

        } else if (type == 2) {

            /**
             * 广播消费
             */
            XxlMqProducer.broadcast(new XxlMqMessage(topic, data));


        } else if (type == 3) {

            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.MINUTE, 5);
            Date effectTime = calendar.getTime();

            /**
             * 延时消息
             */
            XxlMqProducer.produce(new XxlMqMessage(topic, data, effectTime));

        } else if (type == 4) {

            int msgNum = 10000;
            long start = System.currentTimeMillis();
            for (int i = 0; i < msgNum; i++) {
                XxlMqProducer.produce(new XxlMqMessage("topic_1", "No:"+i));
            }
            long end = System.currentTimeMillis();
            return "Cost = " + (end-start);

        } else {
            return "Type Error.";
        }

        return "SUCCESS";
    }

    @ExceptionHandler({Exception.class})
     public String exception(Exception e) {
         e.printStackTrace();
         return e.getMessage();
     }

}

对应的消费者:

import com.xxl.mq.client.consumer.IMqConsumer;
import com.xxl.mq.client.consumer.MqResult;
import com.xxl.mq.client.consumer.annotation.MqConsumer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

/**
 * Created by xuxueli on 16/8/28.
 */
@MqConsumer(topic = "topic_2")
@Service
public class Demo2MqComsumer implements IMqConsumer {
    private Logger logger = LoggerFactory.getLogger(Demo2MqComsumer.class);

    @Override
    public MqResult consume(String data) throws Exception {
        logger.info("[Demo2MqComsumer] 消费一条消息:{}", data);
        return MqResult.SUCCESS;
    }

}
import com.xxl.mq.client.consumer.IMqConsumer;
import com.xxl.mq.client.consumer.MqResult;
import com.xxl.mq.client.consumer.annotation.MqConsumer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

/**
 * Created by xuxueli on 16/8/28.
 */
@MqConsumer(topic = "topic_1")
@Service
public class DemoAMqComsumer implements IMqConsumer {
    private Logger logger = LoggerFactory.getLogger(DemoAMqComsumer.class);

    @Override
    public MqResult consume(String data) throws Exception {
        logger.info("[DemoAMqComsumer] 消费一条消息:{}", data);
        return MqResult.SUCCESS;
    }

}
import com.xxl.mq.client.consumer.IMqConsumer;
import com.xxl.mq.client.consumer.MqResult;
import com.xxl.mq.client.consumer.annotation.MqConsumer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

/**
 * Created by xuxueli on 16/8/28.
 */
@MqConsumer(topic = "topic_1")
@Service
public class DemoBMqComsumer implements IMqConsumer {
    private Logger logger = LoggerFactory.getLogger(DemoBMqComsumer.class);

    @Override
    public MqResult consume(String data) throws Exception {
        logger.info("[DemoBMqComsumer] 消费一条消息:{}", data);
        return MqResult.SUCCESS;
    }

}
import com.xxl.mq.client.consumer.IMqConsumer;
import com.xxl.mq.client.consumer.MqResult;
import com.xxl.mq.client.consumer.annotation.MqConsumer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

/**
 * Created by xuxueli on 16/8/28.
 */
@MqConsumer(topic = "topic_1", group = MqConsumer.EMPTY_GROUP)
@Service
public class DemoCMqComsumer implements IMqConsumer {
    private Logger logger = LoggerFactory.getLogger(DemoCMqComsumer.class);

    @Override
    public MqResult consume(String data) throws Exception {
        logger.info("[DemoCMqComsumer] 消费一条消息:{}", data);
        return MqResult.SUCCESS;
    }

}

 

posted @ 2019-02-20 13:31 动手的程序员 阅读( ...) 评论( ...) 编辑 收藏
apollo、xxljob、rocketMQ、Redis的一些优劣对比 1.相比于nacos,nacos作为微服务的配置中心将许多的springboot的ymal文件统一进行管理,但是对于。2.nacos的部署和操作相比于apollo较为直观和简单,减轻运维部署的工作,但apollo存在一定的学习成本。1.基于内存的数据库,如果内存增长过快,需要定期删除数据,受物理内存的限制。3.数据量不大的情况下,可以选择功能完备的RabbitMQ。1.Kafka:大数据场景必选,吞吐量大,数据量大首选。1.数据类型丰富,支持更丰富的数据操作。3.数据存储在内存,主机断电则数据丢失。 阅读详情

相关推荐

SpringBoot整合XXL-JOB【03】- 执行器的使用

在上节中,我们部署了调度中心,并且认识了调度中心,那么让它与我们的项目相结合呢?就需要用到“”,通过调度中心配置的“”,再在我们的项目里使用,就可以实现定时任务的控制了。

2301_78976656的博客 1021

分布式消息队列XXL-MQ

一、简介 1.1 概述 XXL-MQ是一款轻量级分布式消息队列,支持串行、并行和广播等多种消息模型。现已开放源代码,开箱即用。 支持三种消息模式: 消息模式 特征说明 适用场景 TOPIC(广播消息)模型 发布/订阅模式, 一条消息将会广播发送给对应Topic下所有在线的Consumer 如广播集群节点进行缓存更新、广播集群节点进行站点静态化等

lovelichao12的专栏 3451

SpringBoot整合XXL-JOB【02】- 启动调度中心

下载源码下来之后,要不用着急启动项目,在源码目录下的可以看到文件。

2301_78976656的博客 818

xxl-mq架构剖析

xxl-mq架构详解和执行流程详解

chenshuang_com的专栏 1469

XXL-MQ是一款轻量级分布式消息队列支持串行并行和广播等多种消息模型

XXL-MQ是一款轻量级分布式消息队列,支持串行、并行和广播等多种消息模型

xxl-mq, A lightweight distributed message queue framework.(分布式消息队列XXL-MQ).zip

xxl-mq, A lightweight distributed message queue framework.(分布式消息队列XXL-MQ)

SpringBoot整合通用xxl-job,自动注册任务

整个工具的代码都在Gitee或者Github地址内需要引入的JAR包。

m0_38040684的博客 1928

不用API Key也能玩转Obsidian AI:本地大模型离线配置全攻略

本文详细介绍了如何在无需API Key的情况下,通过本地部署大型语言模型(LLM)为Obsidian注入AI能力。文章以Ollama为例,提供了从环境准备、模型选择到与Obsidian插件(如Text Generator)集成的完整配置攻略,旨在帮助用户打造一个安全、离线可用的智能笔记工作流,实现数据隐私与AI助力的完美结合。

weixin_29062963的博客 818

XXL之整合SpringBoot

一、xxl-job-admin ①执行数据库脚本tables_xxl_job.sql,生成库表 ②通过nginx为调度中心集群做负载均衡,分别启动8001和8002端口的xxl-job-admin实例,建议修改xxl-job-admin的打包方式,将配置文件application.properties从jar包中剥离出来,方便修改配置 application.properties ###...

猎户星座 1644

使用GitLab+Drone CI持续集成自动部署web项目,图文详细

kind: pipeline # 定义对象类型,还有secret和signature两种类型 type: docker # 定义流水线类型,还有kubernetes、exec、ssh等类型 name: mall-tiny-drone # 定义流水线名称 steps: # 定义流水线执行步骤,这些步骤将顺序执行 - name: package # 流水线名称 image: maven:3-jdk-8 # 定义创建容器的Docker镜像 volumes: # 将容器内目录挂载到宿主机,仓库

4106

ST7789T3与CST816D驱动全解析,面试技巧第11篇:嵌入式面试场景问答 10 连发。

SPI模式下,SCLK、MOSI、CS、DC、RST为必需引脚;8080模式下需连接D0-D7、WR、RD等信号线。CST816D触摸芯片通常通过I2C接口通信,需连接SCL、SDA及INT(中断)引脚。确保电源引脚(VCC、GND)稳定供电,ST7789T3典型工作电压为3.3V。显示异常时检查时序参数,如SPI时钟频率(建议≤40MHz)、数据建立时间。初始化流程需发送一系列命令序列,包括设置像素格式、扫描方向、帧率控制等。扫描方向(MADCTL)可调整显示旋转角度,需根据实际硬件布局配置。

a967gsvj的博客 375

从零实现springboot整合xxl-job: 实现库存对账功能

话题 1:权威数据源的选择权衡 "在我的对账逻辑中,采用'以Redis为准'的策略反向修复DB。或通过以下地址docker命令在线生成网址:https://docker.aityp.com/docker/run?如果在对账任务执行过程中,MQ恰好也在异步同步同一批商品的库存,是否会产生并发更新冲突?引入XXL-JOB分布式定时任务进行定时对账,对比Redis和数据库两个数据源的库存数据。电商系统采用“拍下预扣减库存”模式时,用户下单会立即扣减Redis中的可用库存,同时增加锁定库存。

2301_81388176的博客 537

实战演练 | ABAQUS显式动力学分析在金属切削仿真中的应用

本文详细介绍了如何利用ABAQUS显式动力学分析进行金属切削过程的二维仿真。通过从零开始的完整流程,包括几何建模、材料本构与失效定义、网格划分、接触设置、边界条件施加,到结果后处理与切削力提取,为工程师和研究人员提供了实用的仿真方法,以优化刀具设计和加工工艺。

purple的博客 931

SpringBoot整合XXL-JOB【01】- 初识XXL-JOB

先来看看官方文档的定义:XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。。。而则可以让我们对这些任务进行统一的管理,比如开启或关闭特定的任务、修改任务的执行频率等等。

2301_78976656的博客 446

STC8G1K08A的10位PWM避坑指南:为什么你的占空比调节总失效?(附寄存器操作时序图)

本文深入剖析了STC8G1K08A单片机10位PWM功能中占空比调节失效的核心原因,揭示了数据手册未明确指出的寄存器操作时序陷阱。通过对比错误与正确配置的波形,文章指出关键在于更新占空比高2位前需临时关闭PWM输出,并提供了经过验证的安全操作宏与函数库,帮助开发者彻底解决此问题,实现0%-100%的平滑控制。

yyy34的博客 750

2025年7月5日全国青少年信息素养大赛Python编程初中组复赛真题+答案解析

2025年7月5日全国青少年信息素养大赛Python编程初中组复赛真题+答案解析

伶俐角少儿编程 467

项目终于用上了xxl-job,好起来了!

这就是本次 xxl-job 实战的全部内容了,写这篇文章主要是为了记录一下项目中是如何使用 xxl-job 的,并且提供一种分片广播均分任务的思路以及幂等性问题如何处理,具体使用 xxl-job 还需根据自己项目的需求,遇到问题可以参考官网。

sjkflw121150的博客 1669

[Python图像处理] 二.OpenCV+Numpy库读取与修改像素

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~ 同时推荐作者的C++图像系列知识: [数字图像处理] 一.MFC详解显示BMP格式图片 [数字图像处理] 二.MFC单文档分...

杨秀璋的专栏 3万+

xxl-job之框架讲解和使用

XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。设计思想:将调度行为抽象形成调度中心平台,平台本身不承担业务逻辑,而是负责发起调度请求后,由执行器接收调度请求并执行任务,这里的任务抽象为分散的 JobHandler。通过这种方式即可实现 调度 与 任务 相互解耦,从而提高系统整体的稳定性和拓展性。配置自定义任务有许多种模式,如 Bean模式(基于方法)、Bean模式(基于类)、GLUE模式等等。这里介绍通过 Bean模式(基于方法) 是如何自定义任务的。

上善若泪 2987

基于STM32的智能婴儿床设计(蓝牙通信+摄像头监控)_315

本项目设计并实现了一款基于STM32微控制器的智能婴儿床系统,通过多种传感器和智能控制模块为家长提供更便捷和高效的婴儿照护解决方案。系统包括婴儿哭泣检测、湿度监测、空气质量检测、温度监控等多项功能,并通过蓝牙与手机APP进行数据传输和远程控制。婴儿床内置摇摇床和安抚音乐播放功能,能够在婴儿哭泣时自动启动摇摇床并播放安抚音乐。此外,系统还支持摄像头远程监控,让家长实时查看婴儿的状态。整个系统采用STM32F103RCT6作为核心控制单元,结合声音传感器、湿度传感器、MQ135空气质量传感器。

865

WINCC7.3破解文件

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

xxl-job 是什么?

写这篇文章主要是为了记录一下项目中是如何使用 xxl-job 的,并且提供一种分片广播均分任务的思路以及幂等性问题如何处理,具体使用 xxl-job 还需根据自己项目的需求,遇到问题可以参考官网。

weixin_51291483的博客 4279

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

项目终于用上了xxl-job,真香!

大家好,我是不才陈某~今天分享一篇知识星球的球友分享的一篇xxl-job实战的文章,内容非常肝,慢慢看吧本篇文章主要记录项目中遇到的 xxl-job 的实战,希望能通过这篇文章告诉读者们什么是 xxl-job 以及怎么使用 xxl-job 并分享一个实战案例。那么下面先说明什么是 xxl-job 以及为什么要使用它。xxl-job 是什么?XXL-JOB 是一个分布式任务调度平台,其核心设计目标是...

码猿技术专栏 971

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

记一次 xxl-job 实战

本篇文章主要记录项目中遇到的 xxl-job 的实战,希望能通过这篇文章告诉读者们什么是 xxl-job 以及怎么使用 xxl-job 并分享一个实战案例。那么下面先说明什么是 xxl-job 以及为什么要使用它。xxl-job 是什么?XXL-JOB 是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。设计思想是将调度行为抽象形成调度中心平台,平台本身不承担业务逻辑,而是负责发起调度请求后,由执行器接收调度请求并执行任务,这里的任务抽象为分散的 JobHandler。

Java技术攻略的博客 731

SpringBoot + RabbitMQ + MySQL + XXL-Job:物流系统运单状态定时同步与异常订单重试

在复杂的物流系统中,“运单状态同步”是一个非常核心的功能。通常我们的系统需要定期从三方物流平台(如顺丰、京东、跨越等)拉取运单状态,然后更新本地订单状态。但现实中总是会有

Minoz_wl的博客 571
上一篇: springboot整合redis存放session
下一篇: 消息中间件
菩提树下的丁春秋
博客等级 码龄8年 18粉丝 336原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值