【Day4-Spring Cloud】之RestTemplate--Ribbon负载均衡GET、POST、PUT、DELETE

Ribbon负载均衡器 GET POST PUT DELETE 不同类型参数详解 SpringCloud Ribbon 负载均衡器 轮询访问 Hello world 方法 地址:https://blog.youkuaiyun.com/qq_17025903/article/details/91463289 在之前我们通过RestTemplate实现了最简单的服务访问, 下面我们将详细介绍RestTemplate针对几种不同请求类型和参数类型的服务调用实现。 客户端代码 pac... 阅读详情

========================================启动注解 

========================================启动注解
@SpringBootApplication
public class Application {

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

    @Bean
    @LoadBalanced //启动负载均衡
    public RestTemplate RestTemplate(){
        return new RestTemplate();
    }
}

 ========================================GET调用例子

@Service
public class StudyTestService {
    @Autowired
    private RestTemplate restTemplate;
//***************************************GET请求方法***************************************

//getForEntiry,该方法返回的石ResponseEntity,该对象时Spring对HTTP的请求响应的封装,其中主要存储了HTTP的几个重要元素,
// 比如HTTP请求状态码的枚举对象HttpStatus(也就是我们场所的404,500这些错误码),在它的父类HttpEntiry中还存储着HTTP请求头的信息对象
// HttpHeaders以及泛型类型的请求体对象。比如下面的例子,就是访问USER-SERVER服务的/user请求,
// 同时最后一个参数nameValue会替换url中的{1}占位符,而返回的ResponseEntity对象中的body内容类型会根据第二个参数转换为String类型
public String getForEntityString(){
    String url="http://EUREKA-CLIENT1/queryUser?name={1}";
    ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class, "Jane");
    String body=responseEntity.getBody();
    return body;
}
//如果我们希望返回的body石一个VwDmsUserorgInfo对象类型,也可以这样实现:
public VwDmsUserorgInfo getForEntityClass(){
    String url="http://EUREKA-CLIENT1/queryUser?name={1}";
    ResponseEntity<VwDmsUserorgInfo> responseEntity = restTemplate.getForEntity(url, VwDmsUserorgInfo.class, "Jane");
    VwDmsUserorgInfo body=responseEntity.getBody();
    return body;
}
//上面的例子石比较常用的方法,getForEntity函数实际上提供了以下三种不同的重载实现。
//第一种:
//1.getForEntity(String url,Class responseType,Object... urlVariables);该方法提供了三个参数,其中url为请求的地址,responseType为请求响应体body的包装类型,urlVariables为rul重的参数绑定。
//GET请求的参数绑定通常使用rul中拼接的方式,比如http://EUREKA-CLIENT1/queryUser?name=Jane,我们可以像这样将参数拼接到url中,但更好的方法是在url中使用占位符并配合urlVariables参数实现GET请求的参数绑定,
//比如url定义为http://EUREKA-CLIENT1/queryUser?name={1},然后可以这样来调用:getForEntity("http://EUREKA-CLIENT1/queryUser?name={1}",String.class,"Jane"),其中第三个参数Jane
//会替换url中的{1}占位符,这里需要注意的是,由于urlVariables参数是一个数组,所以它的顺序会对应url中占位符定义的的数字顺序。【如果有多个参数可以在url中用占位符{2},{3},{4}..来代替,然后在urlVariables处依次传参便可】

//2.getForEntity(String url,Class responseType,Map urlVariables);该方法提供的参数中,只有urlVariables的参数类型与上面的方法不同,这里使用了Map类型,所以使用该方法进行参数绑定时需要在占位符中指定Map中参数的key值,比如
//url定义为http://EUREKA-CLIENT1/queryUser?name={name},在Map类型的urlVariables中,我们就需要put一个key为name的参数来绑定url中{name}占位符的值,比如:
public String getForEntityStringByMap(){
    Map<String,String> params=new HashMap<>();
    params.put("name","Jane");
    String url="http://EUREKA-CLIENT1/queryUser?name={1}";
    ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class, params);
    String body=responseEntity.getBody();
    return body;
}
//3.getForEntity(URI uri,Class responseType);该方法使用URI对象来替代之前的url和urlVariables参数来指定访问地址和参数绑定,URI是JDKjava.net包下的一个类
//它标识一个统一资源标识符(Uniform Resource Identifier)引用。比如下面的例子:
public String getForEntityStringByUri(){
    UriComponents uriComponents= UriComponentsBuilder.fromUriString("http://EUREKA-CLIENT1/queryUser?name={name}")
            .build()
            .expand("Jane")
            .encode();
    URI uri=uriComponents.toUri();
    ResponseEntity<String> responseEntity = restTemplate.getForEntity(uri, String.class);
    String body=responseEntity.getBody();
    return body;
}

//第二种:
//1.getForObject函数。该方法可以理解为对getForEntity的进一步封装,它通过HttpMessageConverterExtractor对HTTP的请求响应体body内容进行对象转换,实现请求直接返回包装好的对象内容。比如:
public String getForObjectString(){
    UriComponents uriComponents= UriComponentsBuilder.fromUriString("http://EUREKA-CLIENT1/queryUser?name={name}")
            .build()
            .expand("Jane")
            .encode();
    URI uri=uriComponents.toUri();
    String result = restTemplate.getForObject(uri, String.class);
    return result;
}
//当body是一个VwDmsUserorgInfo对象是,可以直接这样实现:
public VwDmsUserorgInfo getForObjectClass(){
    UriComponents uriComponents= UriComponentsBuilder.fromUriString("http://EUREKA-CLIENT1/queryUser?name={name}")
            .build()
            .expand("Jane")
            .encode();
    URI uri=uriComponents.toUri();
    VwDmsUserorgInfo result = restTemplate.getForObject(uri, VwDmsUserorgInfo.class);
    return result;
}
//当不需要关注请求响应除body外的其它内容时,该函数就非常好用,可以少一个从Response中获取body的步骤。它与getForEntiry函数类似,也提供了三种不同的重载实现。
//1.getForObject(String url,Class responseType,Object... urlVariables);与getForEntity的方法蕾西,url参数指定访问的地址,responseType参数定义该方法的返回类型,urlVariables参数为url中占位符对应的参数。
//2.getForObject(String url,Class responseType,Map urlVariables);在该函数中,使用Map类型的urlVariables替代上面数组形式的urlVariables,因此使用时在url中需要将占位符的名称与Map类型中的key一一对应设置。
//3.getForObject(URI uri,Class responseType);该方法使用URI对象来替代之前的url和urlVariables参数使用。
}

 ========================================POST调用例子

@Service
public class StudyTestService {
    @Autowired
    private RestTemplate restTemplate;
//***************************************POST请求方法***************************************
//在RestTemplate中,对POST请求时可以通过如下三个方法进行调用实现。

//第一种:postForEntity函数,该方法同GET请求中的getForEntity类似,会在调用后返回ResponseEntiry<T>对象,其中T为请求响应的body类型。比如下面这个例子,使用postForEntiry提交POST请求到EUREKA-CLIENT1服务的/queryName接口,
// 提交的body内容为VwDmsUserorgInfo对象,请求响应返回的body类型为String
public String postForEntity(){
    VwDmsUserorgInfo vdui=new VwDmsUserorgInfo();
    vdui.setName("Jane");

    ResponseEntity<String> responseEntity = restTemplate.postForEntity("http://EUREKA-CLIENT1/addUser", vdui, String.class);
    String body = responseEntity.getBody();
    return body;
}
//postForEntiry函数也实现了三张不同的重载方法。
//1.postForEntiry(String url,Object requestObject,Class responseType,Object... uriVariables)
//2.postForEntiry(String url,Object requestObject,Class responseType,Map uriVariables)
//3.postForEntiry(URI uri,Object requestObject,Class responseType)
//这些函数中的参数用法大部分与getForEntiry一致,比如,第一个重载函数和第二个重载函数中的uriVariables参数都用来对url中的参数进行绑定使用;responseType参数是对请求响应的body内容的类型定义。
//这里需要注意的是新加的requestObject参数,该参数可以是一个普通对象,也可以是一个HttpEntity对象,如果是一个普通对象,而非HttpEntity对象的时候
//RestTemplate会将请求对象转换为一个HttpEntiry对象来处理,其中Object就是request的类型,request内容会被视作完成的body来处理,而如果request是一个HttpEntiry对象,
// 那么就会被当做一个完整的HTTP请求对象来处理,这个request中不仅包含body的内容也包含了header的内容。

//第二种:postForObject函数,该方法也跟getForObject的类型类似,它的作用时间简化postForEntiry的后续处理。通过直接将请求响应的body内容包装成对象来返回使用,比如下面的例子:
public String postForObject(){
    VwDmsUserorgInfo vdui=new VwDmsUserorgInfo();
    vdui.setName("Jane");
    String s = restTemplate.postForObject("http://EUREKA-CLIENT1/updateUser", vdui, String.class);
    return s;
}
//postForObject函数也实现了三种不同的重载方法;
//postForObject(String url,Object request,CLass responseType,Object... uriVariables)
//postForObject(String url,Object request,Class responseType,Map uriVariables)
//postForObject(URI url,Object request,Class responseType)
//这三个函数除了返回的对象类型不同,函数的传入参数均与postForEntity一致,因此可参考之前postForEntity的说明。

//第三种:postForLocation函数。该方法实现了以POST请求提交资源,并返回新资源的URI,比如下面的例子:
public URI postForLocation(){
    VwDmsUserorgInfo vdui=new VwDmsUserorgInfo();
    vdui.setName("Jane");
    URI uri = restTemplate.postForLocation("http://EUREKA-CLIENT1/updateUser", vdui, String.class);
    return uri;
}
//postForLocation函数也实现了三种不同的重载方法:
//postForLocation(String url,Object request,Object... urlVariables)
//postForLocation(String url,Object request,Map urlVariables)
//postForLocation(URI uri,Object request)
//由于postForLocation函数会返回新资源的URI,该URI就相当于指定了返回类型,所以此方法实现的POST请求不需要像postForEntity和postForObject那样指定responseType。其他的参数用法相同。
}

 ========================================PUT调用例子


//***************************************PUT请求方法***************************************
@Service
public class StudyTestService {
    @Autowired
    private RestTemplate restTemplate;
//在RestTemplate中,对PUT请求可以通过put方法进行调用实现,比如:
public void put1(){
    VwDmsUserorgInfo vdui=new VwDmsUserorgInfo();
    Long id=10001L;
    restTemplate.put("http://EUREKA-CLIENT1/user/{1}",vdui,id);
}
//put函数也实现了三种不同的重载方法:
//put(String url,Object request,Object... urlVariables)
//put(String url,Object request,Map urlVariables)
//put(URI url,Object request)
//put函数为void类型,所以没有返回内容,也就没有其他函数定义的responseType参数,除此之外的其他传入参数定义与用法与postForObject基本一致。
}

 ========================================DELETE调用例子


//***************************************DELETE请求方法***************************************
@Service
public class StudyTestService {
    @Autowired
    private RestTemplate restTemplate;
    public void delete(){
        Long id=10000000000L;
        restTemplate.delete("http://EUREKA-CLIENT1/deleteUser/{1}",id);
    }
//delete函数也实现了三种不同的重载方法
//delete(String url,Object... urlVariables)
//delete(String url,Map urlVariables)
//delete(RUI url)
//由于我们在进行REST请求时,通常都将DELETE请求的唯一标识拼接在url中,所以DELETE请求也不需要request的body信息,就如上面的三个函数实现一样
//非常简单,url指定DELETE请求的位置,urlVariables绑定url中的参数即可。
}
linux系统中实现智能家居的基本方法 使用QT开发智能家居中的一个物联应用,通过云服务器远程控制设备与设备进行通信。在生活中,可以使用WIFI智能插座控制电器开关,比如远程开启热水器,远程打开空调,窗帘等等。包括:WIFI联网,注册到云服务器上,编写QT UI通过网络来与云服务器通信,然后再下发指令到这个连网的设备。硬件说明:需要有一个串口转WIFI模块,另外需要加上一个USB-TTL模块,外加一根T口USB连接线,可接入PC电脑调试。 阅读详情

相关推荐

【CVPR 2025】低光增强HVI论文精读与源码复现---part1 论文网络精读

【CVPR 2025】本文参考论文HVI: A New Color Space for Low-light Image Enhancement part1 在文章中对论文核心网络与原理展开详细解释 part2 对论文公开代码的arch网络与其他核心部分展开详细解释

BOB_BOB_BOB_的博客 3263

负载均衡:Ribbon - 远程调用:RestTemplate & OpenFeign

根据设定的负载均衡算法,从列表中取出一个合适的URL,到此Ribbon的事情结束了。所以部署集群时都是设置相应的应用程序相同的应用名称.权重轮询策略(常用,中小型项目使用) :根据每个application service的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性越低。(注意: 这里的客户端指的是一个服务调用另一个服务(不涉及用户端,是内部服务间的调用),调用方是客户端,被调用方是服务端)可以是硬件,如F5, 也可以是软件,如nginx(注意这里的客户端指的是用户端,服务端是服务器)

风生的博客 945

保姆级教程:用PROGRAM_FTDI搞定Xilinx FPGA的JTAG调试器(基于FT232/FT2232/FT4232)

本文详细介绍了如何使用FT232/FT2232/FT4232系列芯片通过PROGRAM_FTDI工具配置Xilinx FPGA的JTAG调试器。从芯片选型、驱动安装到固件烧写和Vivado验证,提供了完整的实操指南和避坑要点,帮助开发者低成本实现高效调试。

weixin_29271053的博客 2155

(三)客户端负载均衡:Spring Cloud Ribbon--笔记

Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,而已让我们将面向服务的REST模板请求自动转换成客户端负载均衡的服务调用。它只是一个工具类框架,无需独立部署,但几乎存在于每一个Spring Cloud构建的微服务和基础设施中。微服务建的调用,API网关的请求转发等内容,实际上都是通过R

sinat_37138973的博客 5670

手把手教你用VCS+Verdi在Linux下仿真蜂鸟E203 RISC-V核(附波形调试技巧)

本文详细介绍了在Linux环境下使用VCS和Verdi工具链对蜂鸟E203 RISC-V核进行仿真验证的完整流程。从环境配置、工程结构解析到VCS编译优化和Verdi波形分析技巧,提供了实战性强的调试方法和性能优化策略,帮助工程师高效完成数字IC验证工作。

weixin_42531163的博客 416

Jetson Nano官方镜像下载&烧录

在NVIDIA Jetson Nano开发者套件上安装NVIDIA官方Ubuntu镜像

weixin_44222088的博客 8851

Spring Cloud Ribbon:负载均衡的服务调用

Spring Cloud Ribbon 是Spring Cloud Netflix 子项目的核心组件之一,主要给服务间调用及API网关转发提供负载均衡的功能,本文将对其用...

macrozheng的专栏 498

Selenium自动化测试遇到shadow-root元素?3种实用解决方案帮你搞定

本文针对Selenium自动化测试中遇到shadow-root元素难以定位的常见问题,提供了三种实用的解决方案。详细阐述了通过JavaScript直接穿透Shadow DOM、利用浏览器工具快速获取JS Path以及使用Python第三方库进行优雅封装的方法,并分享了提升脚本健壮性的实战策略与最佳实践,帮助测试人员有效应对现代Web组件化开发带来的挑战。

code8的博客 408

学习Spring Cloud Ribbon 发送请求

首先在pom.xml中的文件中添加依赖,其中有Web依赖,Eureka依赖(服务的注册与发现),Ribbon依赖。 &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&...

pengxiuyuan_的博客 1547

90. 将 SAP ABAP 内表内容本地导出成 Excel 文件

这里文件扩展名为 csv,全称是 Comma-Separated Values,意思是这种类型的文件内容,由逗号分隔。除了 ASC 之外,另一个可用的选项是 BIN,适用于 PDF,EXE 等二进制文件的导出。支持海量的输入和输出参数,我们这个简单的本地导出场景里,大部分参数都用不上。这个分隔符的添加逻辑,编写在上图红色高亮矩形框内,使用的语法是。本教程有学习者向我提问,询问如何将 ABAP 某某函数的某某输出参数的值,导出成本地 Excel 文件。把这个内表的内容,下载到本地,以本地文件的方式保存。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1743

智能车图像处理4-入门级分析3 ---十字路口补线

PS :入门级文章适合新手,如果已经有基础可以去看进阶篇文章。

taiyuezyh的博客 1万+

SpringCloud 6:Ribbon的配置与使用

Ribbon1. Ribbon2. Ribbon配置2.1 配置文件方式2.2 代码方式 1. Ribbon Ribbon是一个独立的组件,用来进行远程接口调用,可以在启动类中通过@Bean进行实例化 在service中的使用方法 通过 getForObject 方法可以掉到用 micro-order 服务的,queryUser 接口。然后在调用期间会存在负载均衡,micro-order 服务对应有几个服务实例就会根据负载均衡算法选择某一个去调用。 如果需要获取请求头header等信息,可以使

Fisher3652的博客 2565

【RT-DETR涨点改进】全网独家创新、细节涨点改进篇 | AAAI 2025 | 将 CEM 颜色增强模块引入RT-DETR ,目标检测不再惧怕雾天和低光检测、小目标检测、遥感目标检测高效涨点

本文提出了一种新型结构引导去雾网络(SGDN),通过双色引导桥(BGB)和色彩增强模块(CEM)有效解决雾霾图像去雾问题。BGB利用YCbCr空间的纹理特征引导RGB特征恢复,CEM通过聚合YCbCr通道信息增强RGB色彩感知。实验证明该方法在真实雾霾数据集上优于现有技术,能同时保持色彩准确性和纹理清晰度。文章还提供了完整的代码实现和模型配置指南,包括三种改进版RT-DETR网络结构(rtdetr-l/r18/r50-CEM.yaml),为图像去雾和目标检测任务提供了实用解决方案。

Ai缝合怪、助力小伙伴高效发论文 351

使用Nginx的upstream实现负载均衡,并配置https,避免Post请求类型转发后变为Get

当使用不同域名不同云厂商进行负载均衡策略时,Post等类型请求被转发为了Get,导致服务异常。原因是域名使用了https策略,并自动从写了http。Nginx支持负载均衡,可以很方便的帮助我们进行水平扩容,upstream就是nginx中的负载均衡模块。解决方案:在写配置时添加Https及端口。,可以得到简单的配置方案如下。

baidu_39340547的博客 3044

Devexpress16.2.6破解工具

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

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Ribbon中四个Rest请求模板

Ribbon中四个Rest请求模板1.RestTemplate的GET请求 (查询)第一种: getForEntitygetForEntity可以自定义 类型model1.另外两个重载方法2.重载方法第二种: getForObject()2.RestTemplate的POST请求 (添加)3.RestTemplate的PUT请求 (修改)4.RestTemplate的DELETE请求 (删除) 1.RestTemplate的GET请求 (查询) Get请求可以有两种方式: 第一种: getForEntit

jj89929665的博客 277

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

2_Ribbon客户端负载均衡和传参方式

前言 上一篇讲了Eureke 服务注册和发现,已经服务提供这和服务消费者ribbon,下面这个我们重点讲下Ribbon客户端的负载均衡和传参的方式,那么开始之前,我要先讲下负载均衡 1、负载均衡 1.1、服务端负载均衡 我们通常说的负载均衡都是服务端的负载均衡,其中分为硬件负载均衡和软件负载均衡, 硬件负载均衡主要是服务器节点之间专门安装用于负载均衡的设备,如F5 软件负载均衡则通过在服务器上安装...

HealerJean梦想博客 1275

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Spring Cloud之Ribbon转发请求头(header参数)

目录 简介 1.自定义RestTemplate 2.将MyRestTemplate注册为Bean 3.构建spring拦截器 4.构建拦截器配置类 5.controller调用 简介 使用spring cloud的ribbon组件可以实现对下游微服务的负载均衡调度,但是官方ribbon是没有header转发功能的,这里我们在ribbon的restTemplate基础上,自定义实现h...

justlpf的专栏 4522

SpringCloud Ribbon的基本使用

aRibbon是什么?Ribbon是Netflix发布的云中间层服务开源项目,主要功能是提供客户端负载均衡算法。Ribbon客户端组件提供一系列完善的配置项,如,连接超时,重试等。简单的说,Ribbon是一个客户端负载均衡器,我们可以在配置文件中列出load Balancer后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器,我们也很容易使用Ribbon实

架构之路 1万+

Ribbon学习笔记(一):入门

##简介 Spring Cloud Ribbon是一个基于Http和TCP的客户端负载均衡工具,它是基于Netflix Ribbon实现的。它不像服务注册中心、配置中心、API网关那样独立部署,但是它几乎存在于每个微服务的基础设施中。理解Ribbon对于我们使用Spring Cloud来讲非常的重要,因为负载均衡是对系统的高可用、网络压力的缓解和处理能力扩容的重要手段之一。 在Spring Clo...

998

Spring Cloud(Finchley.SR1)之服务调用及使用ribbon实现负载均衡(三)

目录   基本介绍   1.服务提供者 1.1 被调用的服务controller 1.2 启动类 2.服务调用者 2.1启动类 2.2消费者service 2.3 getForEntity 2.4 getForObject 2.5 POST请求 2.6 消费者controller 3.ribbon 4.自定义Ribbon客户端 4.1通过配置类来实现ribbion自...

青鸟飞鱼 4244

16. springcloud 网关 post 重试问题,Ribbon的饥饿加载(eager-load)模式

背景 post 重试,如果项目中接口没有做幂等,就会产生脏数据! ribbon: ConnectTimeout: 2000 # 请求连接的超时时间: 1s ReadTimeout: 2000 # 请求处理的超时时间: 1s OkToRetryOnAllOperations: false # 是否对所有操作重试 MaxAutoRet...

转身那一瞬 902

Ribbon调用

一. 创建微服务的提供者工程 编辑main方法 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.support.Sp...

zhangningkid的博客 602

SpringCloud-服务消费者(Ribbon)

1、POM         com.xxx         xxx         1.0-SNAPSHOT          xxx-webapi     xxx-webapi     http://maven.apache.org                           com.xxx             xxx-api             

看图说话 427

SpringCloud微服务实战之服务消费者Ribbon+RestTemplate

Eureka服务治理体系中有3个核心角色:服务注册中心、服务提供者、服务消费者。spring cloud的服务调用又分为两种方式:ribbon+RestTemplate和feign,本篇主要说的是ribbon+restTemplate方式。 Spring Cloud Ribbon是基于Http和Tcp协议的客户端负载均衡工具,基于Netflix Ribbon实现,它只是一个工具类,不需要独

上善若水 7472

Spring Cloud 之ribbon(三)

ribbon 用来实现客户端负载均衡 ,主要有三大功能: 1、服务发现 2、选择服务策略 3、检测服务是否有效,剔除失效服务 新建一个hello-service 项目 HelloApplication 代码 package hello; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.

冰清雪酷的专栏 2377
上一篇: 【Day3-Spring Cloud】之Eureka--服务治理机制
下一篇: mongodb多字段分组统计并求最大统计失败时间
芬芳酩酊
博客等级 码龄10年 35粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值