SpringCloud框架讲解,以及如何在idea上搭建一个简单的SpringCloud框架并使用Ribbon技术

SpringCloud分布式微服务搭建(一) 本例子主要使用了eureka集群作为注册中心来保证高可用,客户端来做ribbon服务提供者的负载均衡。 负载均衡有两种,第一种是nginx,F5这种集中式的LB,对所有的访问按照某种策略分发。 第二种是客户端知道所有的服务的地址,在客户端做负载均衡,客户端自己去发送。 github地址:https://github.com/linjiaqin/scdemo 一. eureka注册中心的搭建 1.为... 阅读详情

    一:springCloud框架
    是springboot的升级框架,其中包含很多子项目
    eureka注册中心, feign消费者,Hystrix熔断器,Zuul路由,
    Config全局配置中心,Bus消息总线,负载均衡策略
    
    底层基于httpClient实现,发布一个controller类
    
    spring家族:
    spring Framework5.0 --》 springboot2.0 --》springcloud Finchley.SR2
    
    springboot(微服务)相对于spring 约定优于配置

 

  二:搭建springCloud框架

   1.创建maven多模块儿项目

删除src文件夹

2.在springcloud项目上创建springboot项目勾选cloud discovery --》Eureka Server

 

3.在配置类配置Eureka注册服务 Eureka Server

server:
  port: 8761


eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
  server:
    enable-self-preservation: false

3.在启动类上加@EnableEurekaServer 启用eureka服务端  

package com.jk.app;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class SpringCloudEurekaApplication {

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

}

4.启动项目访问路径地址,访问Eureka注册中心,出现如下图表示访问成功

5.创建一个生产者springcloud-provider

记得勾选Eureka Discover选项

6.配置生产者的配置文件

server:
  port: 8765

spring:
  application:
    name: springcloud-user-reg

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka

7.在生产者启动类上加上@EnableEurekaClient注解,并写一个方法进行测试框架是否搭建成功

package com.jk.app;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@EnableEurekaClient
@RestController
@ComponentScan("com.jk.*")
public class SpringcloudProviderApplication {

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

    }

    /**
     * 测试方法
     */

    //动态取端口号,${server.port}和配置文件的值对应
    @Value("${server.port}")
    String post;
    @GetMapping("test")
    public String test(){
        //返回一句话
        return "I post port is :" +post;
    }

}

8.浏览器访问路径

访问成功

9.我们回到Eureka注册中心看一下,发现注册中心已经注册上了!

   idea启动多个实例的方法:
    Edit Configurations--> single instance only 只能启动单个实力 将勾去掉
    Edit Configurations--> Allow running in parallel 允许并行启动 将勾选上

 

 

10.接着创建消费者的项目,创建项目选择 Web  Eureka Discover   Ribbon

11.配置消费者的配置类

server:
  port: 8672

spring:
  application:
    name: springcloud-ribbon

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka

12.同样在在启动类上加@EnableEurekaClient 注解

13.在启动类中将RestRestTemplate注入spring中

package com.jk.app;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableEurekaClient
@ComponentScan("com.jk.*")
public class SpringcloudRibbonApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringcloudRibbonApplication.class, args);
    }
    // 将RestTemplate注入到spring容器中
    // LoadBalanced负载均衡默认为轮询
    // 通过注入在controller中就可以使用调用生产者实例
    @Bean
    @LoadBalanced
    RestTemplate restTemplate(){
        return new RestTemplate();
    }


}

14.在消费者项目的controller中注入RestTemplate
        @Autowired
        private RestTemplate restTemplate;

package com.jk.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class UserController {

    @Autowired
    private RestTemplate restTemplate;
}

15.消费者调用生产者
    restTemplate.getForObject("http://生产者实例名/请求生产者的Controller方法", 返回值类型.class);

在生产者项目创建Controller,并写一个测试方法测试

package com.jk.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class UserController {

    /**
     * 测试
     * @return
     */
    @GetMapping("testPro")
    @ResponseBody
    public String test(){
        System.out.println("ribbon调用生产者成功");
        return "success";
    }
}

16.回到消费者controller调用方法

package com.jk.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class UserController {

    @Autowired
    private RestTemplate restTemplate;

    /**
     * 调用生产者
     */

    //调用请求
    //get  查
    //Post  增
    //delete 删
    //put 改
    @GetMapping("select")
    public String select(){
        String result = restTemplate.getForObject("",String.class);
        return result;
    }
}

17.启动项目访问路径

调用方法成功!

18.接着创建common项目接入实体Bean

package com.jk.model;

public class User {
    private Integer userId;
    private String userName;



    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", userName='" + userName + '\'' +
                '}';
    }
}

13.在provider生产者项目和ribbon消费者的pom.xml文件中引入和common项目的依赖关系

        <dependency>
            <groupId>com.jk</groupId>
            <artifactId>common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

14.在生产者的controller中写一个新增的方法

package com.jk.controller;

import com.jk.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class UserController {

    /**
     * 测试
     * @return
     */
    @GetMapping("testPro")
    @ResponseBody
    public String test(){
        System.out.println("ribbon调用生产者成功");
        return "success";
    }

    /**
     * 新增的方法
     */
    @PostMapping("save")
    @ResponseBody
    public User save(@RequestBody User user){
        user.setUserId(11);
        return user;
    }

}

15.在消费者的controller中调用生产者发布的新增接口

@PostMapping("save")
    public User save(){
        User user = new User();
        user.setUserName("路明非");
        User user1 = restTemplate.postForObject("http://SPRINGCLOUD-USER-REG/save", user, User.class);
        return user1;
    }

16.启动项目访问地址

调用成功,搭建完毕。开始连接数据库

17.我在common项目中写入一个实体类

18.生产者项目中的pom.xml文件中引入数据库核心jar包

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.4</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>

19.生产者项目配置类配置

server:
  port: 8765



spring:
  application:
    name: springcloud-user-reg
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/math?serverTimezone=Hongkong&useUnicode=true&characterEncoding=utf-8
    username: root
    password: root

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
mybatis:
  mapper-locations: classpath:mapper/*.xml

20.创建包结构

controller层记得加controller注解,Autowired注解注入service层

 /**
     * 数据库查询order列表
     *
     */
    @GetMapping("queryOrder")
    @ResponseBody
    public List<OrderBean> queryOrder(){
        return userService.queryOrder();
    }

service层

/**
     * 查询
     * @return
     */
    List<OrderBean> queryOrder();

serviceImpl层记得加Service注解,Autowired注解注入Mapper层

    @Override
    public List<OrderBean> queryOrder() {
        return userMapper.queryOrder();
    }

mapper层

    @Select("select * from t_order")
    List<OrderBean> queryOrder();

20.在生产者启动类加上@MapperScan("com.jk.mapper")扫描Mapper层

21.消费者Controller层调用查询方法

 /**
     * 调用生产者查询方法
     */
    @GetMapping("queryOrder")
    public List<OrderBean> queryOrder(){
        List forObject = restTemplate.getForObject("http://SPRINGCLOUD-USER-REG/queryOrder", List.class);
        return forObject;
    }

22.启动项目访问

查询成功

我的mysql数据库

连接数据库成功!

Java面试题超详细讲解微服务系列之十六【SpringCloud篇】 SpringCloud面试题大全,看就完事了,图例结合超详细讲解 阅读详情

相关推荐

IDEA快速搭建SpringCloud项目结构

使用IDEA开发工具,基于maven快速搭建一个基础项目结构,可在同一个项目下创建多module来分别打包不同的api应用,进行分布式部署。commonProject内包括多个modules为不同的api应用提供公共的可复用代码。

IDEA 搭建 SpringCloud 项目【超详细步骤】

SpringCloud 项目从零搭建,包括 Eureka 注册中心的创建及微服务的远程调用。

m0_52861684的博客 2万+

SpringCloud-创建服务消费者-Ribbon方式示例代码.zip

SpringCloud-创建服务消费者-Ribbon方式示例代码,SpringCloud-创建服务消费者-Ribbon方式示例代码

适合初学者在Idea上学习搭建的SpringCloud框架以及各个组件的步骤 【建议收藏!!!】

适合初学者学习搭建的SpringCloud框架步骤 配置一个springcloud项目如下: 先创建一个什么都不要选的maven项目,接着就是在maven项目里面依次创建各个模块项目,具体请看以下介绍. 模块例图: 1 .首先要创建一个spring的项目,例如名叫springcloud-eureka的项目,其实也就是注册中心。 在创建项目的时候记得要勾选Spring Cloud Discover...

优快云 记录 “ 美好生活 ” 2328

你需要这样一个Ros软路由—— 路由器+外网+一号通ip线路=动态ip的WiFi信号

功能强大 管理便捷—给您全新的路由体验 一键更换指定线路or批量更换所有IP/MAC/SSID 自定义走本地网络策略的分流功能 设备批发价、不限制拨号账号服务商 强大的单设备/多设备IP去重功能 批量导入、管理一号通线路 一键任意切换5G_WiFi(推荐)/2.4G_WiFi(建议不用) 设备支持PPTP/L2TP/SSTP/openVP.N等协议 独家支持openVPN,适用于网络受限用户 支持自行接入AP和交换机扩容 一键打开/关闭所有虚拟WiFi 一键隐藏/显示设备WiFi...

米粒儿 4249

开发框架Furion之WebApi+SqlSugar (一)

MyFurion.Model项目中,通过Nuget添加Furion、Furion.Extras.DatabaseAccessor.SqlSugar、Furion.Extras.ObjectMapper.Mapster、SqlSugarCore,同时添加对项目MyFurion.Unility的引用。在MyFurion.Start项目中,通过Nuget添加 AspNetCoreRateLimit、System.Linq.Dynamic.Core,同时添加对项目MyFurion.Application的引用。

liwan09的博客 1万+

使用IDEA一步步搭建SpringCloud项目

SpringCloud简单搭建 前面已经介绍过SpringBoot与Mybatis,Redis,ActiveMQ的整合。接下来要做的是SpringCloud的项目的搭建。 在微服务的架构体系中,SpringBoot只能用于应用开发,而想要实现完整的微服务架构,还需要实现架构中的服务注册与发现,API网关和负载均衡等功能。接下来通过SpringCloud来实现架构中的这些功能。 在创建项目之前,需要了解的是SpringCloud与SpringBoot的版本号区别是: SpringBoot是通过数字来区分版本号

m0_67393295的博客 7138

骗分导论 CSP、NOIP、蓝桥杯、PAT、USACO等竞赛的算法骗分技巧 轻松省三

问题来了,那么多座桥,炸一座就破坏岛屿的联系,可能性微乎其微(除非特别设计数据)。它们的价值极大,不仅能初步帮你检验程序的对错,而且,如果你不会做这道题,你就可以直接输出样例!在OI考试中最后难的题数据最后的几个,他们往往不会创造新的数据,此时就可以直接输出最后几个数据了。需要运用《骗分导论》第3章中学到的知识,先写出朴素算法,然后造一些数据,可能就会发现规律。有些时候,问题的答案可能很有特点:对于大多数情况,答案是一样的。据说,在NOIP2013中,有人最后一题不会,愤然打了个随机数,结果得了。

星卯教育-信奥教练tony 6403

使用IntelliJ IDEA创建Ribbon项目实现负载均衡

Eureka注册中心:《使用IntelliJ IDEA创建Spring Cloud服务注册中心》 服务提供者创建:《使用IntelliJ IDEA创建Spring Cloud的Eureka Client》 本文将创建服务集群(即服务提供者的集群),将集群中的服务均注册到Eureka注册中心。然后创建Ribbon项目,使用ribbon+restTemplate这种服务方式来调用Eureka注册中...

我爱编程持之以恒 1566

慕课软件质量保证与测试(习题集)

慕课金陵科技学院.软件质量保证与测试.期末复习.习题汇总0 总目录1 绪论1.1 软件质量保证与测试的产生与发展1.2 软件缺陷,软件错误,软件故障1.3 软件质量保证与测试的意义,原则和挑战1.4 单元测试1.5 课后作业2 软件测试策略2.1 软件测试的模型,过程和生命周期2.2 软件测试的方法和技术2.3 单元测试2.4 课后作业3 黑盒测试3.1 黑盒测试概述3.2 等价类划分测试3.3 边界值测试3.4 错误推测法3.5 判定表驱动法3.6 因果图法3.7 场景法3.8 正交实验法3.9 单元测试

weixin_42473228的博客 5万+

ERPS协议原理

目录 1、ERPS概述: 2、ERPS名词概念解释: 3、ERPS协议报文: 4、ERPS单环基本原理: 5、单环多实例原理: 6、多环原理: 1、ERPS概述: ERPS(Ethernet Ring Protection Switching),即以太网多环保护技术,是ITU-T定义的一种二层破环协议标准,标准号为ITU-T G.8032/Y1344,因此又称为G.8032。它定义了RAPS(Ring Auto Protection Switching)协议报文和保护倒换机制。 ERPS目前支持v1和v2两

weixin_44880796的博客 1万+

使用IDEA开发Spring Cloud项目(四)创建服务消费者(Ribbon)

概述 在上一篇文章,我们讲了服务的注册和发现。在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的。Spring cloud有两种服务调用方式,一种是ribbon+restTemplate,另一种是feign。在这一篇文章首先讲解下基于ribbon+rest ribbon简介 ribbon是一个负载均衡客户端,可以很好的控制htt和tcp的一些行为。Fe...

Micro麦可乐的博客 1940

Vue3 - 强力解决前端下载二进制流pdf文件、下载成功后打开空白问题解决,或者获取PDF文件流,将blob对象转换成下载链接打开后一片空白(无论是否使用pdf插件下载,还是原生方法下载都完美解决)

vue3前端下载二进制流pdf文件,下载成功,打开空白问题解决,js下载PDF文件流,打开空白问题,VUE3 h5中的文件流下载和指定的url下载总结(解决下载后的pdf打开空白情况)pdfjs打开文件流空白,解决pdf文件流,预览全是空白页,pdf文件流,下载正常,但是预览全是空白页,前端JS获取PDF文件流,将blob对象转换成下载链接打开后一篇空白的问题,前端文件流下载后文件空白,前端下载文件流PDF文件显示空白 或 无法打开,在线预览PDF文件打不开白屏怎么办,前端axios请求二进制数据流转换生成

🏆 前端领域优质创作者 4615

SpringCloud微服务(2022)

微服务/分布式(轻量级/模块) 技术 java、maven、Git、github、Nginx、RabbitMQ、springboot 一、SpringCloud:服务全家桶/一站式 (一) 组件 1、服务发现框架(注册中心):Eureka 、Zookeeper、Consul、nacos 2、负载均衡: Ribbon、Nignx、loadBalancer 负载均衡算法 进程内负载均衡器 3、服务调用映射:feign 、Open Feign 4、熔断器(断路器):Alibaba sentienl、Hyst

REMLI©CN 2788

【工控基础】UVW平台踩坑

1 每个轴按顺时针或逆时针走一个距离,就是旋转。 2 图中W动,U轴V轴不动,就是X方向的平移 3 图中U轴V轴同时动,X不动,就是Y方向的平移。

songhuangong123的博客 6943

YOLO11创新改进系列:卷积,主干 注意力,C3k2融合,检测头等创新机制(已更新110+)

本专栏提供详细的 YOLO11 教程,包括基础知识、源码解析、入门实践、算法改进和项目实战,适合发表YOLO11 学习者订阅。内容包含 100+多篇独家改进机制,适合发表论文,评分高达 96 分。订阅者将获得一键运行的改进文件及答疑交流群支持。 使用服务器的同学还可以私聊获取搭建好的运行环境。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 1万+

SpringCloud之Eureka、Ribbon、OpenFeign

微服务(MicroServices)微服务1. 服务项目中的功能模块(帮助用户解决某一个或一组问题),在开发过程中表现为 IDE(集成开发环境,例如 Eclipse 或 IntelliJ IDEA)中的一个工程或Moudle。2. 微服务体积小、复杂度低(一个微服务通常只提供单个业务功能的服务,代码较少);微服务团队所需成员少(只需要开发人员2到5名即可完成从设计、开发、测试到运维的全部工作)。微服务架构(一种系统架构风格)

caihuayuan4的博客 2109

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

从零学习搭建springcloud日记-Eureka、Ribbon篇

从零学习搭建springcloud日记刚开始就遇到的问题没有找到springboot创建工具maven仓库问题搭建eureka注册中心创建项目确认pom文件修改配置文件application.yml启动项添加@EnableEurekaServer注解遇到的问题搭建服务提供方新建新模块修改yml配置启动项添加@EnableDiscoveryClient注解写个测试controller搭建服务消费方(restTemplate+ribbon方式)新建consumer的模块修改yml配置启动类添加@EnableDi

qq_32541437的博客 533

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

使用IDEA创建maven+springCloud项目(一)

使用IDEA创建maven+springCloud项目(基础)

Java_monkeys的博客 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

SpringCloud Alibaba微服务框架搭建

微服务架构通过将单体应用拆分为多个独立的小型服务,每个服务专注于特定功能,独立开发、部署和扩展,服务之间通过API或消息队列通信。例如电商系统拆分为用户服务、商品服务、订单服务等,各自独立部署。

m0_74399067的博客 737

如何使用springCloud搭建一个简单的分布式demo

这里是修真院后端小课堂,每篇分享文从 【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】 八个方面深度解析后端知识/技能。 本篇分享的是:如何使用springCloud搭建一个简单的分布式demo 大家好,我是IT修真院北京岳晓鹏,一枚正直纯洁善良的java程序员。 今天给大家分享一下官网java任务10深度思考中的知识点——如何使用spri...

IT修真院:初学者转行到互联网的聚集地 720

SpringCloud最新教程IDEA版笔记

springcloud教程,eureka、ribbon、feign、Hystrix、Zuul、Spring Cloud Config 分布式配置

weixin_41420295的博客 1030

从0开始搭建springcloud---Ribbon

本文讲解SpringCloud组件中的Ribbon组件,使用Ribbon调用用户微服务。如下图所示。 1. Ribbon简介 Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端的行为。为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多负载均衡算法,例如轮询、随机等。当然,我们也可为...

盲流子的博客 461

探秘SpringCloud系列《第四篇章:使用Ribbon负载均衡神技》

欢迎来到SpringCloud的江湖,在本章中,我们将向大家传授如何创建SpringCloud的父子项目架构。 知识无止境,故事有好坏,文章纯属虚构,欢迎大家吐槽。 行走江湖,没点伎俩傍身怎么能行。本章牵扯到的技术以及工具如下: Intellij Idea 2018.1 JDK 8 MAVEN 3.2.2 SpringBoot 1.5.13.RELEASE Spring-Cloud Edgware...

笑小枫 1307

[狂神说Java]SpringCloud笔记

[狂神说Java]SpringCloud笔记 1. 微服务概述 1.1 什么是微服务? **什么是微服务?**微服务(Microservice Architecture) 是近几年流行的一种架构思想,关于它的概念很难一言以蔽之。 究竟什么是微服务呢?我们在此引用ThoughtWorks 公司的首席科学家 Martin Fowler 于2014年提出的一段话: 原文:https://martinfowler.com/articles/microservices.html 汉化:https://www.cnbl

qq_35982131的博客 3967

Ribbon—SpringCloud默认的负载均衡

Ribbon—SpringCloud默认的负载均衡

creaylei的小花园 596
上一篇: Maven多模块项目讲解,以及在idea上如何使用SpringBoot框架搭建
下一篇: SpringCloud框架+Feign技术框架整合
听风动
博客等级 码龄8年 63粉丝 90原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

听风动

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

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

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

打赏作者

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

抵扣说明:

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

余额充值