Spring Cloud 新一代网关:Spring Cloud GateWay

STM32串口DMA双缓冲机制实战:提升数据传输效率的终极方案 本文深入解析了STM32串口DMA双缓冲机制的核心原理与实战配置。通过对比传统中断方式,阐述了双缓冲如何实现数据接收与处理的“无缝接力”,从而在工业传感器数据采集等高负载场景下,将CPU占用率降至极低水平并彻底避免数据丢失。文章提供了基于标准外设库的详细配置步骤、中断处理逻辑及性能实测数据,是提升嵌入式系统串口通信效率和可靠性的终极方案。 阅读详情

简介

为什么用网关?

Spring Cloud GateWay的核心执行逻辑

示例编写

父pom

依赖项目gateway的pom

application.yml

启动项

启动日志


简介

简单点说:Spring Cloud GateWay就像医院里分诊台,将你引导到各个科室

Spring Cloud GateWay提供了一套简单有效的API路由管理方式,是基于Filter(过滤器)的方式提供网关的基本功能

作用:

  • 安全验证
  • 监控
  • 限流
  • 熔断
  • 重试等

Netflix Zuul 由于Netflix公司迟迟不更新2.0,开发者已经对它失去信心了,反正我是失去了,Spring Cloud GateWay会一步一步的取代Zuul

为什么用网关?

服务网关 = 路由转发 + 过滤器

1、路由转发:接收一切外界请求,转发到后端的微服务上去;

2、过滤器:在服务网关中可以完成一系列的横切功能,例如权限校验、限流以及监控等,这些都可以通过过滤器完成(其实路由转发也是通过过滤器实现的);

假设你开发一个电商服务,有会员,支付,商品等等服务

  • 你会对每个服务都进行鉴权、限流、权限校验等逻辑?
  • 每次上线一个服务都要申请域名,配置Nginx等等?
  • 每个服务可能用不同的开发语言编写,那么可能会采用不同的协议,例如Dubbo,HTTP等,你也要适配这些协议?
  • 商品服务业务量越来越大,需要拆分,那么需要客户端配合改造,这也是非常蛋疼的事情

这个时候网管服务就起作用了,类似Nginx的作用,将所有用户的请求转发给后端的服务器,但网关做的不仅仅只是简单的转发,也会针对流量做一些扩展,比如鉴权、限流、权限、熔断、协议转换、错误码统一、缓存、日志、监控、告警等,这样将通用的逻辑抽出来,由网关统一去做,业务方也能够更专注于业务逻辑,提升迭代的效率。

image

Spring Cloud GateWay的核心执行逻辑

核心逻辑 = 断言(Predicate:断言是否为true才允许转发) + 路由转发(Route) + 执行过滤链(Filter )

代码

官网提供执行图:

流程图

执行流程:

  • ① Gateway 接收客户端请求。

  • ② 请求与 Predicate 进行匹配,获得到对应的 Route。匹配成功后,才能继续往下执行。

  • ③ 请求经过 Filter 过滤器链,执行前置(prev)处理逻辑。

    例如说,修改请求头信息等。

  • ④ 请求被 Proxy Filter 转发至目标 URI,并最终获得响应。

    一般来说,目标 URI 是被代理的微服务,如果是在 Spring Cloud 架构中。

  • ⑤ 响应经过 Filter 过滤器链,执行后置(post)处理逻辑。

  • ⑥ Gateway 返回响应给客户端。

其实,就类似就像SpringMVC 的 DispatcherServlet差不多,只是说 SpringMVC 最终转发到 JVM 进程内的指定方法,而 Gateway 最终转发到远程的目标 URI 

下面是一张更清楚的流程图:

示例编写

父pom

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.cloud.work</groupId>
	<artifactId>work-cloud</artifactId>
	<version>1.0.0-SNAPSHOT</version>
	<packaging>pom</packaging>
	
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<maven.compiler.source>1.8</maven.compiler.source>
		<maven.compiler.target>1.8</maven.compiler.target>
		<java.version>1.8</java.version>
		<spring-cloud-alibaba.version>2.2.0.RELEASE</spring-cloud-alibaba.version>
		<spring-cloud.version>Hoxton.SR5</spring-cloud.version>
		<spring-boot.version>2.3.0.RELEASE</spring-boot.version>
	</properties>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>com.alibaba.cloud</groupId>
				<artifactId>spring-cloud-alibaba-dependencies</artifactId>
				<version>${spring-cloud-alibaba.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring-cloud.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
			<dependency>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-dependencies</artifactId>
				<version>${spring-boot.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<dependencies>
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

	<repositories>
		<repository>
			<id>spring-milestones</id>
			<name>Spring Milestones</name>
			<url>https://repo.spring.io/milestone</url>
		</repository>
	</repositories>

	<modules>
		<module>cloud-gateway</module>
	</modules>
</project>

依赖项目gateway的pom

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.cloud.work</groupId>
		<artifactId>work-cloud</artifactId>
		<version>1.0.0-SNAPSHOT</version>
	</parent>
	<artifactId>cloud-gateway</artifactId>
	
	<dependencies>
        <!-- 引入 Spring Cloud Gateway 相关依赖,使用它作为网关,并实现对其的自动配置 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
    </dependencies>
</project>

application.yml

server:
  port: 8081

spring:
  cloud:
    # Spring Cloud Gateway 配置项,对应 GatewayProperties 类
    gateway:
      # 路由配置项,对应 RouteDefinition 数组
      routes:
        - id: yudaoyuanma # 路由的编号
          uri: https://www.baidu.com # 路由到的目标地址
          predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
            - Path=/blog
          filters:
            - StripPrefix=1
        - id: oschina # 路由的编号
          uri: https://www.oschina.net # 路由的目标地址
          predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
            - Path=/oschina
          filters: # 过滤器,对请求进行拦截,实现自定义的功能,对应 FilterDefinition 数组
            - StripPrefix=1

启动项

package com.cloud.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class GatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

启动日志


  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.3.0.RELEASE)

2020-11-29 13:12:34.666  INFO 19664 --- [           main] com.cloud.gateway.GatewayApplication     : No active profile set, falling back to default profiles: default
2020-11-29 13:12:35.535  INFO 19664 --- [           main] o.s.cloud.context.scope.GenericScope     : BeanFactory id=83925bed-0b21-326e-a5b0-784d1d4030ed
2020-11-29 13:12:35.639  INFO 19664 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerBeanPostProcessorAutoConfiguration' of type [org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerBeanPostProcessorAutoConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-11-29 13:12:35.640  INFO 19664 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerBeanPostProcessorAutoConfiguration$ReactiveLoadBalancerConfig' of type [org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerBeanPostProcessorAutoConfiguration$ReactiveLoadBalancerConfig] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-11-29 13:12:35.644  INFO 19664 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'deferringLoadBalancerExchangeFilterFunction' of type [org.springframework.cloud.client.loadbalancer.reactive.DeferringLoadBalancerExchangeFilterFunction] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-11-29 13:12:35.851  WARN 19664 --- [           main] o.s.c.n.a.ArchaiusAutoConfiguration      : No spring.application.name found, defaulting to 'application'
2020-11-29 13:12:35.857  WARN 19664 --- [           main] c.n.c.sources.URLConfigurationSource     : No URLs will be polled as dynamic configuration sources.
2020-11-29 13:12:35.857  INFO 19664 --- [           main] c.n.c.sources.URLConfigurationSource     : To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
2020-11-29 13:12:35.863  WARN 19664 --- [           main] c.n.c.sources.URLConfigurationSource     : No URLs will be polled as dynamic configuration sources.
2020-11-29 13:12:35.863  INFO 19664 --- [           main] c.n.c.sources.URLConfigurationSource     : To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
2020-11-29 13:12:43.204  INFO 19664 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [After]
2020-11-29 13:12:43.204  INFO 19664 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Before]
2020-11-29 13:12:43.204  INFO 19664 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Between]
2020-11-29 13:12:43.205  INFO 19664 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Cookie]
2020-11-29 13:12:43.205  INFO 19664 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Header]
2020-11-29 13:12:43.205  INFO 19664 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Host]
2020-11-29 13:12:43.205  INFO 19664 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Method]
2020-11-29 13:12:43.205  INFO 19664 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Path]
2020-11-29 13:12:43.205  INFO 19664 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Query]
2020-11-29 13:12:43.205  INFO 19664 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [ReadBodyPredicateFactory]
2020-11-29 13:12:43.205  INFO 19664 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [RemoteAddr]
2020-11-29 13:12:43.205  INFO 19664 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Weight]
2020-11-29 13:12:43.205  INFO 19664 --- [           main] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [CloudFoundryRouteService]
2020-11-29 13:12:43.562  INFO 19664 --- [           main] o.s.s.c.ThreadPoolTaskScheduler          : Initializing ExecutorService 'Nacso-Watch-Task-Scheduler'
2020-11-29 13:12:48.231  INFO 19664 --- [           main] o.s.b.web.embedded.netty.NettyWebServer  : Netty started on port(s): 8888
2020-11-29 13:12:51.969  WARN 19664 --- [           main] c.a.c.n.registry.NacosServiceRegistry    : No service to register for nacos client...
2020-11-29 13:12:52.005  INFO 19664 --- [           main] com.cloud.gateway.GatewayApplication     : Started GatewayApplication in 21.601 seconds (JVM running for 22.549)

使用浏览器,访问 http://127.0.0.1:8888/blog,成功转发到目标 URI https://www.baidu.com,如下图所示:

 

 

企业微信消息推送API实战:5步搞定可信IP与域名配置(含Python代码示例) 本文详细解析了企业微信消息推送API实战中的关键配置步骤,特别是可信IP与可信域名的配置流程。通过5个清晰步骤,结合Python代码示例,指导开发者快速完成安全通信链路搭建,避免常见错误,确保消息推送服务稳定可靠。 阅读详情

相关推荐

DeepSeek-R1模型+Dify实战:5步打造能读PDF的智能客服(附BGE-M3嵌入模型配置)

本文详细介绍了如何利用DeepSeek-R1大模型与Dify平台,结合BGE-M3嵌入模型,构建企业级智能文档问答系统。通过5个步骤,从环境准备到知识库构建,再到智能问答应用开发,帮助企业快速从PDF等文档中提取关键信息,提升工作效率。特别适合处理产品手册、内部规程等专业内容。

convnet3designer的博客 720

注册nacos失败,No service to register for nacos client,No spring.application.name found, defaulting to

WARN 7728 --- [ main] o.s.c.n.a.ArchaiusAutoConfiguration : No spring.application.name found, defaulting to 'application' WARN 7728 --- [ main] c.a.c.n.registry.NacosServiceRegistry : No service to register for nacos client...

qq_39035267的博客 4280

MuJoCo柔性体仿真实战:从FlexComp建模到自定义模型导入

柔性体仿真是机器人交互研究中不可或缺的一环,MuJoCo作为高精度物理求解器,凭借高效的求解速度与批量并行能力,成为强化学习与软体抓取任务的热门选择。其FlexComp机制将连续材料离散为粒子-约束系统,以较低建模成本模拟布料、软组织等形变行为,相比Gazebo等平台更具实时性与可扩展性。技术价值体现在自定义柔性体建模与导入流程中:通过XML配置网格密度、间距与材料参数,即可生成贴合任务需求的软体垫子或硅胶抓手。在柔性抓取、颗粒抓手、医疗仿真等场景中,该方法能快速构建可训练的环境。围绕环境搭建、FlexCo

weixin_29045585的博客 159

启动就结束 报错:Process finished with exit code 0

Process finished with exit code 0 No active profile set, falling back to default profiles: default No spring.application.name found, defaulting to ‘application’ 报错内容: 2020-09-08 18:01:50.917 INFO 2740 --- [ main] c.a.g.coupon.GulimallCouponAppli

weixin_44839328的博客 1965

代码实现 —— 基于 STM32 的可见光通信系统课程设计

基于STM32F103ZET6,源码如需移植,需要修改定时器捕获通道引脚,及定时器,如果你也有这个课设任务,希望对你有所帮助。

不善挽留 1万+

VLA、世界模型与端到端在智驾中的本质关系与工程落地

世界模型并非3D重建,而是对环境状态转移函数的可微分建模;VLA不是视觉+语言+动作的简单拼接,核心在于跨模态语义对齐。二者共同支撑具身智能系统实现从感知到行动的闭环推演,其技术价值体现在长尾场景泛化能力提升与决策延迟降低。在自动驾驶领域,真实量产方案均采用VLA架构作为多模态感知基础,嵌入轻量级世界模型以支持反事实轨迹推演,并通过WA硬件封装保障实时性,最终由端到端控制层完成像素到扭矩的语义贯通。这种混合架构已成L2+/L3智驾系统的工程共识。

weixin_34163553的博客 365

Spring Boot 整合 Spring Cloud 和 Spring Cloud Alibaba (三)【网关 Gateway】

参考资料:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#glossary 网关介绍 网关作为流量的入口,常用功能包括路由转发、权限校验、限流控制等。而 Spring Cloud Gateway 作为 Spring Cloud 官方退出的第二代网关框架,取代了 Zuul 网关。 网关提供 API 全托管服务,丰富的 API 管理功能,辅助企业管理大规模的 API,以降低管理成本和安全风险,包括协议适配,协议转

weixin_32196893的博客 1664

PSINS工具箱15状态组合导航仿真程序(test_SINS_GPS_153)浅析-卡尔曼滤波设置+导航解算

文章目录test_SINS_GPS_153源码poserrsetkfinitgabiaskfupdate流程 test_SINS_GPS_153源码 poserrset function poserr = poserrset(dpos0, dlon, dhgt) % position errors dpos=[dlat;dlon;dhgt] setting. % % Prototype: poserr = poserrset(dpos0) % Input: dpos0=[dlat; dlon; dhgt],

十八与她的博客 2160

SpringCloud:Gateway之StripPrefix使用

很多时候也会有这么一种请求,用户请求路径是。,这时候我们需要去掉。

m0_67391377的博客 5754

FPGA+滨淞CCD实战:手把手教你搭建S7031/S10142成像电路(附避坑指南)

本文详细介绍了使用FPGA驱动滨淞CCD传感器(S7031/S10142)构建高精度成像系统的完整实战流程。内容涵盖核心器件选型、系统架构规划、电路板(焦面板与接口板)设计要点、FPGA Verilog逻辑实现,并提供了从电源管理、信号调理到数据采集的详细避坑指南,帮助读者从零搭建稳定可靠的成像电路。

weixin_29271263的博客 227

JSSIP实战:5分钟搞定WebRTC电话功能(附完整代码示例)

本文通过JSSIP库实战演示如何在Web应用中快速集成WebRTC电话功能。文章提供了从环境准备、SIP服务器连接到完整代码示例的详细步骤,涵盖用户注册、拨号接听、媒体流处理等核心环节,并针对常见问题给出排查方案,帮助开发者高效实现网页端实时语音通信。

u8v9w0x1y的博客 517

SpringCloud Gateway--Predicate/断言(详细介绍)上

说明: Predicate 就是一组匹配规则,当请求匹配成功,就执行对应的Route, 匹配失败,放弃处理/转发。

m0_73557631的博客 464

国科大学习资料--模式识别与机器学习(黄庆明)--期末复习题2(含答案)

国科大学习资料–模式识别与机器学习(黄庆明)–期末复习题2(含答案) 国科大学习资料–模式识别与机器学习(黄庆明)–期末复习题2(含答案) 国科大学习资料–模式识别与机器学习(黄庆明)–期末复习题2(含答案) ...

无名何许人的博客 1万+

Spring Cloud Gateway深度解析:新一代微服务网关

/ 自定义全局过滤器@Component@Override// 前置处理// 后置处理System.out.println("请求耗时: " + duration + "ms");}));// 执行顺序,数字越小越先执行// 自定义局部过滤器@ComponentConfig> {@Override// 自定义过滤逻辑// 添加自定义处理。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1016

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Spring Cloud Gateway:新一代API网关服务

Spring Cloud Gateway 为 SpringBoot 应用提供了API网关支持,具有强大的智能路由与过滤器功能,本文将对其用法进行详细介绍。Gateway ...

macrozheng的专栏 3379

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

12.Spring Cloud Gateway:新一代API网关服务

Spring Cloud Gateway:新一代API网关服务 https://mp.weixin.qq.com/s/bTp4_M3m7rhlhC9wYKExwA

MissOfSpring的博客 644

pscad IEEE标准系统搭建说明

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

Spring Cloud Gateway:新一代微服务API网关

????这是一个或许对你有用的社群????一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:《项目实战(视频)》:从书中学,往事中“练”《互联网高频面试题》:面朝简历学习,春暖花开《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题《精进 Java 学习指南》:系统学习,互联网主流技术栈《必读 Java 源码专栏》:知其然,知其所以然????这是一个或许...

weixin_44421461的博客 347

api gateway java_Spring Cloud Gateway:新一代API网关服务

Spring Cloud Gateway 为 SpringBoot 应用提供了API网关支持,具有强大的智能路由与过滤器功能,本文将对其用法进行详细介绍。SpringCloud实战电商项目mall-swarm(5.1k+star)地址:https://github.com/macrozheng/mall-swarmGateway 简介Gateway是在Spring生态系统之上构建的API网关服务,...

weixin_39517199的博客 170

Spring Cloud Gateway:新一代微服务 API 网关,用起来真优雅!

/ 实现自定义 Predicate 工厂// 通过HostRoutePredicateFactory创建Predicate进行路由判断@Component// Config 类作为 Predicate 的配置参数类// 路由匹配规则// 生成一个 Predicate 实例@Override// 实现匹配逻辑// 根据config实现匹配判断// 匹配配置中的域名// 使用.routes().build();9.自定义Filter@Component。

Java技术栈,分享最主流的Java技术 252

Spring Cloud Gateway vs Zuul:新一代网关技术对比与迁移指南

在微服务架构中,API网关扮演着至关重要的角色,负责请求路由、负载均衡、安全控制等核心功能。Spring Cloud生态提供了两种主流网关解决方案:Zuul和Spring Cloud Gateway。本文将深入对比这两种技术的核心差异,并提供从Zuul平滑迁移到Spring Cloud Gateway的完整指南,帮助开发者快速掌握新一代网关技术。 ## 为什么需要升级到Spring Cloud

gitblog_01053的博客 567
上一篇: 怎么从海量数据中快速查找某个数据:索引
下一篇: 深入浅出mysql索引-上
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值