centos6安装rabbitmq

3 篇文章 0 订阅

一、安装依赖包

yum install build-essential openssl openssl-devel unixODBC unixODBC-devel  make gcc gcc-c++ kernel-devel m4 ncurses-devel tk tc xz unixODBC  unixODBC-devel wxBase  wxGTK SDL wxGTK-gl -y

二、下载erlang(erlang、socat、abbitmq,版本之间需要对应支持)

wget https://packages.erlang-solutions.com/erlang/esl-erlang/FLAVOUR_1_general/esl-erlang_21.0.5-1~centos~6_amd64.rpm

三、下载socat-1.7.3.2(erlang、socat、abbitmq,版本之间需要对应支持)

wget http://repo.iotti.biz/CentOS/7/x86_64/socat-1.7.3.2-5.el7.lux.x86_64.rpm

四、下载rabbitmq(根据erlang官网最新版本,(erlang、socat、abbitmq,版本之间需要对应支持))

wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.14/rabbitmq-server-3.7.14-1.el6.noarch.rpm

五、安装

1、安装erlang

rpm -ivh erlang-18.3-1.el7.centos.x86_64.rpm

在这里插入图片描述
2、安装rabbitmq-server

rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm

在这里插入图片描述
提示需要一个socat依赖库
3、安装socat

rpm -ivh socat-1.7.3.2-5.el7.lux.x86_64.rpm

在这里插入图片描述
4、再安装rabbitmq-server

rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm

在这里插入图片描述
安装成功
六、修改配置
rpm安装,默认目录为:

/usr/lib/rabbitmq

进入rabbirmq目录

cd /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin
vim rabbit.app 

rabbit.app:核心配置文件
在这里插入图片描述
端口默认:5672
在这里插入图片描述
将{loopback_users, [<<“guest”>>]} ,把guest用户打开,才能登录管控台

{loopback_users, [guest]}

在这里插入图片描述
保存、退出
七、启动rebbitmq

rabbitmq-server start &

在这里插入图片描述
显示日志文件路径

我们打开日志文件

vim /var/log/rabbitmq/rabbit\@zabbix_server.log

在这里插入图片描述
里面记录启动时的一些步骤,最后一行显示启动完毕。
在这里插入图片描述
5672端口已经被rabbitmq监听
八、安装管控台插件

rabbitmq-plugins  enable rabbitmq_management

在这里插入图片描述
安装成功,管控台默认端口号:15672


rabbitmq服务总算start成功了,但是执行rabbitmq-plugins enable rabbitmq_management还是报错:
在这里插入图片描述
执行umask 0022

九、登录管控台

http://172.28.18.75:15672/

在这里插入图片描述
显示登录页面,用guest guest登录即可,这里最好我们使用rabbitmqctl命令添加一个管理员用户
在这里插入图片描述
目前只有guest用户

添加一个admin用户

rabbitmqctl add_user admin password

为用户设置管理员标记

rabbitmqctl set_user_tags admin administrator

为用户设置权限

rabbitmqctl set_permissions -p / admin '.*' '.*' '.*'

用新建的 admin可以登录管控台了

后台启动rabbitmq

  rabbitmq-server -deched --后台启动节点
  rabbitmqctl stop_app --关闭节点上的应用
  rabbitmqctl start_app --启动节点上的应用
  rabbitmqctl stop --关闭节点

rabbitmq3.6.5镜像集群搭建以及haproxy负载均衡

一、集群架构
在这里插入图片描述
后端75、103、69分别是3台rabbitmq节点做镜像集群,前端103用haproxy作为负载均衡器
二、安装rabbitmq节点
参照上面或者
https://www.cnblogs.com/sky-cheng/p/10709104.html
https://www.cnblogs.com/sky-cheng/p/10716625.html
https://www.cnblogs.com/sky-cheng/p/10749189.html
https://www.jianshu.com/p/fed2efe62147
https://jingyan.baidu.com/article/c910274bb1fc54cd371d2d67.html

可能会回到的坑,参照
https://www.cnblogs.com/michael-xiang/p/10467732.html
三、配置hosts文件

vim /etc/hosts
172.28.18.75 zabbix_server
172.28.18.103 node2
172.28.18.69 node3

这里的zabbix_server主机就是node1,因为是我一台监控服务器,所以我就没有修改主机名。一下zabbix_server主机对应的就是node1节点。
四、设置erlang cookie
RabbitMQ节点之间和命令行工具 (e.g. rabbitmqctl)是使用Cookie互通的,Cookie是一组随机的数字+字母的字符串。当RabbitMQ服务器启动的时候,Erlang VM会自动创建一个随机内容的Cookie文件。如果是通过源安装RabbitMQ的话,Erlang Cookie 文件在/var/lib/rabbitmq/.erlang.cookie。如果是通过源码安装的RabbitMQ,Erlang Cookie文件$HOME/.erlang.cookie。

首先需要将3个节点的cookie进行统一,将75的.erlang.cookie覆盖到103和69的cookie

.erlang.cookie文件权限默认是400

[root@zabbix_server src]# ll -a /var/lib/rabbitmq/
总用量 16
drwxr-xr-x   3 rabbitmq rabbitmq 4096 3月  29 05:48 .
drwxr-xr-x. 34 root     root     4096 4月  15 10:13 ..
-r--------   1 rabbitmq rabbitmq   20 4月  15 00:00 .erlang.cookie
drwxr-x---   4 rabbitmq rabbitmq 4096 4月  18 09:12 mnesia

修改权限为777

chmod 777 /var/lib/rabbitmq/.erlang.cookie
[root@zabbix_server src]# ll -a /var/lib/rabbitmq/.erlang.cookie
-rwxrwxrwx 1 rabbitmq rabbitmq 20 4月 15 00:00 /var/lib/rabbitmq/.erlang.cookie

复制文件

[root@zabbix_server src]# scp -P25601 /var/lib/rabbitmq/.erlang.cookie root@172.28.18.103:/var/lib/rabbitmq/
root@172.28.18.103's password: 
.erlang.cookie                                                        100%   20     0.0KB/s   00:00  
[root@zabbix_server src]# scp -P25601 /var/lib/rabbitmq/.erlang.cookie root@172.28.18.69:/var/lib/rabbitmq/
root@172.28.18.69's password: 
.erlang.cookie                                                        100%   20     0.0KB/s   00:00 

验证三个节点文件内容是否相同

[root@zabbix_server src]# cat /var/lib/rabbitmq/.erlang.cookie
ATHUHJDWKYXPPLSHYCED
[root@localhost src]# cat /var/lib/rabbitmq/.erlang.cookie
ATHUHJDWKYXPPLSHYCED
[root@localhost ~]# cat /var/lib/rabbitmq/.erlang.cookie
ATHUHJDWKYXPPLSHYCED

再将node1、node2、node3将权限恢复为400

[root@zabbix_server src]# chmod 400 /var/lib/rabbitmq/.erlang.cookie
[root@localhost src]# chmod 400 /var/lib/rabbitmq/.erlang.cookie
[root@localhost ~]# chmod 400 /var/lib/rabbitmq/.erlang.cookie


报错:“Cookie file /var/lib/rabbitmq/.erlang.cookie must be accessible by owner only”
解决办法-unable to start rabbitmq server on ubuntu 10.04:
chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
chmod 600 /var/lib/rabbitmq/.erlang.cookie
看来.erlang.cookie的属组也很关键,修改好之后是这样的:
-rw------- 1 rabbitmq rabbitmq 20 Jun 14 14:31 .erlang.cookie

五、使用detached参数,启动rabbitmq 节点
先停止3个rabbitmq节点(如果命令停不了,就是用kill -9 进程号)


在这里插入图片描述

[root@zabbix_server /]# rabbitmqctl stop
Stopping and halting node rabbit@zabbix_server ...
[root@zabbix_server /]# 

注意修改3个服务器的主机名

[root@localhost src]# hostname
localhost.localdomain
[root@localhost src]# hostname node2.jinglong
[root@localhost src]# hostname
node2.jinglong

重启ssh登录

[root@node2 ~]# hostname
node2.jinglong

显示@ node2了
启动3个节点 ,带detached参数

[root@zabbix_server /]# rabbitmq-server -detached
Warning: PID file not written; -detached was passed.

六、查看3个节点状态

[root@zabbix_server src]# rabbitmqctl cluster_status
Cluster status of node rabbit@zabbix_server ...
[{nodes,[{disc,[rabbit@zabbix_server]}]},
 {running_nodes,[rabbit@zabbix_server]},
 {cluster_name,<<"rabbit@zabbix_server">>},
 {partitions,[]},
 {alarms,[{rabbit@zabbix_server,[]}]}]
[root@node2 ~]# rabbitmqctl  cluster_status
Cluster status of node rabbit@node2 ...
[{nodes,[{disc,[rabbit@node2]}]},
 {running_nodes,[rabbit@node2]},
 {cluster_name,<<"rabbit@node2">>},
 {partitions,[]},
 {alarms,[{rabbit@node2,[]}]}]
[root@node3 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@node3 ...
[{nodes,[{disc,[rabbit@node3]}]},
 {running_nodes,[rabbit@node3]},
 {cluster_name,<<"rabbit@node3">>},
 {partitions,[]},
 {alarms,[{rabbit@node3,[]}]}]

七、将node2、node3节点加入集群
3个节点启动后,节点和应用同时启动,应用默认是standalone模式,即单机模式,所以需要先停掉需要加入集群的node2、node3节点的应用,然后将节点进行加入集群设置:

在node2服务器上操作

[root@node2 ~]# rabbitmqctl stop_app
Stopping node rabbit@node2 ...

注意,这里不能使用 rabbitmqctl stop,这样会将节点也停掉,就不能进行后续节点加入集群操作了,只能使用stop_app参数停掉应用。

将node2加入集群

[root@node2 ~]# rabbitmqctl join_cluster rabbit@zabbix_server
Clustering node rabbit@node2 with rabbit@zabbix_server ...
Error: unable to connect to nodes [rabbit@zabbix_server]: nodedown

DIAGNOSTICS
===========

attempted to contact: [rabbit@zabbix_server]

rabbit@zabbix_server:
  * unable to connect to epmd (port 4369) on zabbix_server: nxdomain (non-existing domain)


current node details:
- node name: 'rabbitmq-cli-76@node2'
- home dir: /var/lib/rabbitmq
- cookie hash: W3bZoV8WKKWsCgfh3FFkzw==

报错,(non-existing domain),此时排查3台服务器的/etc/hosts文件内容,保证和hostname名称一致

vim /etc/hosts
172.28.18.75 zabbix_server
172.28.18.103 node2
172.28.18.69 node3

再次加入集群

[root@node2 ~]# rabbitmqctl join_cluster rabbit@zabbix_server
Clustering node rabbit@node2 with rabbit@zabbix_server ...
[root@node2 ~]# 

查看集群状态

[root@node2 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@node2 ...
[{nodes,[{disc,[rabbit@node2,rabbit@zabbix_server]}]},
 {alarms,[{rabbit@zabbix_server,[]}]}]

此时可以看到nodes里已经有2个节点了node2和zabbix_server,说明集群加入成功

在75上查看集群状态

[root@zabbix_server src]# rabbitmqctl  cluster_status
Cluster status of node rabbit@zabbix_server ...
[{nodes,[{disc,[rabbit@node2,rabbit@zabbix_server]}]},
 {running_nodes,[rabbit@zabbix_server]},
 {cluster_name,<<"rabbit@zabbix_server">>},
 {partitions,[]},
 {alarms,[{rabbit@zabbix_server,[]}]}]

也能看到有2个节点了,我们再把node3节点也加入集群

[root@node3 ~]# rabbitmqctl join_cluster rabbit@zabbix_server
Clustering node rabbit@node3 with rabbit@zabbix_server ...
[root@node3 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@node3 ...
[{nodes,[{disc,[rabbit@node2,rabbit@node3,rabbit@zabbix_server]}]},
 {alarms,[{rabbit@zabbix_server,[]}]}]

此时,可以看到nodes里出现了node3节点,加入集群成功。我们再把node2和node3节点的应用启动

我们打开75的管控台
在这里插入图片描述
此时节点信息里,已经出现了node2和node3,但是目前的状态的未运行,所以我们需要把node2和node3的应用启动

[root@node2 ~]# rabbitmqctl start_app
Starting node rabbit@node2 ...
[root@node3 ~]# rabbitmqctl start_app
Starting node rabbit@node3 ...

此时刷新75的管控台
在这里插入图片描述
集群中的3个节点都已经正常了

修改下集群名称便于记忆

rabbitmqctl set_cluster_name rabbitmq_cluster

八、配置镜像队列
在任意一个节点执行设置镜像队列策略

[root@zabbix_server src]# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}' 
Setting policy "ha-all" for pattern "^" to "{\"ha-mode\":\"all\"}" with priority "0" ...
[root@zabbix_server src]# 

九、验证镜像队列
在任意一个节点管控台新建一个队列,新建完毕后,立刻在其余2个节点都可以看到这个队列

利用java 编写一个生产者测试客户端向其中一个节点队列发送消息,其余2个节点都可以在管控台看到消息的同步

package com.hl95.rabbitmq.demo;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;


public class Producer {
    public static void main(String[]args) throws IOException,TimeoutException{
        ConnectionFactory factory=new ConnectionFactory();
        //配置连接属性
        factory.setHost("172.28.18.69");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("admin");
        factory.setPassword("xxxxxx");
        
        //得到连接
        Connection connection=factory.newConnection();
        //创建通道
        Channel channel=connection.createChannel();
        //声明(创建)队列
        String queueName="test001";
        channel.queueDeclare(queueName, true, false, false, null);
        //发送消息
        String message="你好, RabbitMQ";
        for(int i=0;i<200;i++){
            channel.basicPublish("",queueName, null, message.getBytes("UTF-8"));
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        channel.close();
        connection.close();
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
十、在172.28.18.104上安装haproxy
1、下载

cd /usr/local/src
wget https://github.com/haproxy/haproxy/archive/v1.5-dev20.tar.gz

2、安装

tar -zxvf v1.5-dev20.tar.gz
cd haproxy-1.5-dev20/
make TARGET=linux26 prefix=/usr/local/haproxy
make install prefix=/usr/local/haproxy

3、新建配置文件

mkdir /etc/haproxy
touch /etc/haproxy/haproxy.conf
vim   /etc/haproxy/haproxy.conf
global
   log 127.0.0.1 local2
   chroot /usr/local/haproxy
   pidfile /var/run/haproxy.pid ###haproxy的pid存放路径,启动进程的用户必须有权限访问此文件
   maxconn 65535 ###最大连接数,默认4000
   daemon

defaults
   mode tcp
   option tcplog
   log global
   timeout connect 20s
   timeout server 60s
   timeout client 60s
   retries 3

listen stats
   bind 0.0.0.0:8888 #监听端口
   mode http
   option httplog
   stats refresh 5s #统计页面自动刷新时间
   stats uri /rabbitmq-stats #统计页面url
   stats realm Haproxy Manager #统计页面密码框上提示文本
   stats auth admin:xxxxxx #统计页面用户名和密码设置
   stats hide-version #隐藏统计页面上HAProxy的版本信息

listen rabbitmq_cluster
   bind 172.28.18.104:5672     #监听端口
   mode tcp
   balance roundrobin
   server zabbix_server 172.28.18.75:5672 check inter 5000 rise 2 fall 2
   server node1         172.28.18.103:5672 check inter 5000 rise 2 fall 2
   server node2         172.28.18.69:5672 check inter 5000 rise 2 fall 2

退出保存,并重启haproxy

[root@localhost haproxy-1.5-dev20]# ps -ef|grep haproxy
root     23157     1  0 08:49 ?        00:00:00 haproxy -f /etc/haproxy/haproxy.conf
root     23446 20907  0 08:59 pts/2    00:00:00 grep haproxy
[root@localhost haproxy-1.5-dev20]# kill -9 23157
[root@localhost haproxy-1.5-dev20]# haproxy -f /etc/haproxy/haproxy.conf 

4、打开管控台
在这里插入图片描述
此时显示3个rabbitmq节点信息
十一、测试集群的负载均衡功能
利用下面java代码测试负载均衡代理

package com.hl95.rabbitmq.demo;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;


public class Producer {
    public static void main(String[]args) throws IOException,TimeoutException{
        ConnectionFactory factory=new ConnectionFactory();
        //配置连接属性
        factory.setHost("172.28.18.104");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("admin");
        factory.setPassword("xxxxxxxx");
        
        //得到连接
        Connection connection=factory.newConnection();
        //创建通道
        Channel channel=connection.createChannel();
        //声明(创建)队列
        String queueName="test001";
        channel.queueDeclare(queueName, true, false, false, null);
        //发送消息
        String message="你好, RabbitMQ";
        for(int i=0;i<200;i++){
            channel.basicPublish("",queueName, null, message.getBytes("UTF-8"));
            try {
                Thread.sleep(500);
                System.out.println("Consumer: "+message+"---"+i);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        channel.close();
        connection.close();
    }
}

此时我们将客户端连接改为172.28.18.104的前端haproxy负载均衡服务器的IP和端口,测试发送消息,后端集群节点都能同步到消息

首先执行第一次消息投递,同时观察104上haproxy管控台后端连接到哪个rabbitmq节点
在这里插入图片描述
上图可以看到第一次消息投递是被haproxy分配到了node1节点来接收。

继续第二次消息投递
在这里插入图片描述
上图可以看到第二次消息投递是被haproxy分配到了node1节点来接收。

继续第三次
在这里插入图片描述
第三次消息投递是被haproxy分配到了zabbix_server节点来接收。

继续第四次
在这里插入图片描述
第四次消息投递是被haproxy重启分配回了node1节点来接收。验证了负载均衡是轮询的策略。

总共进行了4次投递,每次200个消息,目前队列里有800条消息待消费,3个节点的管控台队列消息是一致的,完全复制的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
至此集群搭建和负载均衡策略配置成功。
十二、模拟节点故障处理
1、假设75节点的挂掉,那么首先利用forget_cluster_node参数,将此节点移除集群

停掉75上的rabbitmq应用

[root@zabbix_server src]# rabbitmqctl stop_app
Stopping node rabbit@zabbix_server ...

此时,rabbitmq管控台显示node信息中已经没有rabbit@zabbix_server了
在这里插入图片描述
在其他任意节点查看集群状态

[root@node3 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@node3 ...
[{nodes,[{disc,[rabbit@node2,rabbit@node3,rabbit@zabbix_server]}]},
 {running_nodes,[rabbit@node2,rabbit@node3]},
 {cluster_name,<<"rabbitmq_cluster">>},
 {partitions,[]},
 {alarms,[{rabbit@node2,[]},{rabbit@node3,[]}]}]

显示集群中还是3个节点,但是running_nodes中只有2个节点,执行

[root@node3 ~]# rabbitmqctl forget_cluster_node rabbit@zabbix_server
Removing node rabbit@zabbix_server from cluster ...
[root@node3 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@node3 ...
[{nodes,[{disc,[rabbit@node2,rabbit@node3]}]},
 {running_nodes,[rabbit@node2,rabbit@node3]},
 {cluster_name,<<"rabbitmq_cluster">>},
 {partitions,[]},
 {alarms,[{rabbit@node2,[]},{rabbit@node3,[]}]}]

移除节点后,再查看集群状态,此时已经没有故障节点的信息了,说明我们将故障节点移除集群。

接下来我们重启75上的rabbitmq,模拟新节点,怎么重新加入集群

启动时出现以下错误:

[root@zabbix_server src]# rabbitmq-server start


BOOT FAILED
===========

Error description:
   {error,{inconsistent_cluster,"Node rabbit@zabbix_server thinks it's clustered with node rabbit@node3, but rabbit@node3 disagrees"}}

Log files (may contain more information):
   /var/log/rabbitmq/rabbit@zabbix_server.log
   /var/log/rabbitmq/rabbit@zabbix_server-sasl.log

Stack trace:
   [{rabbit_mnesia,check_cluster_consistency,0,
                   [{file,"src/rabbit_mnesia.erl"},{line,598}]},
    {rabbit,'-boot/0-fun-0-',0,[{file,"src/rabbit.erl"},{line,275}]},
    {rabbit,start_it,1,[{file,"src/rabbit.erl"},{line,403}]},
    {init,start_it,1,[]},
    {init,start_em,1,[]}]

{"init terminating in do_boot",{error,{inconsistent_cluster,"Node rabbit@zabbix_server thinks it's clustered with node rabbit@node3, but rabbit@node3 disagrees"}}}
/usr/lib/rabbitmq/bin/rabbitmq-server: line 236: 23268 用户定义信号 2    start_rabbitmq_server "$@"

说明75上还保留集群信息,但实际上75已经被移除集群了,所以出现上述错误,解决方法删除/var/lib/rabbitmq/mnesia/目录,里面保存有节点的相关信息

[root@zabbix_server rabbitmq]# rm -rf /var/lib/rabbitmq/mnesia/
[root@zabbix_server rabbitmq]# rabbitmq-server -detached
Warning: PID file not written; -detached was passed.
[root@zabbix_server rabbitmq]# rabbitmqctl cluster_status
Cluster status of node rabbit@zabbix_server ...
[{nodes,[{disc,[rabbit@zabbix_server]}]},
 {running_nodes,[rabbit@zabbix_server]},
 {cluster_name,<<"rabbit@zabbix_server">>},
 {partitions,[]},
 {alarms,[{rabbit@zabbix_server,[]}]}]

删除后,再重新启动,查看集群状态,75已经是初始化状态,此时是单机模式。接下来加入集群操作:

[root@zabbix_server rabbitmq]# rabbitmqctl join_cluster rabbit@node2 --ram
Clustering node rabbit@zabbix_server with rabbit@node2 ...
[root@zabbix_server rabbitmq]# rabbitmqctl cluster_status
Cluster status of node rabbit@zabbix_server ...
[{nodes,[{disc,[rabbit@node2,rabbit@node3]},{ram,[rabbit@zabbix_server]}]},
 {alarms,[{rabbit@node2,[]},{rabbit@node3,[]}]}]

加入成功,查看集群状态,已经成功了,此时在另外两个节点任意一个管控台上观察节点信息
在这里插入图片描述
状态是未运行,在75上启动应用

[root@zabbix_server rabbitmq]# rabbitmqctl start_app
Starting node rabbit@zabbix_server ...

打开75上的管控台登录
在这里插入图片描述
此时,75节点正常运行,并且是内存模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

主主主主公

你的鼓励将大动力作的最是我创

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值