nginx+tomcat+memcached负载均衡集群搭建(一)

在CentOS6.4下搭建Nginx+Tomcat+Memcached负载均衡集群服务器。
                (1)Nginx负责负载均衡。
                (2)Tomcat负责实际服务。
                (3)Memcached负责同步Tomcat的Session,达到Session共享的目的。
     1、首先来安装JDK,不是必须要放在第一步。

1.1将下载好的JDK放进 local/usr/文件路径下(我所有下载的.tar.gz和.bin文件都是放在该路径下的,以便于以后查找),如果你用的是VMWARE,你可以使用WinSCP来将要传送的文件复制到该路径下即可。
1.2然后使用Linux命令解压

  1. tar -zvxf jdk.....  

1.3接着我们编辑/etc/profile,输入linux命令

  1. gedit /etc/profile  

1.4编辑profile文件,添加以下文本

  1. export JAVA_HOME=/usr/local/jdk    
  2. export PATH=$PATH:$JAVA_HOME/bin  

1.5验证jdk是否安装成功

  1. java -version  

2、安装nginx

         Nginx官网:http://nginx.org/ 
        在安装Nginx之前,需要先安装gcc、 openssl、 pcre和zlib软件库,这些貌似在Ubuntu下有些就不需要安装的,根据你自己的需要进行安装。
        首先我们来谈一下如果缺少这些问题会报哪些错误以及解决方案:

  1. 1)缺少pcre library  
  2.              ./configure: error: the HTTP rewrite module requires the PCRE library. You can either disable the module by using --without-http_rewrite_module option, or install the PCRE library into the system, or build the PCRE library statically from the source with nginx by using --with-pcre=<path> option.    

当执行./configure的时候会抛出说缺少PCRE library 这个是HTTP Rewrite 模块,也即是url静态化的包

所以首先我们要安装这个东西  PCRE下载PCRE ,我选择的是pcre-8.36.tar.gz版本

  1. # tar zxvf pcre-8.36.tar.gz  
  2. # ./configure    
  3. # make    
  4. # make install   
  1.  2)缺少gcc-c++,也就是c++编译包    
  2.              libtool: compile: unrecognized option `-DHAVE_CONFIG_H'   
  3. libtool: compile: Try `libtool --help' for more information.   
  4. make[1]: *** [pcrecpp.lo] Error 1   
  5. make[1]: Leaving directory `/usr/local/src//pcre-8.31'   
  6. make: *** [all] Error 2root@wolfdog-virtual-machine:~/work/pcre-8.12$ libtool -help -DHAVE_CONFIG_H   
  7. The program 'libtool' is currently not installed. You can install it by typing:   
  8. sudo apt-get install libtool    

在线安装:输入命令:

  1. yum install libtool   
       再输入:
  1. yum install gcc-c++   
  1. 3)缺少openssl库   
  2.           ./configure: error: the HTTP cache module requires md5 functions   
  3. from OpenSSL library. You can either disable the module by using   
  4. --without-http-cache option, or install the OpenSSL library into the system,   
  5. or build the OpenSSL library statically from the source with nginx by using   
  6. --with-http_ssl_module --with-openssl=<path> options.    

openssl官网:openssl下载
          在线安装: 

  1. yum install openssl libssl-dev libperl-dev  
  1. 4)缺少zlib库   
  2.           ./configure: error: the HTTP gzip module requires the zlib library.   
  3. You can either disable the module by using --without-http_gzip_module   
  4. option, or install the zlib library into the system, or build the zlib library   
  5. statically from the source with nginx by using --with-zlib=<path> option.   

zlib官网:下载zlib
       在线安装:
  1. yum install zlib  
  2. yum install zlib-devel  

 2.1接着安装nginx,版本为:nginx-1.7.9.tar.gz
  1. # ./configure    
  2.     # make    
  3.     # sudo make install  
1)解压
  1. tar -zxvf nginx-1.7.9.tar.gz  
  2. cd nginx-1.7.9  
2)安装
  1. # ./configure    
  2. # make    
  3. # make install   
 2.2安装完之后我们就可以在nginx的conf文件夹下面创建一个proxy.conf文件,配置一些代理参数
  1. $cd /usr/local/nginx/conf  
  2. $sudo touch proxy.conf  

  1. #!nginx (-)   
  2. # proxy.conf   
  3. proxy_redirect          off;  
  4. proxy_set_header        Host $host;  
  5. proxy_set_header        X-Real-IP $remote_addr;  #获取真实ip  
  6. #proxy_set_header       X-Forwarded-For   $proxy_add_x_forwarded_for; #获取代理者的真实ip  
  7. client_max_body_size    10m;  
  8. client_body_buffer_size 128k;  
  9. proxy_connect_timeout   90;  
  10. proxy_send_timeout      90;  
  11. proxy_read_timeout      90;  
  12. proxy_buffer_size       4k;  
  13. proxy_buffers           4 32k;  
  14. proxy_busy_buffers_size 64k;  
  15. proxy_temp_file_write_size 64k;  

2.3接着,我们要编辑nginx.conf文件
  1. gedit nginx.conf  
写上基本配置:
  1. #运行nginx所在的用户名和用户组    
  2. #user  www www;     
  3.       
  4. #启动进程数    
  5. worker_processes 8;    
  6. #全局错误日志及PID文件    
  7. error_log  /usr/local/nginx/logs/nginx_error.log  crit;    
  8.       
  9. pid        /usr/local/nginx/nginx.pid;    
  10.       
  11. #Specifies the value for maximum file descriptors that can be opened by this process.    
  12.       
  13. worker_rlimit_nofile 65535;    
  14. #工作模式及连接数上限    
  15. events    
  16. {    
  17.   use epoll;    
  18.   worker_connections 65535;    
  19. }    
  20. #设定http服务器,利用它的反向代理功能提供负载均衡支持    
  21. http    
  22. {    
  23.   #设定mime类型    
  24.   include       mime.types;    
  25.   default_type  application/octet-stream;    
  26.   include /usr/local/nginx/conf/proxy.conf;    
  27.   #charset  gb2312;    
  28.   #设定请求缓冲        
  29.   server_names_hash_bucket_size 128;    
  30.   client_header_buffer_size 32k;    
  31.   large_client_header_buffers 4 32k;    
  32.   client_max_body_size 8m;    
  33.             
  34.   sendfile on;    
  35.   tcp_nopush     on;    
  36.       
  37.   keepalive_timeout 60;    
  38.       
  39.   tcp_nodelay on;    
  40.       
  41. #  fastcgi_connect_timeout 300;    
  42. #  fastcgi_send_timeout 300;    
  43. #  fastcgi_read_timeout 300;    
  44. #  fastcgi_buffer_size 64k;    
  45. #  fastcgi_buffers 4 64k;    
  46. #  fastcgi_busy_buffers_size 128k;    
  47. #  fastcgi_temp_file_write_size 128k;    
  48.       
  49. #  gzip on;    
  50. #  gzip_min_length  1k;    
  51. #  gzip_buffers     4 16k;    
  52. #  gzip_http_version 1.0;    
  53. #  gzip_comp_level 2;    
  54. #  gzip_types       text/plain application/x-javascript text/css application/xml;    
  55. #  gzip_vary on;    
  56.       
  57.   #limit_zone  crawler  $binary_remote_addr  10m;    
  58.  ###禁止通过ip访问站点    
  59.   server{    
  60.         server_name _;    
  61.         return 404;    
  62.         }    
  63.       
  64.       
  65.   server    
  66.   {    
  67.     listen       80;    
  68.     server_name  localhost;    
  69.     index index.html index.htm index.jsp;#设定访问的默认首页地址    
  70.     root  /home/www/web/ROOT;#设定网站的资源存放路径    
  71.       
  72.     #limit_conn   crawler  20;        
  73.           
  74.     location ~ .*.jsp$ #所有jsp的页面均交由tomcat处理    
  75.     {    
  76.       index index.jsp;    
  77.       proxy_pass http://localhost:8080;#转向tomcat处理    
  78.       }    
  79.             
  80.           
  81.     location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ #设定访问静态文件直接读取不经过tomcat    
  82.     {    
  83.       expires      30d;    
  84.     }    
  85.       
  86.     location ~ .*\.(js|css)?$    
  87.     {    
  88.       expires      1h;    
  89.     }        
  90.       
  91. #定义访问日志的写入格式    
  92.      log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '    
  93.               '$status $body_bytes_sent "$http_referer" '    
  94.               '"$http_user_agent" $http_x_forwarded_for';    
  95.     access_log  /usr/local/nginx/logs/localhost.log access;#设定访问日志的存放路径    
  96.       
  97.       }       
  98. }  
2.4然后我们运行linux命令
  1. #/usr/local/nginx/sbin/nginx -t  
如果屏幕显示以下两行信息,说明配置文件正确:  
  1. the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok   
  2. the configuration file /usr/local/nginx/conf/nginx.conf was tested successfull   
但是这个时候一般会出现一个问题说是
  1. error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory   
解决方法:
  1. # ln -s /usr/local/lib/libpcre.so.1 /lib64  
32位系统则:
  1. ln -s /usr/local/lib/libpcre.so.1 /lib  

注:
/usr/local/lib/libpcre.so.1 为prce安装后的文件地址
低版本prce对应的libpcre.so.1 为libpcre.so.0 

 2.5启动与关闭Nginx 
       1)启动
  1. #/usr/local/nginx/sbin/nginx  
  1. 重启:  
  1. /usr/local/nginx/sbin/nginx -s reload  
      2)关闭
  1. #/usr/local/nginx/sbin/nginx -s stop  
  1. 或:   
  2. ps -ef | grep nginx  
找到主进程ID,然后kill即可,如:

# kill -9 [进程号]
好了,这样nginx就安装好了。
(3)检查是否启动成功:
netstat -ano " grep80 "有结果输入说明启动成功
打开浏览器访问此机器的 IP,如果浏览器出现Welcome to nginx! 则表示 Nginx 已经安装并运行成功。如果已经配置了负载均衡服务器,则会看Tomcat中的网站页面
3、安装memcached 
     Memcached官网:点击进入
3.1由于memcached安装时,需要使用libevent类库,所以先安装libevent 下载地址:点击进入
                 我下载的是版本:libevent-1.4.14b-stable.tar.gz 
3.2解压:
  1. libevent-1.4.14b-stable.tar.gz  
3.3进入
  1. cd libevent-1.4.14b-stable   
3.4编译安装(默认安装到/usr/local/lib/目录)
  1. # ./configure     
  2. # make     
  3. # make install   
3.5安装memcached,memcached    下载网址:http://www.danga.com/memcached/download.bml
  1. 1. 解压缩    
  2.  tar xzfv memcached-1.4.22.tar.gz    
  3. 2. 进入到 memcached-1.4.22目录    
  4.  cd memcached-1.4.22  
  5. 3. 编译,安装    
  6.     ./configure --prefix=/local/memcached    
  7.     make    
  8.     make install  
安装完成后,会在 /local/memcached 出现 bin和share目录


进行 bin目录,启动 memcache
方法如下: 
./memcached -d -u nobody -m 512 127.0.0.1 -p 11211
此时,会报一个异常
 error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory
原因是找不到libevent-1.4.so.2类库,解决办法如下:

使用LD_DEBUG=help ./memcached -v来确定 加载的类库路径,方法如下:
LD_DEBUG=libs ./memcached -v 2>&1 > /dev/null | less
则系统会显示:
  1. linux:/local/memcached/bin # LD_DEBUG=libs ./memcached -v 2>&1 > /dev/null | less    
  2.      20421:     find library=libevent-1.4.so.2; searching    
  3.      20421:      search cache=/etc/ld.so.cache    
  4.      20421:      search path=/lib/tls/i686/sse2:/lib/tls/i686:/lib/tls/sse2:/lib/tls:/lib/i686/sse2:/lib/i686:/lib/sse2:/lib:/usr/lib/tls/i686    
  5. /sse2:/usr/lib/tls/i686:/usr/lib/tls/sse2:/usr/lib/tls:/usr/lib/i686/sse2:/usr/lib/i686:/usr/lib/sse2:/usr/lib          (system search path)    
  6.      20421:       trying file=/lib/tls/i686/sse2/libevent-1.4.so.2    
  7.      20421:       trying file=/lib/tls/i686/libevent-1.4.so.2    
  8.      20421:       trying file=/lib/tls/sse2/libevent-1.4.so.2    
  9.      20421:       trying file=/lib/tls/libevent-1.4.so.2    
  10.      20421:       trying file=/lib/i686/sse2/libevent-1.4.so.2    
  11.      20421:       trying file=/lib/i686/libevent-1.4.so.2    
  12.      20421:       trying file=/lib/sse2/libevent-1.4.so.2    
  13.      20421:       trying file=/lib/libevent-1.4.so.2    
  14.      20421:       trying file=/usr/lib/tls/i686/sse2/libevent-1.4.so.2    
  15.      20421:       trying file=/usr/lib/tls/i686/libevent-1.4.so.2    
  16.      20421:       trying file=/usr/lib/tls/sse2/libevent-1.4.so.2    
  17.      20421:       trying file=/usr/lib/tls/libevent-1.4.so.2    
  18.      20421:       trying file=/usr/lib/i686/sse2/libevent-1.4.so.2    
  19.      20421:       trying file=/usr/lib/i686/libevent-1.4.so.2    
  20.      20421:       trying file=/usr/lib/sse2/libevent-1.4.so.2    
  21.      20421:       trying file=/usr/lib/libevent-1.4.so.2    
  22.      20421:        
  23. ./memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory  

  1. 我们看到,memcached会到很多地方去找,所以根据其它求,我们只需建一个软链接,指定到我们安装的类库上即可方法如下:    
  2. ln -s /usr/local/lib/libevent-1.4.so.2 /lib/libevent-1.4.so.2    
  3. 现在可以正常启动memcached了    
  4. ./memcached -d -u nobody -m 512 127.0.0.1 -p 11211    

memcache启动参数说明:
安装好了就可以使用memcached了,下面我用一种最简单的官方提供的方法java_memcached_releas


可以到这里去下载https://github.com/gwhalin/Memcached-Java-Client/downloads
       1)工具类
  1. package org.memcached.dhp.test;  
  2.   
  3. import java.util.Date;  
  4.   
  5. import com.danga.MemCached.MemCachedClient;  
  6. import com.danga.MemCached.SockIOPool;  
  7.   
  8. /**  
  9.  *   
  10.  * <pre><b>功能描述:</b>Memcached的 工具类  
  11.  *  
  12.  * @author xie)<br>  
  13.  *  
  14.  * <b>修改历史:</b>(修改人,修改时间,修改原因/内容)  
  15.  *  
  16.  * </pre>  
  17.  */    
  18. public final class MemcachedUtil {  
  19.     /**  
  20.      * <b>构造函数:工具类,禁止实例化</b>  
  21.      *   
  22.      */  
  23.     private MemcachedUtil() {  
  24.           
  25.     }  
  26.     // 创建全局的唯一实例   
  27.     private static MemCachedClient mcc = new MemCachedClient();  
  28.       
  29.     /**  
  30.      * 自身实例  
  31.      */    
  32.     private static MemcachedUtil memcachedUtil = new MemcachedUtil();  
  33.       
  34.     // 设置与缓存服务器的连接池  
  35.     static {  
  36.         // 服务器列表和其权重    
  37.         String[] servers = {"192.168.13.100:11211" };// Ip地址和端口号    
  38.         // 权重    
  39.         Integer[] weights = {3 };  
  40.         // 获取socket连接池的实例对象    
  41.         SockIOPool pool = SockIOPool.getInstance();  
  42.         // 设置服务器信息  
  43.         pool.setServers(servers);  
  44.         pool.setWeights(weights);  
  45.           
  46.         // 设置初始连接数、最小和最大连接数以及最大处理时间  
  47.         pool.setInitConn(5);  
  48.         pool.setMinConn(5);  
  49.         pool.setMaxConn(250);  
  50.         pool.setMaxIdle(1000 * 60 * 60 * 6);  
  51.           
  52.         // 设置主线程的睡眠时间  
  53.         pool.setMaintSleep(30);  
  54.         // 设置TCP的参数,连接超时等  
  55.         pool.setNagle(false);    
  56.         pool.setSocketTO(3000);    
  57.         pool.setSocketConnectTO(0);  
  58.           
  59.         // 初始化连接池  
  60.         pool.initialize();  
  61.         // 压缩设置,超过指定大小(单位为K)的数据都会被压缩    
  62.         // mcc.setCompressEnable(true);    
  63.         // mcc.setCompressThreshold(64 * 1024);  
  64.           
  65.         mcc.setPrimitiveAsString(true);   // 设置序列化  
  66.     }  
  67.     /**  
  68.      *   
  69.      * <pre><b>功能描述:</b>获取唯一实例.  
  70.      *   
  71.      * @author :xiezhaodong  
  72.      * <b>创建日期 :</b>2012-4-25 上午10:57:41  
  73.      *  
  74.      * @return  
  75.      *  
  76.      * <b>修改历史:</b>(修改人,修改时间,修改原因/内容)  
  77.      *  
  78.      * </pre>  
  79.      */  
  80.     public static MemcachedUtil getInstance() {    
  81.             
  82.         return memcachedUtil;    
  83.     }  
  84.     /**  
  85.      *   
  86.      * <pre><b>功能描述:</b>新增一个缓存数据  
  87.      *   
  88.      * @author :xiezhaodong  
  89.      * <b>创建日期 :</b>2012-4-25 上午10:55:15  
  90.      *  
  91.      * @param key 缓存的key  
  92.      * @param value 缓存的值  
  93.      * @return 操作结果  
  94.        
  95.      *  
  96.      * <b>修改历史:</b>(修改人,修改时间,修改原因/内容)  
  97.      *  
  98.      * </pre>  
  99.      */  
  100.     public boolean add(String key, Object value) {  
  101.         // 不会存入缓存  
  102.         return mcc.add(key, value);  
  103.         // return mcc.set(key, value);  
  104.     }  
  105.     /**  
  106.      *   
  107.      * <pre><b>功能描述:</b>新增一个缓存数据  
  108.      *   
  109.      * @author :xiezhaodong  
  110.      * <b>创建日期 :</b>2012-4-25 上午10:56:15  
  111.      *  
  112.      * @param key 缓存的key  
  113.      * @param value 缓存的值  
  114.      * @param expiry 缓存过期的时间  
  115.      * @return 操作结果  
  116.      *  
  117.      * <b>修改历史:</b>(修改人,修改时间,修改原因/内容)  
  118.      *  
  119.      * </pre>  
  120.      */  
  121.     public boolean add(String key, Object value, Date expiry) {  
  122.         // 不会存入缓存  
  123.         return mcc.add(key, value, expiry);  
  124.         // return mcc.set(key, value, expiry);  
  125.     }  
  126.       
  127.     /**  
  128.      * <pre><b>功能描述:</b>替换已有的缓存数据  
  129.      *   
  130.      * @author :xiezhaodong  
  131.      * <b>创建日期 :</b>2012-4-25 上午10:55:34  
  132.      *  
  133.      * @param key 设置对象的key  
  134.      * @return Object 设置对象的值  
  135.      * @return 是否替换成功  
  136.      *   
  137.      * <b>修改历史:</b>(修改人,修改时间,修改原因/内容)  
  138.      *  
  139.      * </pre>  
  140.      */  
  141.     public boolean replace(String key, Object value) {  
  142.         return mcc.replace(key, value);  
  143.     }  
  144.     /**  
  145.      *   
  146.      * <pre><b>功能描述:</b>替换已有的缓存数据  
  147.      *   
  148.      * @author :xiezhaodong  
  149.      * <b>创建日期 :</b>2012-4-25 上午10:43:17  
  150.      *  
  151.      * @param key 设置对象的key  
  152.      * @return Object 设置对象的值  
  153.      * @param expiry 过期时间  
  154.      * @return 是否替换成功  
  155.      *  
  156.      * <b>修改历史:</b>(修改人,修改时间,修改原因/内容)  
  157.      *  
  158.      * </pre>  
  159.      */  
  160.     public boolean replace(String key, Object value, Date expiry) {    
  161.             
  162.         return mcc.replace(key, value, expiry);    
  163.     }  
  164.     /**  
  165.      *   
  166.      * <pre><b>功能描述:</b>根据指定的关键字获取对象  
  167.      *   
  168.      * @author :xiezhaodong  
  169.      * <b>创建日期 :</b>2012-4-25 上午10:42:49  
  170.      *  
  171.      * @param key 获取对象的key  
  172.      * @return Object 对象值  
  173.      *  
  174.      * <b>修改历史:</b>(修改人,修改时间,修改原因/内容)  
  175.      *  
  176.      * </pre>  
  177.      */  
  178.     public Object get(String key) {  
  179.         return mcc.get(key);  
  180.     }  
  181.       
  182. }  

 2)对象,必须实现序列化接口
  1. package org.memcached.dhp.test;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class Employee implements Serializable {  
  6.       
  7.     /** 
  8.      * serialVersionUID 
  9.      */  
  10.     private static final long serialVersionUID = -271486574863799175L;  
  11.   
  12.     /**  
  13.      * 员工名字  
  14.      */    
  15.     private String EmpName;    
  16.         
  17.     /**  
  18.      * 部门名  
  19.      */    
  20.     private String deptName;    
  21.         
  22.     /**  
  23.      * 公司名  
  24.      */    
  25.     private String companyName;    
  26.         
  27.     /**  
  28.      *   
  29.      * <b>构造函数:</b>  
  30.      *   
  31.      */    
  32.     public Employee() {    
  33.     
  34.     }  
  35.       
  36.     /**  
  37.      * Access method for the empName property  
  38.      *   
  39.      * @return the empName  
  40.      */    
  41.     public String getEmpName() {    
  42.     
  43.         return EmpName;    
  44.     }    
  45.         
  46.     /**  
  47.      * Sets the value of empName the property  
  48.      *   
  49.      * @param empName the empName to set  
  50.      */    
  51.     public void setEmpName(String empName) {    
  52.     
  53.         EmpName = empName;    
  54.     }    
  55.         
  56.     /**  
  57.      * Access method for the deptName property  
  58.      *   
  59.      * @return the deptName  
  60.      */    
  61.     public String getDeptName() {    
  62.     
  63.         return deptName;    
  64.     }    
  65.         
  66.     /**  
  67.      * Sets the value of deptName the property  
  68.      *   
  69.      * @param deptName the deptName to set  
  70.      */    
  71.     public void setDeptName(String deptName) {    
  72.     
  73.         this.deptName = deptName;    
  74.     }    
  75.         
  76.     /**  
  77.      * Access method for the companyName property  
  78.      *   
  79.      * @return the companyName  
  80.      */    
  81.     public String getCompanyName() {    
  82.     
  83.         return companyName;    
  84.     }    
  85.         
  86.     /**  
  87.      * Sets the value of companyName the property  
  88.      *   
  89.      * @param companyName the companyName to set  
  90.      */    
  91.     public void setCompanyName(String companyName) {    
  92.     
  93.         this.companyName = companyName;    
  94.     }  
  95. }  

3)测试类
  1. package org.memcached.dhp.test;  
  2.   
  3. public class MemcachedUtilTest {  
  4.     public static void main(String[] args) {  
  5.         //add();    
  6.           
  7.         print();  
  8.     }  
  9.     private static void print() {  
  10.         MemcachedUtil cache = MemcachedUtil.getInstance();  
  11.         Employee emp=(Employee) cache.get("emp");    
  12.         System.out.println("name:"+emp.getCompanyName());    
  13.         System.out.println("dep:"+emp.getDeptName());    
  14.         System.out.println("emp:"+emp.getEmpName());   
  15.     }  
  16.       
  17.     private static void add() {  
  18.         MemcachedUtil cache = MemcachedUtil.getInstance();    
  19.             
  20.         Employee emp = new Employee();    
  21.         emp.setCompanyName("Kevin's Company");    
  22.         emp.setDeptName("R&D Dept");    
  23.         emp.setEmpName("Kevin");    
  24.             
  25.             
  26.         cache.add("emp", emp);  
  27.     }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值