高可用Apollo配置中心的Docker Compose实践指南

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本文介绍了如何使用Docker Compose搭建一个高可用的Apollo配置中心,详细说明了Eureka服务发现、Spring Boot应用、Spring Cloud组件和Apollo服务组件的部署过程。文章包括了对Eureka集群、Configservice实例、Adminservice集群、MySQL数据库和Portal前端界面的配置,确保了服务注册与发现的高可用性以及配置服务的稳定性。同时提供了关于Docker Compose文件的兼容性、网络策略配置、数据持久化、备份策略和监控日志集成的实用建议。
使用docker-compose搭建高可用Apollo配置中心

1. Docker Compose的使用来搭建Apollo配置中心

随着微服务架构的兴起,配置中心成为了维护各个服务配置的高效解决方案。在本章中,我们将介绍如何使用Docker Compose来搭建Apollo配置中心,以实现服务配置的集中管理和动态更新。

1.1 为什么要使用Docker Compose搭建Apollo配置中心

Docker Compose作为容器编排工具,能够简化多容器应用的部署和管理流程。使用Docker Compose可以快速搭建起Apollo配置中心,这对于开发、测试环境的快速搭建尤其有用。此外,Docker Compose具备良好的跨平台特性,方便开发者在不同环境中重现开发环境。

1.2 Docker Compose搭建Apollo配置中心的基本步骤

首先,需要准备一个 docker-compose.yml 文件,该文件定义了服务需要的镜像、环境变量、网络配置等。接下来,你可以通过以下命令快速启动Apollo配置中心的服务:

docker-compose up -d

这将根据 docker-compose.yml 文件中定义的服务配置来启动相应容器。对于Apollo配置中心而言,通常需要启动Apollo-Adminservice和Apollo-Configservice两个服务。

1.3 配置和优化Docker Compose文件

在搭建过程中,根据实际需求调整Docker Compose文件是非常必要的。例如,你可以为Apollo配置中心的服务设置环境变量来配置数据库连接和Apollo的运行参数。此外,为了确保服务的稳定性和高可用,还可以在Docker Compose文件中配置持久化数据卷,以及服务的副本数来实现负载均衡和故障转移。

services:
  apollo-configservice:
    image: apolloconfig/apollo-configservice
    ports:
      - "8080:8080"
    volumes:
      - /path/to/volume/data:/opt/data
    environment:
      - SPRING_PROFILES_ACTIVE=dev
      - DATABASE_URL=jdbc:mysql://host:port/dbname?characterEncoding=utf8&serverTimezone=UTC
    depends_on:
      - apollo-database
  apollo-adminservice:
    image: apolloconfig/apollo-adminservice
    ports:
      - "8090:8090"
    volumes:
      - /path/to/volume/data:/opt/data
    environment:
      - SPRING_PROFILES_ACTIVE=dev
      - DATABASE_URL=jdbc:mysql://host:port/dbname?characterEncoding=utf8&serverTimezone=UTC
    depends_on:
      - apollo-database

以上是一个基础的 docker-compose.yml 文件结构示例,用于启动Apollo配置中心的服务。通过不断优化这个文件,可以满足更多特定场景的需求。

通过本章内容,你将掌握如何使用Docker Compose快速搭建Apollo配置中心,并进行基本的配置与优化。这为后续章节中对Eureka、MySQL和前端Portal的深入讨论打下了坚实的基础。

2. Eureka服务发现机制的配置与高可用性保证

2.1 Eureka服务发现机制的原理与作用

2.1.1 Eureka的工作原理简述

Eureka是Netflix开发的服务发现框架,它主要用来实现服务的注册与发现。Eureka客户端向Eureka服务器注册自己的信息,比如服务地址、端口等,同时Eureka服务器维护一个服务列表,供客户端查询使用。当服务启动时,会向Eureka注册自己的信息,并且定期发送心跳以保持在线状态。当服务消费者需要调用服务时,可以通过Eureka服务端查询到服务提供者的地址,并进行远程调用。

2.1.2 Eureka与其他服务发现机制的比较

Eureka并不是唯一的服务发现机制,与之相比较的还有Consul、Zookeeper等。Consul侧重于提供完整的解决方案,包括服务发现、健康检查、键值存储等。Zookeeper则源于Yahoo,通常用于分布式系统的协调和元数据管理。Eureka设计简洁,易于集成,特别适合微服务架构,但它不提供元数据管理等额外功能。对比之下,Eureka更适合快速搭建轻量级的服务发现平台。

2.2 Eureka服务的高可用性配置

2.2.1 Eureka Server集群模式的搭建步骤

要搭建Eureka Server集群,首先需要准备多个Eureka Server实例,它们之间需要相互通信和同步数据。以下是搭建集群的步骤:

  1. 创建Eureka Server项目,添加必要的依赖项。
  2. 配置 application.properties application.yml 文件,设置实例名称和服务端口。
  3. 启用Eureka Server的集群模式,通过设置 eureka.client.service-url.defaultZone 指向其他Eureka Server实例的地址。
  4. 启动多个Eureka Server实例,并确保它们能够相互通信。
# application.yml
eureka:
  instance:
    hostname: eureka1 # 对于集群中的每个Eureka Server,此项应不同
  client:
    serviceUrl:
      defaultZone: http://eureka2:8762/eureka/,http://eureka3:8763/eureka/
2.2.2 Eureka Client与服务发现的集成

Eureka Client需要注册到Eureka Server集群,以下是集成步骤:

  1. 在服务消费者和服务提供者中添加Eureka Client依赖。
  2. 配置 application.properties application.yml 文件,声明应用的名称和端口,并指向Eureka Server集群的地址。
  3. 启动应用程序,并在Eureka Server中查看服务是否已经注册成功。
# application.yml
eureka:
  client:
    serviceUrl:
      defaultZone: http://eureka1:8761/eureka/,http://eureka2:8762/eureka/,http://eureka3:8763/eureka/

2.3 Eureka与Apollo配置中心的整合实践

2.3.1 配置中心服务发现的配置方法

要将Apollo配置中心集成到Eureka服务发现中,需要在Apollo Config Service的配置文件中添加Eureka Server的地址。这样,Apollo Config Service就能够将自己注册到Eureka Server中,之后其他客户端就可以通过Eureka发现Apollo Config Service了。

# apollo-configservice的application.yml
eureka:
  client:
    serviceUrl:
      defaultZone: http://eureka1:8761/eureka/,http://eureka2:8762/eureka/,http://eureka3:8763/eureka/
2.3.2 高可用性架构下的服务注册与发现机制

在高可用性架构中,服务注册与发现机制需要保证即使个别服务或服务注册中心出现故障,整个系统的通信仍然能够正常进行。在Eureka中,当一个Eureka Server实例无法使用时,客户端会自动查询集群中的其他实例。Apollo配置中心与Eureka结合后,Apollo的服务实例也会在Eureka中进行注册,这样即使某个Apollo实例不可用,Eureka能够将请求转发到可用的实例上,确保配置信息的实时更新和服务的连续性。

      +-------------------+
      |   Eureka Server   |
      |   (Instance 1)    |
      +---------+---------+
                |
                |
+---------------v---------------+     +------------------------+
|                               |     |                          |
|   Eureka Server (Instance 2)  | ... |   Eureka Server (n)     |
|                               |     |                          |
+-------------------------------+     +--------------------------+
                |
                |
+---------------v---------------+
|                               |
|    Client (Apollo, etc.)      |
|                               |
+-------------------------------+

通过上述整合实践,Eureka和Apollo配置中心共同组成了一个可扩展且健壮的服务发现与配置管理平台。

3. Apollo配置中心核心组件Configservice和Adminservice的实例化与集群设置

3.1 Apollo配置中心核心组件介绍

3.1.1 Configservice的作用与功能

Configservice是Apollo配置中心中的核心服务组件之一,其主要作用是处理配置信息的读取请求。当客户端或服务需要获取配置时,Configservice扮演了配置仓库的角色,提供统一的接口来响应这些请求,并从相应的数据库中检索配置数据。

Configservice功能细分为:

  • 配置读取 :客户端和服务通过HTTP API请求配置时,Configservice会查询其配置数据库并返回最新或特定版本的配置数据。
  • 配置分发 :在配置更新后,Configservice可以通知所有的配置客户端配置有变更,并提供新的配置数据。
  • 版本控制 :每个配置项和配置文件都有版本的概念,Configservice能够根据客户端的版本请求提供相应版本的配置,或最新的配置。

3.1.2 Adminservice的作用与功能

Adminservice是另一个核心组件,它主要负责配置的发布和管理。管理员通过Adminservice发布配置,而Configservice随后提供这些配置信息。除了基本的发布功能外,Adminservice还提供了强大的权限管理和审计日志功能。

Adminservice功能细分为:

  • 配置发布 :管理员通过Adminservice的Web界面或API发布配置信息,包括修改、添加和删除配置项。
  • 权限管理 :可以设置不同的权限,限制哪些用户或用户组可以查看或修改配置。
  • 监控和日志 :Adminservice还提供配置变更的监控功能和操作日志,确保配置操作的可追溯性。

3.2 配置组件的集群搭建与配置

3.2.1 基于Docker Compose的集群搭建流程

集群搭建的目标是保证高可用性和负载均衡。使用Docker Compose可以在多个容器上轻松部署和管理Apollo的Configservice和Adminservice组件。下面是基于Docker Compose的集群搭建步骤:

  1. 准备Docker Compose文件 :首先创建一个 docker-compose.yml 文件,并在其中定义Configservice和Adminservice的服务。
  2. 配置文件设置 :为每个服务设置必要的环境变量,如数据库连接信息、端口映射等。
  3. 构建与部署 :在Docker Compose文件所在的目录下运行 docker-compose up 命令来启动服务。
version: '2'
services:
  apollo-configservice:
    image: apolloconfig/apollo-configservice
    ports:
      - "8080:8080"
    links:
      - apollo-configdb
    environment:
      - SPRING_DATASOURCE_URL=jdbc:mysql://apollo-configdb:3306/ApolloConfigDB?characterEncoding=utf8
      # 其他环境变量配置...

  apollo-adminservice:
    image: apolloconfig/apollo-adminservice
    ports:
      - "8090:8090"
    links:
      - apollo-configdb
    environment:
      - SPRING_DATASOURCE_URL=jdbc:mysql://apollo-configdb:3306/ApolloConfigDB?characterEncoding=utf8
      # 其他环境变量配置...

  apollo-configdb:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=example
      - MYSQL_USER=apollo
      - MYSQL_PASSWORD=apollo
    volumes:
      - ./data:/var/lib/mysql
    command: --default-authentication-plugin=mysql_native_password

3.2.2 集群环境下的组件配置要点

在集群环境下,配置组件时需要注意以下要点:

  • 数据库连接 :确保所有组件指向同一个数据库实例或通过某种方式来实现数据的同步。
  • 服务发现 :通过服务发现机制(如Eureka),各个组件实例能够相互注册和发现。
  • 负载均衡 :在服务前设置负载均衡器,如Nginx或HAProxy,以实现流量的均匀分配。
  • 监控和告警 :设置监控系统监控组件健康状态,并配置相应的告警机制。

3.3 集群模式下的性能优化与监控

3.3.1 性能调优策略

在集群模式下,性能调优策略主要包括以下几个方面:

  • 数据库查询优化 :确保数据库查询优化,避免慢查询对性能的影响。
  • HTTP连接池配置 :合理配置HTTP连接池的参数,如最大连接数、最大空闲连接数等,以减少连接开销。
  • 静态资源缓存 :对静态资源(如JS、CSS文件)设置合理的缓存策略,降低服务端的压力。
  • 内存管理 :合理分配内存资源给各个组件,避免内存泄漏和频繁的垃圾回收操作。
graph LR
A[开始性能优化] --> B[数据库查询优化]
B --> C[HTTP连接池配置]
C --> D[静态资源缓存]
D --> E[内存管理]
E --> F[结束性能优化]

3.3.2 集群监控的集成与实践

集群监控是确保系统稳定性和性能的关键。集成监控通常包含以下几个步骤:

  1. 选择合适的监控工具 :常用的监控工具有Prometheus、Grafana、Zabbix等。
  2. 收集监控数据 :确保监控工具能够收集到各组件的运行指标,如CPU、内存、响应时间等。
  3. 设置监控告警规则 :根据业务需求和历史数据,设置合理的告警阈值。
  4. 可视化展示 :通过可视化工具展示监控数据和告警信息,方便快速定位问题。
graph LR
A[开始监控集成] --> B[选择监控工具]
B --> C[收集监控数据]
C --> D[设置告警规则]
D --> E[可视化监控信息]
E --> F[结束监控集成]

集群模式下的性能优化和监控是确保Apollo配置中心稳定运行的关键。通过合理配置和持续监控,可以大大提高Apollo配置中心的可靠性与效率。

4. MySQL数据库配置及持久化解决方案

4.1 MySQL在Apollo中的角色和配置

4.1.1 数据库的部署与连接配置

数据库是任何现代应用程序的关键组件,它保存和管理应用的数据。在配置中心Apollo的部署中,MySQL扮演着数据持久化的角色,存储所有的配置信息。为了保证数据的安全性和完整性,我们需要对数据库进行仔细的配置。

部署MySQL通常有两种方法:物理机安装和容器化部署。在本章节中,我们将聚焦于容器化部署,因为它提供了一种轻量级、可移植的方式来运行数据库服务。

首先,我们需要使用Docker来部署MySQL实例。以下是一个简单的Docker命令示例,用于启动一个MySQL容器:

docker run -d --name apollo-db -e MYSQL_ROOT_PASSWORD=my-secret-pw -p 3306:3306 mysql:5.7

这里的命令行参数解释如下:
- -d :后台运行容器。
- --name :为容器指定一个名称。
- -e :设置环境变量,在这里是MySQL的root密码。
- -p :将容器的端口映射到宿主机的端口,这里是MySQL默认的3306端口。
- mysql:5.7 :指定要运行的镜像和标签。

接下来,我们需要配置Apollo服务以连接到刚创建的MySQL实例。这通常通过修改Apollo服务的配置文件来完成。例如,在Apollo配置中心服务的 application.yml 文件中,添加以下数据库连接配置:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8
    username: root
    password: my-secret-pw
    driver-class-name: com.mysql.cj.jdbc.Driver

在这里,我们需要确保:
- url 指向正确的数据库实例。
- username password 与数据库创建时所用的凭据一致。
- driver-class-name 是针对所使用的MySQL版本和JDBC驱动程序正确的类名。

4.1.2 数据库连接池的配置与优化

数据库连接池是一种管理数据库连接的技术,旨在复用已建立的数据库连接并减少创建新连接所花费的时间和资源。它通常可以显著提高数据库操作的性能。

在Spring Boot应用程序中,内置的HikariCP连接池是默认使用的连接池,因其性能优越而被广泛采纳。Apollo配置中心服务默认也是使用HikariCP作为连接池实现。

对于数据库连接池的配置,我们可以在 application.yml 文件中对连接池相关的参数进行调整:

spring:
  datasource:
    hikari:
      maximum-pool-size: 20
      minimum-idle: 5
      connection-timeout: 30000
      idle-timeout: 600000
      max-lifetime: 1800000
      pool-name: HikariCP

这里是一些关键参数的说明:
- maximum-pool-size :连接池中允许的最大连接数。
- minimum-idle :连接池维持的最小空闲连接数。
- connection-timeout :连接被请求时的超时时间。
- idle-timeout :一个连接在池中保持空闲状态的最大时间。
- max-lifetime :连接在池中可以存活的最大时间。
- pool-name :连接池的名称,有助于日志记录和监控。

在调整这些参数时,需要注意合理配置这些参数以达到最优的性能表现。例如,若 maximum-pool-size 设置过大,可能会导致数据库资源的过度消耗,而设置过小,则可能会限制应用的并发性能。

为了确保连接池的性能,应进行相应的压力测试,并根据实际的业务负载调整连接池参数。通过监控和调整,我们可以确保数据库连接的使用效率达到最优。

4.2 持久化机制的实现与故障恢复

4.2.1 数据持久化的配置与策略

为了确保配置数据不会因服务中断而丢失,Apollo配置中心采用了数据持久化机制。数据持久化是将数据保存到非易失性存储中,例如硬盘驱动器或固态驱动器,从而在系统崩溃或断电后仍能保持数据的完整性。

配置数据通常通过定期的定时任务保存到MySQL数据库中,Apollo也支持手动触发数据的持久化。在Apollo的配置中,可以通过调整配置项来控制数据的持久化行为。

例如,在 application.yml 文件中,可以找到与持久化相关的设置:

apollo:
  profile:
    loadFile: false
    refreshInterval: 3000
  • loadFile :是否从文件加载配置,默认为false,意味着从数据库加载配置。
  • refreshInterval :配置的刷新周期,单位为毫秒。

配置的保存频率和策略对于系统的响应时间和一致性有直接影响。较短的刷新周期意味着配置更新能够更快地被应用,但同时也可能导致数据库的负载增加。因此,在配置保存策略时,需要根据业务需求进行权衡。

4.2.2 数据库故障转移与恢复操作

数据库故障转移通常涉及将数据库服务从主节点转移到备用节点。这通常由高可用性(High Availability,简称HA)解决方案来支持。对于MySQL来说,这可能意味着使用诸如MHA、Orchestrator或者MySQL Group Replication等解决方案来实现。

在Apollo配置中心中,故障转移可以通过以下步骤完成:

  1. 检测到主节点故障 :使用监控工具检测到主MySQL实例的故障。
  2. 故障诊断 :确定故障节点是否可以恢复,如果可以,则尝试恢复;如果不可恢复,则切换到备用节点。
  3. 切换过程 :更新Apollo的数据库连接配置,指向新的主节点。
  4. 数据同步 :确保新的主节点与旧的主节点的数据同步,如果使用了MySQL的复制功能,这将由复制机制来完成。
  5. 故障节点修复 :将故障节点恢复后,调整为新的主节点的从节点,或保留在集群中作为读节点。

数据库的故障恢复操作对于保证业务连续性至关重要。在故障发生后,我们需要按照既定的恢复流程来操作,以减少对业务的影响。

4.3 容器化环境下MySQL的高可用实践

4.3.1 高可用MySQL集群的搭建

在容器化环境中实现MySQL高可用集群可以通过多种方式,常见的如使用官方的MySQL镜像提供的Galera Cluster,或使用像Percona XtraDB Cluster、MariaDB Galera Cluster等集群解决方案。

这里以Percona XtraDB Cluster为例,介绍如何搭建一个容器化的高可用MySQL集群:

  1. 使用Docker Compose定义集群服务 :通过编写 docker-compose.yml 文件来定义集群中的每个节点服务。
  2. 配置集群环境 :设置环境变量来定义集群节点间通信的网络设置以及集群内的节点身份信息。
  3. 启动集群 :使用 docker-compose up 命令来启动集群中的所有服务节点。
  4. 验证集群状态 :检查集群的健康状态,确保所有节点都正常运行并且能够相互通信。

这只是一个高层次的概述,实际操作需要根据所选集群解决方案的具体指导来完成。

4.3.2 数据库容器的动态伸缩与自动故障恢复

数据库容器的动态伸缩允许根据业务负载的变化动态地调整数据库服务的规模。在容器化环境中,通过调整容器数量和服务副本来实现水平扩展。

对于自动故障恢复,容器编排工具(如Docker Swarm或Kubernetes)提供了自动重启故障容器、重新调度容器到健康节点上的能力。在Kubernetes中,可以通过声明式的Pod重启策略来实现自动恢复,如下所示:

apiVersion: v1
kind: Pod
metadata:
  name: example-mysql-pod
spec:
  containers:
  - name: mysql
    image: mysql:5.7
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: my-secret-pw
  restartPolicy: Always # 永久重启策略

在这个配置中, restartPolicy 字段确保了如果容器发生故障,Kubernetes将尝试重启容器。 Always 策略指的是无论容器因何种原因退出,都会重启容器。

动态伸缩和自动故障恢复机制使得在容器化环境下,数据库服务能够更加灵活和弹性地应对变化和故障,提高了整个系统的可用性与可靠性。

5. Apollo前端界面Portal的高可用性实现

5.1 Portal界面的功能与重要性

5.1.1 用户界面的交互设计原则

在设计用户界面(UI)时,始终遵循简洁、直观和响应式的原则至关重要。在Apollo Portal的上下文中,UI设计不仅应该让用户能够轻松地管理配置,还应该允许用户无摩擦地与后端系统进行交互。良好的用户体验(UX)可以显著提高工作效率,并减少因误操作导致的配置错误。

5.1.2 界面功能对配置中心的影响

Portal作为Apollo配置中心与用户交互的前端界面,其功能的丰富性直接影响着配置中心的易用性和稳定性。一个强大的Portal可以提供配置浏览、编辑、发布、回滚、权限管理等多种功能,从而确保用户可以全方位地控制配置的生命周期。

5.2 高可用Portal的构建策略

5.2.1 负载均衡在Portal中的应用

为了确保高可用性,可以在Portal后端部署多个实例,并通过负载均衡器来分配流量。负载均衡器可以是硬件设备也可以是软件解决方案,如Nginx或HAProxy。它的作用是将客户端的请求均匀地分发到各个运行中的Portal实例,从而避免单点故障。

下面是一个Nginx作为负载均衡器配置的示例代码:

http {
    upstream apolloPortal {
        server portal1.example.com;
        server portal2.example.com;
        server portal3.example.com;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://apolloPortal;
        }
    }
}

5.2.2 持续集成/持续部署(CI/CD)的流程与实践

为了保证Portal界面的持续更新而不影响用户的使用,需要实施CI/CD流程。这个流程包括自动化测试、构建、部署等步骤。通过自动化的流程,可以在代码变更后快速地将更新推送到生产环境中,同时保证系统的稳定性和可靠性。

以下是CI/CD流程简化的代码示例:

stages:
  - name: test
    tasks:
      - name: run tests
        run: mvn test

  - name: build
    tasks:
      - name: package application
        run: mvn package

  - name: deploy
    if: branch = 'master'
    tasks:
      - name: deploy to production
        run: mvn deploy

5.3 Portal的监控与日志集成

5.3.1 监控系统的集成与配置

监控系统对于保障Portal界面的稳定运行至关重要。集成监控工具如Prometheus和Grafana可以帮助我们实时监控应用的性能指标。监控指标包括但不限于响应时间、请求吞吐量、错误率等,这些指标可以帮助我们快速定位问题。

5.3.2 日志管理与审计功能的实现

为了追踪用户操作和诊断问题,集成一个强大的日志管理与审计系统是必要的。ELK(Elasticsearch, Logstash, Kibana)堆栈是业界常见的解决方案,它可以收集、存储、分析和可视化日志数据。这样,运维人员可以及时查看关键日志,审计用户操作,同时保证了系统的透明性和合规性。

在ELK堆栈中,Logstash用于收集日志,Elasticsearch作为后端存储,而Kibana用于数据的可视化。下面是一个Logstash配置文件的示例:

input {
    file {
        path => "/var/log/apollo/portal.log"
        type => "apollo"
    }
}

filter {
    grok {
        match => { "message" => "%{COMBINEDAPACHELOG}" }
    }
    date {
        match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
    }
}

output {
    elasticsearch { hosts => ["localhost:9200"] }
}

以上章节详细介绍了Apollo前端界面Portal的高可用性实现策略,包括UI设计原则、负载均衡的实践应用、CI/CD流程的简化操作,以及监控系统和日志管理的集成方法。这些策略确保了Portal在面对高访问量时的稳定性和可靠性,同时提供了对操作的有效追踪和问题的快速解决能力。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本文介绍了如何使用Docker Compose搭建一个高可用的Apollo配置中心,详细说明了Eureka服务发现、Spring Boot应用、Spring Cloud组件和Apollo服务组件的部署过程。文章包括了对Eureka集群、Configservice实例、Adminservice集群、MySQL数据库和Portal前端界面的配置,确保了服务注册与发现的高可用性以及配置服务的稳定性。同时提供了关于Docker Compose文件的兼容性、网络策略配置、数据持久化、备份策略和监控日志集成的实用建议。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值