Apache + Tomcat 负载均衡及Session绑定的实现

集群背景介绍


1.1 术语定义

 

  服务软体是b/s或c/s结构的s部分,是为b或c提供服务的服务性软件系统。

 

  服务硬体指提供计算服务的硬件、比如pc机、pc服务器。

 

  服务实体通指服务软体和服务硬体。

 

  客户端指接受服务实体服务的软件或硬件。

 

1.2 两大关键特性

 

集群是一组协同工作的服务实体,用以提供比单一服务实体更具扩展性与可用性的服务平台。在客户端看来,一个集群就象是一个服务实体,但事实上集群由一组服务实体组成。与单一服务实体相比较,集群提供了以下两个关键特性:

  • 可扩展性--集群的性能不限于单一的服务实体,新的服务实体可以动态地加入到集群,从而增强集群的性能。
  • 高可用性--集群通过服务实体冗余使客户端免于轻易遇到out of service的警告。在集群中,同样的服务可以由多个服务实体提供。如果一个服务实体失败了,另一个服务实体会接管失败的服务实体。集群提供的从一个出错的服务实体恢复到另一个服务实体的功能增强了应用的可用性。

1.3 两大能力

 

为了具有可扩展性和高可用性特点,集群的必须具备以下两大能力:

  • 负载均衡--负载均衡能把任务比较均衡地分布到集群环境下的计算和网络资源。
  • 错误恢复--由于某种原因,执行某个任务的资源出现故障,另一服务实体中执行同一任务的资源接着完成任务。这种由于一个实体中的资源不能工作,另一个实体中的资源透明的继续完成任务的过程叫错误恢复。

负载均衡和错误恢复都要求各服务实体中有执行同一任务的资源存在,而且对于同一任务的各个资源来说,执行任务所需的信息视图(信息上下文)必须是一样的。

 

1.4 两大技术

 

实现集群务必要有以下两大技术:

  • 集群地址--集群由多个服务实体组成,集群客户端通过访问集群的集群地址获取集群内部各服务实体的功能。具有单一集群地址(也叫单一影像)是集群的一个基本特征。维护集群地址的设置被称为负载均衡器。负载均衡器内部负责管理各个服务实体的加入和退出,外部负责集群地址向内部服务实体地址的转换。有的负载均衡器实现真正的负载均衡算法,有的只支持任务的转换。只实现任务转换的负载均衡器适用于支持ACTIVE-STANDBY的集群环境,在那里,集群中只有一个服务实体工作,当正在工作的服务实体发生故障时,负载均衡器把后来的任务转向另外一个服务实体。
  • 内部通信--为了能协同工作、实现负载均衡和错误恢复,集群各实体间必须时常通信,比如负载均衡器对服务实体心跳测试信息、服务实体间任务执行上下文信息的通信。

具有同一个集群地址使得客户端能访问集群提供的计算服务,一个集群地址下隐藏了各个服务实体的内部地址,使得客户要求的计算服务能在各个服务实体之间分布。内部通信是集群能正常运转的基础,它使得集群具有均衡负载和错误恢复的能力。

 

 

 

集群配置

 

      从上图可知,由服务实体1、服务实体2和负载均衡器组成了一个集群。服务实体1和服务实体2参与对客户端的服务支持工作,均衡负载器为客户端维护集群的单一影像。集群实体间通过内部的通信网交流信息,这种交流机制一般采用组播协议。负载均衡器通过内部通信网探测各服务实体的心跳信息,服务实体间通过内部通信网完成任务资源的传播。可以看出,配置集群主要由配置服务实体和配置负载均衡器两部分组成。本文使用tomcat 5.5.20、apache 2.2.11配置集群环境。

 

2.1 准备软件

2.2 配置负载均衡器

在apache下配置负载均衡器分为三步,注意每次修改httpd.conf和workers.properties时不要忘了重新启动apache。 

  • 第一步,安装和调试apache 
    负载均衡器jk2模块是apache www 服务的插件,所以配置负载均衡器就得先安装apache。本文下载的是windows版本 2.2.11,执行msi并回答一些简单问题就可完成apache的任务。值得注意的是,安装并启动apache后如果apache对http://localhost/ 地址没反应,你得修改apache安装路径下htdocs目录下的index.html.xx文件,比如把index.html.en改成index.html。
     
  • 第二步,安装jk2
    把下载的 mod_jk-1.2.28-httpd-2.2.3.so 改名为 mod_jk2.so 放到apache的modules目录下,修改apache的conf目录下的httpd.conf,在文件最后加入一行include conf\mod_jk2.conf,在conf目录下创建mod_jk2.conf文件,内容如下:
    Conf代码   收藏代码
    1. # Load mod_jk2 module  
    2. LoadModule jk_module modules/mod_jk2.so  
    3.   
    4.   
    5. # Where to find workers.properties  
    6. JkWorkersFile conf/workers.properties  
    7.   
    8.   
    9. # Where to put jk logs  
    10. JkLogFile logs/mod_jk2.log  
    11.   
    12.   
    13. # Set the jk log level [debug/error/info]  
    14. JkLogLevel info  
    15.   
    16.   
    17. # Select the log format  
    18. JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "  
    19.   
    20.   
    21. # JkOptions indicate to send SSL KEY SIZE,  
    22. JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories  
    23.   
    24.   
    25. # JkRequestLogFormat set the request format  
    26. JkRequestLogFormat "%w %V %T"  
    27.   
    28. # Send JSPs for context / to worker named loadBalancer  
    29. JkMount /*.jsp loadBalancer  
     
  • 第三步,配置jk2
    jk2的配置全在一个配置文件中,文件名为workers.properties,和apache 的httpd.conf放在同一个目录下。以下是这个文件的内容:
    Properties代码   收藏代码
    1. #  
    2. # workers.properties  
    3. #  
    4.   
    5. # list the workers by name  
    6.   
    7. worker.list=tomcat1, tomcat2, loadBalancer  
    8.   
    9. # ------------------------  
    10. # First tomcat server  
    11. # ------------------------  
    12. worker.tomcat1.port=8009  
    13. worker.tomcat1.host=192.168.0.107  
    14. worker.tomcat1.type=ajp13  
    15.   
    16. # Specify the size of the open connection cache.  
    17. #worker.tomcat1.cachesize  
    18.   
    19. #  
    20. # Specifies the load balance factor when used with  
    21. # a load balancing worker.  
    22. # Note:  
    23. # ----> lbfactor must be > 0  
    24. # ----> Low lbfactor means less work done by the worker.  
    25. worker.tomcat1.lbfactor=100  
    26.   
    27.   
    28. # ------------------------  
    29. # Second tomcat server  
    30. # ------------------------  
    31. worker.tomcat2.port=8009  
    32. worker.tomcat2.host=192.168.0.163  
    33. worker.tomcat2.type=ajp13  
    34.   
    35. # Specify the size of the open connection cache.  
    36. #worker.tomcat2.cachesize  
    37.   
    38. #  
    39. # Specifies the load balance factor when used with  
    40. # a load balancing worker.  
    41. # Note:  
    42. # ----> lbfactor must be > 0  
    43. # ----> Low lbfactor means less work done by the worker.  
    44. worker.tomcat2.lbfactor=100  
    45.   
    46.   
    47. # ------------------------  
    48. # Load Balancer worker  
    49. # ------------------------  
    50.   
    51. #  
    52. # The loadbalancer (type lb) worker performs weighted round-robin  
    53. # load balancing with sticky sessions.  
    54. # Note:  
    55. # ----> If a worker dies, the load balancer will check its state  
    56. # once in a while. Until then all work is redirected to peer  
    57. # worker.  
    58. worker.loadBalancer.type=lb  
    59. worker.loadBalancer.balanced_workers=tomcat1, tomcat2  
    60.   
    61. #  
    62. # END workers.properties  
    63. #  
     
    对于jk2模块的负载均衡配置可参见相关站点,值得提的是jk2的负载均衡还支持权重分配等优秀功能。

测试:

在跑tomcat1实例的机器的 webapps/testGroup 测试项目目录生成如下内容的index.jsp文件:(设置session)

Jsp代码   收藏代码
  1. <%   
  2.    System.out.println("===========================");  
  3.    System.out.println(session.getAttribute("test"));  
  4.    session.setAttribute("test","Session");  
  5. %>  
  6.   
  7. <html>  
  8.   <body bgcolor="red">  
  9.     <center>  
  10.     <h1>Tomcat 1</h1>  
  11.   </body>  
  12. </html>  

 

同理,在跑tomcat2实例的机器的 webapps/testGroup 测试项目目录生成如下内容的index.jsp文件:

Jsp代码   收藏代码
  1. <%   
  2.    System.out.println("===========================");  
  3.    System.out.println(session.getAttribute("test"));  
  4. %>  
  5.   
  6. <html>  
  7.   <body bgcolor="blue">  
  8.     <center>  
  9.     <h1>Tomcat 2</h1>  
  10.   </body>  
  11. </html>  

 

启动Tomcat1, Tomcat2 和Apache服务

Apache服务器ip:192.168.0.105

Tomcat1服务器ip:192.168.0.107

Tomcat2服务器ip:192.168.0.163

首先验证Apache服务器的静态页面是否正常,访问:http://192.168.0.105/(若局域网内不能访问请检查防火墙设置)
验证tomcat和apache配置提供负载均衡,用不同的终端访问:http://192.168.0.105/testGroup/index.jsp
如果你看到红色的页面,表示为tomcat1 服务器返回的,
如果你看到兰色的页面,表示为tomcat2 服务器返回的。

 

2.3 配置tomcat(绑定session)

 

同属于一个集群下的两个服务实体,要求功能的同一性,所以我们可先安装和配置第一个tomcat,接着拷贝形成第二个tomcat,最后配置第二个tomcat。


2.3.1修改tomcat1, tomcat2的server.xml

2.3.1.1 修改 <Engine /> 标签

在跑第一个tomcat实例的机器上,在大约第120行(去掉注释), 将
<Engine name="Standalone" defaultHost="localhost" debug="0">
替换为:
<Engine jvmRoute="tomcat1" name="Standalone" defaultHost="192.168.0.105" debug="0" />
对跑第二个tomcat实例的机器上,替换为 jvmRoute="tomcat2".

Xml代码   收藏代码
  1. <!-- You should set jvmRoute to support load-balancing via AJP ie :  
  2. <Engine name="Standalone" defaultHost="localhost" jvmRoute="jvm1">  
  3. -->   
  4. <Engine jvmRoute="tomcat2" name="Standalone" defaultHost="192.168.0.105" debug="0" />  
  5.       

 

有的文档写得是在配置中加入一行<Engine jvmRoute="tomcat1" name="Standalone" defaultHost="localhost" debug="0"></Engine>,其实是不对的,这样负载均衡是没有问题的,但是不能做session绑定,也就是说同一用户会在两台服务器上跳来跳去。这是由于jvmRoute不正确引起的,因为如果只是加入一行的话,是没有什么作用的,Engine仍然是原来的 Engine,而原来的Engine中jvmRoute是不正确的,所以一定要替换。而且这个jvmRoute一定要跟 workers.properties 中的名称完全匹配,否则也不能实现session绑定.

 

2.3.1.2 修改 <Cluster /> 标签

将<Cluster />标签注释去掉,代码如下:

Xml代码   收藏代码
  1. <Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"  
  2.                  managerClassName="org.apache.catalina.cluster.session.DeltaManager"  
  3.                  expireSessionsOnShutdown="false"  
  4.                  useDirtyFlag="true"  
  5.                  notifyListenersOnReplication="true">  
  6.   
  7.             <Membership   
  8.                 className="org.apache.catalina.cluster.mcast.McastService"  
  9.                 mcastAddr="228.0.0.4"  
  10.                 mcastPort="45564"  
  11.                 mcastFrequency="500"  
  12.                 mcastDropTime="3000"/>  
  13.   
  14.             <Receiver   
  15.                 className="org.apache.catalina.cluster.tcp.ReplicationListener"  
  16.                 tcpListenAddress="auto"  
  17.                 tcpListenPort="4001"  
  18.                 tcpSelectorTimeout="100"  
  19.                 tcpThreadCount="6"/>  
  20.   
  21.             <Sender  
  22.                 className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"  
  23.                 replicationMode="pooled"  
  24.                 ackTimeout="15000"  
  25.                 waitForAck="true"/>  
  26.   
  27.             <Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"  
  28.                    filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>  
  29.                      
  30.             <Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"  
  31.                       tempDir="/tmp/war-temp/"  
  32.                       deployDir="/tmp/war-deploy/"  
  33.                       watchDir="/tmp/war-listen/"  
  34.                       watchEnabled="false"/>  
  35.                         
  36.             <ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/>  
  37.         </Cluster>  

 

 2.3.2修改testGroup测试项目中的web.xml

在web.xml加入 <distributable/>  即可

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="ISO-8859-1"?>  
  2.   
  3. <web-app xmlns="http://java.sun.com/xml/ns/javaee"  
  4.    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
  6.    version="2.5">   
  7.   
  8.     <display-name>TomcatDemo</display-name>  
  9.     <distributable/>  
  10.       
  11. </web-app>  

 

 重启apache,tomcat1,tomcat2

用不同的终端访问:http://192.168.0.105/testGroup/index.jsp

可以看到Tomcat终端不再打印null,一方设置session双方都打印出session,实现session共享

 

注:本文使用本机+2台虚拟机共3台电脑完成集群配置,若只需一台电脑完成集群配置,则只需要更改多个Tomcat中相冲突的端口号即可完成。

Sentinel--哨兵系列数据下载地址及流程更新【202310】 哨兵系列数据下载地址及流程更新。哨兵系列卫星作为哥白尼计划的一部分,主要目标便是对地球的观测任务。哥白尼计划由三部分组成:空间部分(哨兵系列太空任务与其他太空机构任务)、测量部分(提供海洋、大陆表面和大气信息的陆基和机载数据收集网络)、数据管理与全球共享。 阅读详情

相关推荐

Cadence Allegro 17.4学习记录开始00

Cadence Allegro 有三个版本,16.6,17.2,17.4。现在主要学习最新的版本17.4.原理图设计:OrCADPCB设计:Allegro主要用到的就下面三个图片软件:PCB Editor 17.4 是用来画PCB和元器件封装的;Padstack Editor 17.4 是用来画元器件焊盘的;Capture CIS 17.4 是用来画原理图和原理图库的。其实Cadence还有很多功能,现在计划先学习以上内容,后面熟悉了这个软件,还可以继续学习放仿真等功能。

qq_31444421的博客 7450

session绑定与解绑,钝化活化

session对象的四种状态: 1)绑定、解绑 2)与钝化(序列化、持久化)、活化(反序列化)二者的联系:对象绑定在session中(监听1),session钝化对象随之钝化(监听2)。 下面将介绍这两个过程的监听即:绑定、解绑 与钝化、活化。 session绑定和解绑(无需配置web.xml): 监听象需实现:HttpSessionBingListener接口。作用:javabean实现H...

大学生小汪的成长博客 588

Modbus 通信协议详解

Modbus是由 Modicon(现为施耐德电气公司的一个品牌)在 1979 年发明的,是全球第一个真正用于工业现场的总线协议。ModBus网络是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。其系统结构既包括硬件、亦包括软件。它可应用于各种数据采集和过程监控。为更好地普及和推动Modbus在基于以太网上的分布式应用,目前施耐德公司已将Modbus协议的所有权移交给 IDA(,分布式自动化接口)组织,并成立了 Modbus-IDA 组织。

Projectsauron 的博客 7万+

业务数据绑定到域对象

怎么将处理请求时候产生的业务数据绑定到具体的对象(变量)然后传递给视图层可以在视图层进行展示

m0_73837751的博客 1052

STM32F103内部晶振配置实战:从代码修改到频率验证(附工程模板)

本文详细介绍了STM32F103内部晶振(HSI)的配置实战,从代码修改到频率验证的全流程,并附赠可直接使用的工程模板。通过对比HSI与外部晶振的优缺点,帮助开发者在成本敏感和空间受限的应用中实现稳定时钟配置,同时提供频率校准和常见问题排查方法。

weixin_29171087的博客 323

IO多路转接 ——— select、poll、epoll

select是系统提供的一个多路转接接口。select函数的函数原型如下: 参数说明:参数timeout的取值:返回值说明:select调用失败时,错误码可能被设置为:fd_set结构与sigset_t结构类似,fd_set本质也是一个位图,用位图中对应的位来表示要监视的文件描述符。 调用select函数之前就需要用fd_set结构定义出对应的文件描述符集,然后将需要监视的文件描述符添加到文件描述符集当中,这个添加的过程本质就是在进行位操作,但是这个位操作不需要用户自己进行,系统提供了一组专门的接口,用

2021dragon的博客 7979

Tomcat session复制及session共享技术

为什么要做session复制或共享Session共享是指在多个服务器之间共享用户会话数据的能力,这对于构建高可用性和可伸缩性的Web应用程序至关重要。实现Session复制或Session共享的目的是为了在多个Tomcat实例之间实现Session的无缝转移和共享,以提供更高的可伸缩性、负载均衡和容错性。

Lzcsfg的博客 2156

Unreal5(虚幻五) 实现UI与C++代码逻辑的交互 保姆级教程

本人有Unity基础,刚学UE几天,把这一套处理流程记录一下备用。

qq_42915442的博客 9816

javaweb——session绑定解绑、钝化活化

1、session钝化、活化 钝化、活化的本质就是序列化和反序列化 当有一个用户访问服务器时,服务器就会为该用户创建一个session,有多少用户,就有多少session,但服务器内存有限,用户达到一定数量时,session就不能全放在内存中了,这时可以把session放在硬盘里,这就是session的钝化(序列化)。反过来,将硬盘中的session放到内存中就是session的活化。 钝化: ...

qq_39909290的博客 467

工业相机,大恒,面振相机8脚电源线和I/O触发接口线,颜色和接法说明和触发软件设定

上图: 说明一下,工业相机有TTL逻辑电平触发,也有光耦触发等。 这里一般我们用电路板驱动,就用GPIO触发模式, 这里,准备了两个GPIO触发模式,为LINE2,LINE3都可以选择,然后有一个GPIO_GND 如果,你只有一个触发接口,那么如图,选两个就好了。 实际接法如图。 ...

山云的专栏 1万+

AIGC算法工程师面试八股文深度解析与进阶指南:揭秘Diffusion Models核心原理与实战技巧

总结来说,Cosine Noise Scheduler 的核心优势在于它能够更巧妙地平衡信号和噪声的比例,在扩散过程的早期阶段更长时间地保留原始图像的细节信息,从而为去噪模型提供一个更友好的学习环境,最终带来更优异的生成质量。🚀

FJN110的博客 346

js-object学习笔记

js--object学习笔记 1、js数据类型 基本数据类型:number、string、boolean、null、undefined 引用数据类型:object

weixin_43452622的博客 258

【优化模型】求解混合整数线性规划 MILP 问题

混合整数线性规划(Mixed Integer Linear Programming,MILP)是一类优化问题,其中目标函数和约束条件均为线性,并且包含整数变量。MILP 在实际应用中具有广泛的应用,可以解决很多实际问题,如生产调度、网络设计、资源分配等。f — 系数向量。系数向量,指定为实数向量或实数数组。intcon — 整数约束组成的向量。整数约束组成的向量,指定为正整数向量。intcon 中的值指示决策变量 x 中应取整数值的分量。A — 线性不等式约束。线性不等式约束,指定为实矩阵。

Fanjufei的博客 2501

[转]Apache+Tomcat负载均衡及Session绑定的实现

集群背景介绍 1.1 术语定义 服务软体是b/s或c/s结构的s部分,是为b或c提供服务的服务性软件系统。 服务硬体指提供计算服务的硬件、比如pc机、pc服务器。 服务实体通指服务软体和服务硬体。 客户端指接受服务实体服务的软件或硬件。 1.2 两大关键特性 集群是一组协同工作的服务实体,用以提供比单一服务实体...

Carter12175的博客 150

数学建模模型总结

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

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Apache+Tomcat负载均衡及Session绑定的实现

集群背景介绍 1.1 术语定义     服务软体是b/s或c/s结构的s部分,是为b或c提供服务的服务性软件系统。     服务硬体指提供计算服务的硬件、比如pc机、pc服务器。     服务实体通指服务软体和服务硬体。     客户端指接受服务实体服务的软件或硬件。   1.2 两大关键特性   集群是一组协同工作

Java海洋 1681

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Apache和Tomcat实现负载均衡及Session绑定

集群背景介绍 1.1 术语定义 服务软体是b/s或c/s结构的s部分,是为b或c提供服务的服务性软件系统。 服务硬体指提供计算服务的硬件、比如pc机、pc服务器。 服务实体通指服务软体和服务硬体。 客户端指接受服务实体服务的软件或硬件。 1.2 两大关键特性 集群是一组协同工作的服务实体,用以提供比单一服务实体更具扩展性与可用性的服务平台。在客户端看来,一个集群就象是...

沐浴清风 204

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

议Apache+Tomcat 负载均衡及Session绑定的实现

集群背景介绍 1.1 术语定义     服务软体是b/s或c/s结构的s部分,是为b或c提供服务的服务性软件系统。     服务硬体指提供计算服务的硬件、比如pc机、pc服务器。     服务实体通指服务软体和服务硬体。     客户端指接受服务实体服务的软件或硬件。   1.2 两大关键特性   集群是一组协同工作的服务实体,用以提供比单一服务实体更具扩展性与可...

yde986的专栏 160

Apache+Tomcat负载均衡及Session绑定的实现 .

集群背景介绍 1.1 术语定义     服务软体是b/s或c/s结构的s部分,是为b或c提供服务的服务性软件系统。     服务硬体指提供计算服务的硬件、比如pc机、pc服务器。     服务实体通指服务软体和服务硬体。     客户端指接受服务实体服务的软件或硬件。   1.2 两大关键特性   集群是一组协同工作的服务实体,用以提供比单一服务实体更具扩展性与可...

行动起来 133

apache2.2.x+Tomcat6.0 负载均衡及Session绑定的实现

apache2.2.x+Tomcat6.0 负载均衡及Session绑定的实现

988

Apache 2.0.4 + Tomcat 5.5负载均衡及Session绑定的实现

1、选择两台服务器,其中一台Server1装上Apache和Tomcat,另外一台Server2装Tomcat2、下载Connector,将mod_jk2.so文件拷贝到%Apache_Home%/modules/目录下。3、修改%Apache_Home%/conf/httpd.conf文件,在适当位置加入以下代码:LoadModule jk2_module modules/mod_jk2

haroyy的专栏 1903
上一篇: Installshield 12 安装包制作工具
下一篇: jbpm_工作流框架笔记
yufei_java
博客等级 码龄10年 18粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值