深入解析Oracle TNS协议:网络通信的关键

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

简介:Oracle TNS协议是用于Oracle数据库客户端与服务器间透明通信的协议,提供了一种无需关注底层网络细节的连接方式。通过TNS listener和TNSnames.ora文件,该协议实现服务名与网络地址映射,支持多传输协议和故障切换、负载均衡功能。对于数据库管理员和开发人员来说,理解TNS协议对于配置、优化数据库连接及故障处理至关重要。 ORACLE_TNS协议

1. Oracle TNS协议简介

Oracle透明网络子系统(Transparent Network Substrate,TNS)是Oracle数据库中用于客户端与服务器之间通信的协议。TNS协议是Oracle Net Services的一个核心组件,它提供了一种在不同网络协议上进行数据传输的抽象层。

1.1 TNS协议的重要性

TNS协议允许数据库管理员在不同的网络环境和操作系统之间迁移数据库,同时保持一致的通信接口。它通过隐藏底层网络细节,使得客户端与数据库服务器之间可以透明地进行交互。

1.2 TNS协议的功能

TNS协议具有多种功能,其中包括:端点寻址、负载均衡、故障切换、会话恢复等。通过这些功能,TNS协议能够保证数据库连接的高可用性和稳定性。

1.3 TNS协议的应用场景

在企业级数据库管理中,TNS协议的应用场景非常广泛,特别是涉及到分布式数据库架构和跨平台部署时,TNS协议能够确保数据的高速传输和处理。

下一章节将详细探讨TNS listener的作用和工作原理。

2. TNS listener的作用与工作原理

2.1 TNS listener的基本概念

2.1.1 listener的定义

TNS listener(监听器)是Oracle数据库系统中一个重要的网络服务组件,其全称为Transparent Network Substrate listener。它作为数据库服务器的守护进程,用于监听客户端对数据库的连接请求。当一个应用程序需要访问数据库时,TNS listener负责接受这些请求,并且根据预定义的配置信息,指导客户端与适当的数据库实例建立连接。从技术角度讲,监听器是一个监听网络端口并接受客户端连接请求的服务,它使用Oracle Net Services协议来实现这一过程。

2.1.2 listener的主要功能

TNS listener的主要功能包括:

  • 监听端口:监听器在指定端口上等待客户端连接请求。这个端口通常在 listener.ora 配置文件中定义。
  • 身份验证:验证请求连接的客户端身份,确保其具有连接数据库的权限。
  • 会话路由:将客户端连接请求路由到正确的数据库服务实例,这通常通过解析 tnsnames.ora 文件中的条目来实现。
  • 连接负载均衡:当多个数据库实例可用时,监听器可以在实例之间分配连接请求,实现负载均衡。
  • 连接故障转移:在检测到连接故障时,监听器可以将客户端请求重新路由到备用的数据库实例,实现故障转移。

2.2 TNS listener的工作流程

2.2.1 网络连接建立过程

TNS listener在建立网络连接的过程中,按照以下步骤执行:

  1. 监听端口 :监听器启动后,在配置的网络端口上等待客户端的连接请求。
  2. 接收请求 :当客户端请求连接时,监听器接收这个请求。
  3. 认证与授权 :监听器对客户端进行身份验证,并检查是否具备访问数据库的权限。
  4. 解析服务名称 :监听器根据客户端提供的服务名称(Service Name),在 tnsnames.ora 文件中查找对应的条目。
  5. 建立连接 :一旦找到匹配的服务,监听器将尝试与指定的数据库实例建立连接。
  6. 返回连接 :成功建立连接后,监听器将连接信息返回给客户端,客户端随后可以开始数据交互。

2.2.2 session的建立和终止

会话(Session)的建立和终止过程涉及以下步骤:

  1. 会话建立
  2. 客户端应用通过TNS listener提供的连接信息,向数据库发送一个连接请求。
  3. 数据库接受请求并建立一个新的会话。
  4. 一旦会话建立,客户端和数据库之间可以开始交互数据。

  5. 会话终止

  6. 当客户端结束数据交互并关闭连接时,会话被终止。
  7. 数据库释放与该会话相关的资源。
  8. 监听器更新其状态,以便为后续的连接请求准备。

2.3 TNS listener的配置和管理

2.3.1 listener.ora文件的配置方法

listener.ora 文件是Oracle监听器的核心配置文件,它定义了监听器的参数和行为。配置 listener.ora 通常包括以下内容:

  • 监听器名称 :定义监听器的名称。
  • 监听端口 :指定监听器应该监听的网络端口号。
  • 协议地址 :配置监听器接受请求的IP地址和协议。
  • 服务名称映射 :将客户端请求的服务名称映射到具体的数据库实例。

下面是一个简单的 listener.ora 配置文件示例:

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = my_host)(PORT = 1521))
    )
  )

在这个配置中,监听器将监听本机( my_host )的1521端口。

2.3.2 listener的启动、停止与监控

监听器的管理包括启动、停止和监控监听器的状态。以下是常用的Oracle Net Manager工具和命令行工具 lsnrctl 的使用方法:

  • 启动监听器 shell lsnrctl start 这个命令会启动 listener.ora 文件中定义的监听器。

  • 停止监听器 shell lsnrctl stop 使用这个命令可以停止监听器。

  • 监控监听器状态 shell lsnrctl status 运行此命令可以查看监听器的当前状态,包括正在监听的端口和服务等信息。

2.3.3 listener配置的实例和分析

当进行实际配置时,我们可能需要设置多协议支持,例如添加SSL支持来增强连接的安全性。这将涉及编辑 listener.ora 文件并添加如下配置:

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = my_host)(PORT = 1521))
      )
      (ADDRESS = (PROTOCOL = TCP)(HOST = my_host)(PORT = 1522)(SSL Listener = On))
    )
  )

在这个例子中,监听器配置为监听两个端口:1521用于普通连接,1522用于SSL加密连接。

2.3.4 listener启动故障分析与解决

在启动监听器时,可能会遇到各种问题。为了定位问题,我们需要检查监听器的日志文件。在Oracle中,监听器日志通常位于 <ORACLE_HOME>/network/log/listener.log 目录。以下是一些常见的故障排查步骤:

  • 检查日志文件 :查看日志文件中是否有错误信息,常见的错误可能包括端口冲突、配置文件错误等。
  • 验证端口占用 :使用命令如 netstat 来确认端口是否被其他进程占用。
  • 配置文件检查 :确保 listener.ora 配置文件没有语法错误,并且所有路径和端口都正确无误。
  • 权限问题 :确认运行监听器的用户具有足够的权限来监听指定的端口。

通过以上步骤,我们可以对监听器的启动故障进行有效地分析和解决。

3. TNSnames.ora文件配置详解

TNSnames.ora文件在Oracle数据库中充当客户端与服务端连接的桥梁角色。它是一个客户端配置文件,用于解析客户端发出的连接请求并建立与目标数据库的连接。本章节将详细介绍TNSnames.ora文件的结构、作用以及在实际操作中的应用实例。

3.1 TNSnames.ora文件的作用

3.1.1 解析客户端请求

TNSnames.ora文件的主要作用之一是解析客户端发起的数据库连接请求。它包含了一个或多个数据库服务的配置条目,每个条目包含了必要的连接信息,例如数据库的网络地址、端口号以及可能需要的认证信息。当客户端发起连接请求时,Oracle客户端软件会参考TNSnames.ora文件来获取连接参数,确保客户端能够正确地连接到指定的数据库实例。

3.1.2 配置数据库连接信息

TNSnames.ora文件不仅解析连接请求,还用于存储和管理数据库连接信息。管理员可以通过编辑TNSnames.ora文件来设置特定的参数,如连接超时时间、重试次数等,从而控制客户端的行为并优化连接过程。这些配置信息对确保数据库连接的稳定性和效率至关重要。

3.2 TNSnames.ora文件的结构和语法

3.2.1 文件的基本结构

TNSnames.ora文件是由一系列的键值对组成的,其中键(key)是数据库服务的名称,而值(value)则是与之相关联的参数。每个服务条目通常包括以下几个主要部分:

  • 服务名(SERVICE_NAME) :客户端用来标识数据库服务的名称。
  • 网络地址(ADDRESS) :数据库服务所监听的网络地址,通常包括IP地址和端口号。
  • 连接描述(CONNECT_DATA) :连接到数据库时需要的附加信息,如SID(System Identifier)或数据库实例名。

3.2.2 参数的配置规则

TNSnames.ora中的参数配置遵循一定的规则,确保配置的准确性和一致性。这些参数包括:

  • HOST :数据库服务所在的主机名或IP地址。
  • PORT :数据库监听的端口号。
  • SID :数据库实例的系统标识符。
  • DESCRIPTION :对连接进行描述,有时包括多个地址,以支持故障切换机制。
  • CONNECT_TIMEOUT :连接尝试的最大等待时间。
  • RETRY_COUNT :重试连接的次数。
# 示例TNSnames.ora配置条目
DB_SERVICE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = your_host)(PORT = 1521))
    (CONNECT_DATA =
      (SERVICE_NAME = your_service_name)
    )
  )

3.3 TNSnames.ora与客户端连接实例

3.3.1 客户端连接数据库的流程

客户端连接数据库的一般流程如下:

  1. 客户端启动数据库连接操作,输入数据库服务名。
  2. 客户端软件读取TNSnames.ora文件,查找对应的条目。
  3. 根据找到的条目中的信息,客户端软件开始尝试网络连接。
  4. 客户端与数据库服务端完成TCP/IP握手,建立连接。
  5. 客户端通过监听在数据库服务端的监听器(listener)完成身份验证。
  6. 成功认证后,客户端与数据库服务端之间开始交互数据。

3.3.2 连接失败的诊断与处理

在连接过程中可能会遇到各种问题,例如网络不可达、监听器未运行、配置错误等。遇到连接失败时,可以通过以下步骤进行诊断和处理:

  1. 检查网络连接 :确保客户端能够访问数据库服务器的网络地址和端口。
  2. 检查TNSnames.ora配置 :确认配置文件中服务条目的参数是否正确无误。
  3. 监听器状态确认 :利用 lsnrctl status 命令检查监听器是否在运行,并且配置的端口是否正确。
  4. 诊断工具 :使用Oracle提供的诊断工具(如 tnsping )来测试TNS连接的有效性。
  5. 查看日志文件 :参考数据库和客户端的监听器日志文件,查找可能的错误信息。
  6. 修复或重新配置 :根据日志和诊断工具的反馈,修正配置错误或重新配置TNSnames.ora文件中的相关参数。

通过以上章节的详细分析,我们不仅了解了TNSnames.ora文件在Oracle数据库连接中的重要性,还掌握了其具体的结构和配置方法,并通过实例演示了客户端如何通过TNSnames.ora与数据库建立连接以及在连接失败时的诊断和处理方法。这些知识对于Oracle数据库管理员和开发者而言是不可或缺的。

4. Oracle数据库网络协议支持

4.1 Oracle网络协议概述

4.1.1 Oracle支持的网络协议

Oracle数据库支持多种网络协议以保证客户端与服务端的通信。其中最为核心的协议为TCP/IP,因为其广泛部署和稳定的特性,它成为了Oracle数据库通信的事实标准。除了TCP/IP,Oracle还支持其他网络协议,包括Named Pipes(命名管道),Bequeath等。这些协议在特定的应用场景和操作系统中有其独特的优势,但普遍TCP/IP的使用更为广泛。

每种协议都有其特定的应用场景,而选择哪一种协议,往往取决于特定的业务需求、操作系统的类型、网络配置以及安全要求。例如,在内部网络中,如果为了提高性能可以考虑使用Named Pipes,但在跨网络或者互联网通信中,通常只有TCP/IP是可行的选择。

4.1.2 各协议间的比较与选择

在比较不同的Oracle网络协议时,最重要的考虑因素是稳定性和性能。TCP/IP协议通常在任何环境下都能提供稳定的连接,是跨网络环境的首选。相对而言,Named Pipes可能在高负载或长距离传输中表现不佳。

在选择使用何种协议时,管理员还需要考虑操作系统支持、安装的复杂性以及维护的难易程度。例如,在Windows平台上,Named Pipes可以通过其简单的安装和配置来快速部署,但可能在性能上不及TCP/IP。

总的来说,对于大多数数据库部署,TCP/IP都是一个安全、高效的选择。但在某些特殊情况下,如环境限制或其他协议的特定优势,其他协议可能会更适合。

4.2 Oracle网络协议栈和通信模型

4.2.1 协议栈的层次结构

Oracle网络协议栈是由多个层次组成的,每个层次都有其特定的功能。从下往上分别是物理层、数据链路层、网络层、传输层和应用层。Oracle通信模型中的协议栈的层次结构为:

  • 物理层 :包括电缆、网卡等硬件设备,是数据传输的基础。
  • 数据链路层 :负责建立、维护和释放数据链路,确保数据在链路上传输的正确性和有序性。
  • 网络层 :主要功能是实现数据包的寻址和路由选择,确保数据包可以正确地从源主机传输到目标主机。
  • 传输层 :主要为两个主机上的应用进程之间提供端到端的通信服务。Oracle中最常用的传输层协议是TCP。
  • 应用层 :是用户与Oracle数据库进行交互的层次,如通过SQL、PL/SQL等执行操作。

4.2.2 数据传输过程

Oracle通信模型中的数据传输过程,本质上是一个跨多层的数据封装和解封装过程。当客户端应用程序需要与数据库服务器通信时,数据会按照以下步骤传输:

  1. 封装过程 :数据首先在应用层生成,然后通过Oracle Net软件栈,按照层次从上到下进行封装,添加了各层的控制信息。
  2. 传输过程 :封装好的数据包在物理层通过硬件设备在网络上传输。
  3. 接收和解封装过程 :接收方的Oracle Net软件栈从下到上进行解封装,逐层去除相应的控制信息,最终将数据交由接收方的应用程序处理。

这个过程确保了数据在发送端和接收端之间正确无误地传输。

4.3 配置和优化Oracle网络协议

4.3.1 网络参数的配置

网络配置是Oracle数据库优化的一个关键方面,对性能和稳定性有重大影响。配置网络参数主要通过修改 sqlnet.ora tnsnames.ora 文件来实现。 sqlnet.ora 文件包含了控制客户端如何与Oracle数据库进行通信的设置,而 tnsnames.ora 则用于映射网络服务名到相应的数据库服务。

配置网络参数的典型例子包括调整 SQLNET.INBOUND CONNECT_TIMEOUT SQLNET.SEND_TIMEOUT 来控制连接的超时设置,或使用 DIAG_ADR_ENABLED 来启用诊断跟踪,以帮助调试网络问题。

示例代码片段:

# sqlnet.ora配置示例
SQLNET.INBOUND_CONNECT_TIMEOUT = 10
SQLNET.SEND_TIMEOUT = 5
DIAG_ADR_ENABLED = ON
DIAG_ADR_ADDRESS = (PROTOCOL=TCP)(HOST=your_host)(PORT=1521)

4.3.2 性能优化和故障排除

网络性能优化涉及到多个方面,包括但不限于合理配置监听器、调整网络缓冲区大小以及优化TCP/IP参数。监听器配置中,合理设置 QUEUESIZE KEEPALIVE_INTERVAL 参数可以提高性能并减少网络故障。

故障排除方面,通常建议开启诊断跟踪并监控日志文件,以便分析网络通信中的错误。此外,使用网络监控工具监测网络延迟和带宽使用情况,也是确保Oracle网络通信顺畅的重要手段。

# 开启诊断跟踪的示例
ALTER SYSTEM SET TRACE_ENABLED_SERVICE=your_service_name SCOPE=BOTH;

通过这些配置和优化方法,可以确保Oracle数据库通信既快速又稳定,同时也有助于快速定位和解决可能出现的网络问题。

5. 故障切换与负载均衡能力

5.1 故障切换机制

故障切换是Oracle数据库系统为了保持高可用性,在发生故障时自动将系统资源从故障节点转移到正常运行的节点的过程。这个机制对于保证关键业务的持续运作至关重要。

5.1.1 故障切换的触发条件

故障切换的触发条件通常包括硬件故障、软件错误、网络问题或数据库实例的意外停止等。在Oracle Real Application Clusters (RAC)环境中,当一个节点发生故障时,集群管理器会检测到故障并触发故障切换过程。故障检测机制通常包括心跳信号、检查点确认和故障检测器等多种技术。

5.1.2 故障切换的过程与影响

故障切换过程涉及资源的转移和状态的恢复。首先,集群管理器会将故障节点上的资源(如IP地址和数据库实例)转移到其他节点上。这通常包括数据库的重启以及应用连接的重新建立。故障切换可能会引起服务中断,因此对故障切换过程的优化至关重要。快速的故障切换可以减少服务中断的时间,保持业务的连续性。

graph LR
A[检测到故障] --> B[资源切换]
B --> C[数据库重启]
C --> D[应用连接重建]
D --> E[故障切换完成]

5.2 负载均衡机制

负载均衡指的是在多个服务器之间合理分配工作负载,以避免单一服务器过载,提高系统的整体性能和可用性。

5.2.1 负载均衡的实现方式

在Oracle环境中,负载均衡可以通过多种方式实现。一种常见的方式是通过Oracle RAC结合VIP(Virtual IP)来实现,VIP可以在多个实例之间动态转移。此外,中间件解决方案如Oracle WebLogic Server也可以提供负载均衡功能,通过路由算法将用户请求分发到不同的数据库实例。

5.2.2 负载均衡的效果评估

评估负载均衡效果通常包括监控数据库实例的CPU、内存和IO资源使用情况。通过监控工具如Enterprise Manager,可以获取实时的性能数据和历史性能趋势图,帮助数据库管理员判断负载均衡的配置是否合理。

5.3 故障切换与负载均衡的案例分析

在本节中,我们将通过实际部署中的应用实例来深入探讨故障切换与负载均衡的结合使用。

5.3.1 实际部署中的应用实例

在一个金融行业的实际案例中,使用Oracle RAC和WebLogic Server来实现高可用性和负载均衡。当发生故障时,WebLogic Server会自动将用户请求导向健康节点,而RAC则负责资源的自动切换。这样的配置使得系统可以在几秒内恢复服务,减少了对用户的影响。

5.3.2 优化策略和最佳实践

优化策略包括配置合适的故障检测间隔、优化实例启动和停止脚本以及配置合理的网络参数。最佳实践则强调了定期进行故障演练以保证切换机制的可靠性和有效性。通过模拟故障和进行负载测试,可以验证配置的正确性和系统的性能表现。

在优化过程中,我们可能会调整参数如 fal_client , fal_server , remote_login_passwordfile 等,这些参数对于故障切换和负载均衡起着关键作用。同时,对于RAC集群,还可能涉及到 CLUSTER_DATABASE_INTERCONNECTS BACKGROUND_DUMP_DEST 等参数的设置。

通过上述章节的分析,我们可以看到故障切换与负载均衡对于确保Oracle数据库高可用性的核心作用。在具体的实施过程中,细致的规划和周密的测试是保证系统稳定运行的关键。

6. Oracle TNS协议在日常运维中的重要性

6.1 TNS协议在系统维护中的作用

6.1.1 日常监控和维护任务

Oracle TNS协议不仅仅是一个简单的通信协议,它是确保数据库运维人员能够无缝地进行数据库访问与管理的基础。在日常监控和维护中,TNS协议的作用是多方面的:

  • 状态检查 :运维人员需要定期检查listener的状态,以确保它在监听预定的端口,并能够接收到来自客户端的连接请求。例如,可以通过 lsnrctl status 命令来检查listener的状态。

    ```bash $ lsnrctl status LSNRCTL for 64-bit Windows: Version 19.0.0.0.0 - Production on 26-JUN-2023 13:01:12

    Copyright (c) 1991, 2020, Oracle. All rights reserved.

    Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=hostname)(PORT=1521))) STATUS of the LISTENER


    ... ```

    执行以上命令后,运维人员能够获得关于listener详细的运行状态信息,包括端口、版本、进程、服务是否启动等。

  • 性能监控 :通过分析listener日志和使用Oracle提供的监控工具(如Oracle Enterprise Manager Cloud Control),运维人员可以对数据库的访问频率、连接时长和用户活动进行监控,从而评估系统的整体性能。

  • 故障诊断 :当数据库连接出现故障时,通过检查listener的日志文件和相应的系统日志文件,运维人员可以快速定位问题源头。例如,网络中断、监听端口冲突、配置错误都可能导致连接失败。

6.1.2 性能调优和故障诊断

性能调优是保证数据库高效运行的关键环节,而TNS协议在此扮演了重要的角色。TNS协议性能调优通常涉及以下几个方面:

  • 调整Oracle Net参数 :通过修改 sqlnet.ora 文件中的参数,比如 SQLNET.INBOUND.CONNECT_TIMEOUT ,可以优化客户端建立连接的时间。

  • 优化网络通信 :确保网络环境稳定,减少延迟和丢包,可以通过调整网络设备或路由策略来实现。

  • 合理配置session :session的设置对性能有直接影响,例如 SERVER=DEDICATED 参数可以指定客户端连接使用专用服务器进程,有助于减少上下文切换。

故障诊断是运维工作中的一部分,TNS协议的故障诊断往往涉及以下步骤:

  • 检查网络连接 :确认网络硬件工作正常,路由没有问题。

  • 审查配置文件 :查看 listener.ora tnsnames.ora 文件是否有误配置。

  • 使用诊断工具 :利用 trcsess tkprof 等Oracle自带的工具进行详细的诊断。

6.2 TNS协议安全性考虑

6.2.1 安全机制和风险预防

随着网络攻击事件的频发,数据库的安全性变得愈发重要。TNS协议在保证安全性方面有以下几个关键点:

  • 加密通信 :通过配置加密套件(如 加密协议 加密方法 )来确保数据传输过程中不被窃取。

  • 认证机制 :TNS协议支持多种认证方式,包括操作系统认证、密码文件认证等,通过强化认证机制来防止未授权访问。

  • 权限控制 :合理配置 tnsnames.ora 文件中的别名,严格控制用户的访问权限。

6.2.2 安全事件的应对措施

在安全事件发生时,应迅速采取以下措施:

  • 立刻更改密码 :如果怀疑有安全漏洞,首先应更改数据库管理员以及关键用户的密码。

  • 审查日志文件 :分析 listener.log 和其他相关日志文件,查找异常的登录尝试。

  • 限制访问 :暂时关闭可能受攻击的数据库服务,直到确定安全漏洞被修复。

  • 更新软件补丁 :及时应用Oracle发布的安全补丁,以修复已知的安全漏洞。

6.3 TNS协议的未来展望

6.3.1 新技术对TNS协议的影响

随着新技术的出现,如云计算、容器化、微服务架构等,TNS协议也在适应新的运维环境。例如,容器化环境中的数据库访问需要考虑容器IP地址的动态变化,传统TNS协议在这一场景中可能需要通过服务发现机制来适应。

6.3.2 TNS协议的发展趋势与挑战

未来TNS协议的发展趋势可能会包括以下几点:

  • 更灵活的网络通信 :支持更多的网络协议类型和通信模式,以适应复杂的网络环境。

  • 更加智能化的配置 :减少人工干预,通过智能算法自动优化网络配置。

  • 安全性增强 :随着加密技术的不断发展,TNS协议可能集成更加先进的加密算法和认证机制。

  • 性能优化 :针对大数据量、高并发等场景,优化协议性能,降低延迟。

当然,这些发展趋势也带来了新的挑战,例如需要更复杂的配置管理、对运维人员的技能要求更高,以及可能带来的性能开销等。随着技术的发展,Oracle TNS协议的优化和演进将是数据库网络通信领域内一个持续关注的热点。

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

简介:Oracle TNS协议是用于Oracle数据库客户端与服务器间透明通信的协议,提供了一种无需关注底层网络细节的连接方式。通过TNS listener和TNSnames.ora文件,该协议实现服务名与网络地址映射,支持多传输协议和故障切换、负载均衡功能。对于数据库管理员和开发人员来说,理解TNS协议对于配置、优化数据库连接及故障处理至关重要。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值