gateway网关

网关 GateWay 的使用详解、路由、过滤器、跨域配置! 有时候SpringCloudGateWay提供的过滤器工厂不能满足自己的要求。可能有时候需要在过滤时做一些其它的逻辑操作。那么这时候可以选择使用java代码自定义全局过滤器。@Component@Override// 1.获取请求参数//1.这里的request并不是servlet中的request//2.返回值是一个多键的map集合、也就是说这个map集合的键可以重复// 2.获取userName参数// 3.校验// 放行// 4.拦截// 4.1.禁止访问,设置状态码。 阅读详情

1.概念

Gateway网关是我们服务的守门神,所有微服务的统一入口。

网关的核心功能特性:路由转发,负载均衡,限流,权限控制

2.使用

1.引入依赖

<!--        gateway 依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
<!--        nacos 注册中心-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

2.application.yml文件

server:
  port: 9000


spring:
  application:
    name: service-gateway

  ###nacos注册中心
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
#    gateway:
#  #      #路由规则
#        routes:
#          - id: gateway-product           #路由id,唯一
#  #          uri: http://localhost:8081/  #目标uri,路由到微服务的地址
#            uri: lb://service-product     # 根据服务名称进行路由    lb:loadbalance  负载均衡
#            predicates:                   # 采用断言的判断条件
#              - Path=/product/**          # 匹配对应的url请求,将匹配到的请求追加到目标uri的后面   访问/product/**   实际上访问的是 service-product/product/**
#            filters:                      # 网关过滤器
#              - name: RequestRateLimiter   ##内置过滤器,还可以自定义过滤器和全局过滤器
#                args:
##                  URI限流        超过这个速率会报429错误
#                  redis-rate-limiter.replenishRate: 1  # 令牌桶每秒填充平均速率
#                  redis-rate-limiter.burstCapacity: 2  # 令牌桶的上限
#                  key-resolver: "#{@pathKeyResolver}"  # 使用SpEL表达式从Spring容器中获取Bean对象


######第一种方式   gateway 动态路由转发(推荐使用,不用一个服务一个服务地配)
    ######   访问的时候加上service名称   eg:localhost:9000/product/save ->
    #                                    localhost:9000/service-product/product/save
    gateway:
      discovery:
        locator:
          ####开启与服务注册中心进行结合,通过serviceid 转发到具体的服务实例
          enabled: true                 #开启基于服务发现的路由规则
          lower-case-service-id: true   #是否将服务名称转小写


    ############################################################################
    #### 第二种方式   gateway网关     需要一个服务一个服务地配置
#    gateway:
#      #路由规则
#      routes:
#        - id: gateway-product   #路由id,唯一
##          uri: http://localhost:8081/  #目标uri,路由到微服务的地址
#          uri: lb://service-product  ###根据服务名称进行路由    lb:loadbalance  负载均衡
#
#          predicates:          # 采用断言的判断条件
#            - Path=/product/**  #  匹配对应的url请求,将匹配到的请求追加到目标uri之后
#            - Query=token      #匹配请求参数,请求的参数中带token的就给你路由
#            - Method=GET       #匹配任意get请求
#            - After= 具体时间   #在这个时间之后的请求可以路由 同理还有Before
#            - RemoteAddr=127.0.0.1/0  #匹配远程地址请求是RemoteAddr的请求
#            - Header=Request-Id    # 匹配请求头包含Request-Id 的请求
#  gateway  工作原理
#  用户访问带url里面带有  /product/  就把请求路由到http://localhost:8081/
#  再把后面的path添加上拼接成最终的url访问路径进行访问
#  最终访问路径是  http://localhost:8081/product/**

3.配置过滤器
gateway内置过滤器有31个,常用的有
AddRequestHeader 给当前请求添加一个请求头
RemoveRequestHeader 移除请求中的一个请求头
AddResponseHeader 给响应结果中添加一个响应头
RemoveResponseHeader 从响应结果中移除有一个响应头
RequestRateLimiter 限制请求的流量
也可以自己实现GatewayFilter接口自定义过滤器(用的不多),然后把该过滤器添加到配置类里边,例如:

public class CustomGatewayFilter implements GatewayFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //TODO 这里面写业务逻辑
        System.out.println("自定义网关过滤器被执行");
        return chain.filter(exchange);   //继续往下执行
    }

    /**
     * 如果有多个过滤器  ,此方法返回的数值越小,执行优先级越高
     * @return
     */
    @Override
    public int getOrder() {
        return 0;
    }
}
@Configuration
public class GatewayRoutesConfiguration {

    @Bean
    public RouteLocator routeLocator(RouteLocatorBuilder builder) {
        return builder.routes().route(r -> r.
                //断言,判断条件
                path("/product/**")
                //目标uri,路由到微服务的地址
                .uri("lb://service-product")
                //注册自定义网关过滤器
                .filters(new CustomGatewayFilter())
                //路由id,唯一
                .id("product-service"))
                .build();



    }
}

使用全局过滤器,实现GlobalFilter接口,可以拿到request里面的参数用于权限判断

@Component
public class CustomGlobalFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("执行全局过滤器");
        ServerHttpRequest request = exchange.getRequest();

        //TODO  业务逻辑
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return -1;
    }
}

3.gateway结合sentinel限流

1.增加依赖

<!--        sentinel-gateway 依赖-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
        </dependency>

2.application.yml文件

server:
  port: 9001

spring:
  application:
    name: gateway-sentinel
  cloud:
    sentinel:
      filter:
        enabled: false  #不对网关进行限流
    gateway:
      #与服务注册中心配合使用,通过service  id进行路由转发
      discovery:
        locator:
          lower-case-service-id: true    #将服务名称转小写
          enabled: true
      #路由规则
      routes:
        - id: service-product
          uri: lb://service-product
          predicates:
            - Path=/product/**
        - id: service-order
          uri: lb://service-order
          predicates:
            - Path=/order/**
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

添加配置类 (分组限流)并自定义限流异常处理器

@Configuration
public class GatewayConfiguration {

    private final List<ViewResolver> viewResolvers;
    private final ServerCodecConfigurer serverCodecConfigurer;

    public GatewayConfiguration(ObjectProvider<List<ViewResolver>> viewResolversProvider,
                                ServerCodecConfigurer serverCodecConfigurer) {
        this.viewResolvers = viewResolversProvider.getIfAvailable(Collections::emptyList);
        this.serverCodecConfigurer = serverCodecConfigurer;
    }

    /**
     * 限流异常处理器
     * @return
     */
    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler() {
        // Register the block exception handler for Spring Cloud Gateway.
        return new SentinelGatewayBlockExceptionHandler(viewResolvers, serverCodecConfigurer);
    }

    /**
     * 限流过滤器
     * @return
     */
    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public GlobalFilter sentinelGatewayFilter() {
        // By default the order is HIGHEST_PRECEDENCE
        return new SentinelGatewayFilter();
    }

    /**
     * 容器初始化时候执行该方法
     */
    @PostConstruct
    public void doInit() {
        //加载网关限流规则
        initGatewayRules();
        //加载自定义限流异常处理器
        initBlockHandler();
    }


    /**
     * 网关限流规则
     */
    private void initGatewayRules() {
        HashSet<GatewayFlowRule> rules = new HashSet<GatewayFlowRule>();

        /**
         * resource :资源名称 ,可以是网关中的routes名称/id,也可以时自定义API分组名称
         * count  :限流阈值
         * setIntervalSec:统计时间窗口,单位是秒
         *
         * 60秒内只能访问3次   超过3次就会报 Blocked by Sentinel: ParamFlowException异常
         */

//        rules.add(new GatewayFlowRule("service-product")
//                .setCount(3)
//                .setIntervalSec(60));

        //添加分组限流规则,和 initCustomizedApis()方法一起使用, 不同api限流规则不同。
        rules.add(new GatewayFlowRule("product-api")
                .setCount(3)
                .setIntervalSec(60));
        rules.add(new GatewayFlowRule("order-api")
                .setCount(5)
                .setIntervalSec(60));
        GatewayRuleManager.loadRules(rules);
        initCustomizedApis();
    }

    /**
     * 自定义限流异常处理器    替代 Blocked by Sentinel: ParamFlowException异常
     */
    private void initBlockHandler() {
        BlockRequestHandler blockRequestHandler = new BlockRequestHandler() {
            @Override
            public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
                Map<String, String> map = new HashMap<>();

                map.put("code", String.valueOf(HttpStatus.TOO_MANY_REQUESTS.value()));
                map.put("message", HttpStatus.TOO_MANY_REQUESTS.getReasonPhrase());
                return ServerResponse.status(HttpStatus.TOO_MANY_REQUESTS)
                        .contentType(MediaType.APPLICATION_JSON)
                        .body(BodyInserters.fromValue(map));
            }
        };
        //加载自定义限流异常处理器
        GatewayCallbackManager.setBlockHandler(blockRequestHandler);
    }

    /**
     * 自定义API分组限流  不同的组限流规则不同
     */
    private void initCustomizedApis(){
        Set<ApiDefinition> definitions = new HashSet<>();
        //product-api组
        ApiDefinition api1 = new ApiDefinition("product-api")
                .setPredicateItems(new HashSet<ApiPredicateItem>(){{
                    add(new ApiPathPredicateItem().setPattern("/service-product/product/**")   //对product下所有路径进行限流
                            .setMatchStrategy(SentinelGatewayConstants.URL_MATCH_STRATEGY_PREFIX));
                }});
        //order-api组
        ApiDefinition api2 = new ApiDefinition("order-api")
                .setPredicateItems(new HashSet<ApiPredicateItem>(){{
                    add(new ApiPathPredicateItem().setPattern("/service-order/order/index"));  // 对/order/index/进行限流
                }});
        definitions.add(api1);
        definitions.add(api2);
        //加载限流分组
        GatewayApiDefinitionManager.loadApiDefinitions(definitions);
    }
}
SpringCloud——GateWay网关(详解+案例) 目录 一、相关概念 1、网关概念 2、网关作用 3、网关架构图 4、网关三大核心 二、案例 1、案例说明 2、搭建GateWay网关9527服务 (1)创建maven工程 (2)导入依赖 (3)配置application.yml文件 (4)创建主启动类 3、搭建服务提供者Provider9001 (1)创建maven工程 (2)导入依赖 (3)配置application.yml文件 (4)创建主启动类 (5)创建controller 4、搭建Eureka7..... 阅读详情

相关推荐

GateWay 网关服务

2.2.11jaxb-apijaxb-impl2.2.11activation1.1.1引入Jaxb,结束Actuator可以帮助你监控和管理Spring Boot应用热部署true链路追踪spring cloud依赖版本管理pomimport。

2401_86400079的博客 2116

Gateway网关简介以及使用

Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。

怪咖@的博客 2万+

【Thingsboard】Gateway 开源网关

另外网关和TB之间会断线重连,断线期间的设备数据是先持久化在网关层,重连后再恢复上传。网关1上传设备A:{"sub_client_1184274":{"type":"light","xxx":42},"sub_client_1193865":{"type":"switch","xxx":42}}网关2上传设备A:{"sub_client_1184274":{"type":"light","xxx":43},"sub_client_1193865":{"type":"switch","xxx":43}}

这个人很懒什么都没有~ 1940

【Java】微服务——Gateway网关

过滤器的作用是什么?① 对路由的请求或响应做加工处理,比如添加请求头② 配置在路由下的过滤器只对当前路由的请求生效defaultFilters的作用是什么?① 对所有路由都生效的过滤器需求:定义全局过滤器,拦截请求,判断请求的参数是否满足下面条件:参数中是否有authorization,authorization参数值是否为admin如果同时满足则放行,否则拦截实现:import org。

qq_59708493的博客 5102

深入解析iDP3的Learning模块:从数据集构建到3D动作预测的代码实现

本文深入解析iDP3框架的Learning模块,从数据集构建到3D动作预测的完整代码实现。通过扩散模型实现视觉输入到动作序列的端到端预测,详细介绍数据采集、增强策略、模型架构及训练技巧,帮助开发者掌握3D动作预测策略的核心技术。

k0l1m2n3o的博客 307

提高机器学习模型准确率的八大方法

原文连接:http://www.techweb.com.cn/network/system/2016-01-27/2269274.shtml 此文仅是一个小品文,详细理论请读论文,参考书籍。 前言:我的概述 机器学习面对的是一个受限有穷空间 到 一个扩大的有穷空间 的泛化问题。若假设空间足以覆盖真实的数据空间,机器学习方法可以弃之不...

alppkk4545的博客 1301

SpringCloud+Vue在线教育网站——整合Gateway网关

API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题:

m0_46275020的博客 7431

脑电分析中的频谱特征提取 —— 从理论到实践

本文系统介绍了脑电信号(EEG)频谱特征提取方法及其应用。EEG信号通过频谱分析可分为Delta、Theta、Alpha、Beta和Gamma等具有明确生理意义的频段。文章详细讲解了功率谱密度、频带功率、相对功率、频谱熵等关键特征的计算方法,并提供了Python实现示例,包括模拟数据和真实CHB-MIT癫痫数据集的处理流程。这些频谱特征在脑机接口、情绪识别、疲劳监测和癫痫检测等领域具有重要应用价值。文章强调频谱特征结合时域和非线性特征可提升分析效果,为EEG研究提供了实用指导。

qq_32516809的博客 1441

JAVA中的GateWay网关的作用以及使用场景

在Java中,跨域(Cross-Origin)指的是在浏览器中,当一个网页(或者一个Web应用)从一个域名(或者端口、协议)发送请求到另一个域名(或者端口、协议)时,如果目标域名与源域名不同,就会发生跨域请求。

m0_62458145的博客 1000

IBM System x3650 M5 IMM配置

1、IMM基本介绍 IMM,全称是Intel Mobile Module是IBM服务器上的集成管理模块,该模块是独立于服务器系统,可以通过一个单独的IP地址,使用Web和虚拟端口方式直接启动、停止和管理远程服务器,即使主板、处理器或者内存故障导致主机无法启动,也依然可以远程管理服务器,可以远程直接操作启动画面和服务器工作界面。 2、IP地址配置 2.1 通过Web方式修改IP地址 IBM服...

血饮渊虹的博客 4万+

嵌入式Linux网络调试踩坑记:YT8531/YT8521 PHY驱动移植与设备树配置实战

本文深入解析嵌入式Linux系统中YT8531/YT8521 PHY驱动移植与设备树配置的实战经验。从网络不通的常见现象入手,详细介绍了驱动移植关键点、设备树配置详解及常见问题排查技巧,帮助开发者快速解决RGMII接口调试难题,提升嵌入式网络开发效率。

weixin_42525328的博客 444

nginx网关与gateway网关的区别

经常遇到别人问我,有了nginx做网关,为啥还要用到gateway呢 首先这两种网关的定义不一样 用户访问的总入口,也就是前端页面的容器,流量网关 gateway的定义是针对每一个业务微服务来得,属于业务网关 借鉴一个图 对于具体的后端业务应用或者是服务和业务有一定关联性的策略网关就是上图左边的架构模型——业务网关。 业务网关针对具体的业务需要提供特定的流控策略、缓存策略、鉴权认证策略等等。 与业务网关相反,定义全局性的、跟具体的后端业务应用和服务完全无关的策略网关就是上图右边所示的架构模型

z_ssyy的博客 6万+

Synthesia技术浅析(四):自然语言处理

Synthesia 的自然语言处理(NLP)模块是其核心技术之一,涵盖了文本转语音(TTS)、情感分析以及多语言支持等多个方面。

m0_75253143的博客 1166

网关Gateway的介绍与使用

本文介绍了微服务中Gateway的使用,正在学习Gateway或者准备学习的大佬看过来哟

小威的博客 1万+

手把手教你完成YOLOv11分类识别界面搭建,使用Qt6设计YOLOv11分类识别系统,前台系统+后台管理系统开发实战,全网最详细教程

本项目结合YOLOv11分类识别算法和PySide6框架,开发了一套图形化分类识别系统。系统支持图片、视频和摄像头实时分类检测,并具备完善的用户管理功能,包括登录验证、个人信息修改等模块。最新版本新增了管理员后台管理系统,包含用户管理、权限控制等功能。系统采用MySQL数据库存储用户数据,界面设计采用QtDesigner完成,实现了高效的目标分类与友好的交互体验。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1048

Gateway - 入门教程

网关作为微服务架构中的核心组件,承担请求转发、负载均衡、权限控制等职能。Spring Cloud Gateway基于路由、断言和过滤器实现高效服务管理,通过Nacos注册中心动态发现服务,支持路径匹配与协议转换。项目中配置路由规则并启用服务发现,可统一对外暴露接口,提升安全性与可维护性。结合跨域配置与Feign调用,实现前后端分离下的灵活通信与统一管控。

Hvitur的博客 6966

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Gateway网关限流

类别特点缺点计数器算法1.结构简单-计数器;2.临界问题;出现临界问题漏斗算法1.固定速率处理请求;2.保护服务;无法处理突发流量令牌桶算法1.固定速率生产令牌;2.设置容量大小;3.处理突发流量;容量设置不合理,可能压垮服务配置中key-resolver: “#{@ipKeyResolver}”,其中ipKeyResolver对应的是下面方法的名称/*** 定义KeyResolver的bean对象/*** 基于url。

人生就像一场戏 4496

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Gateway网关

在这里,请求会经过一系列的过滤器,这些过滤器组成了过滤器链(Filter Chain)。过滤器可以在请求发送到后端服务之前(“pre”类型)或之后(“post”类型)执行特定的业务逻辑。添加过滤器配置, 配置文件中指定的自定义过滤器名称为自定义过滤器类的前缀,即去掉 GatewayFilterFactory后缀部分的名称。在这个阶段,系统会根据请求的URL、请求头、参数等信息,使用一组断言(Predicate)来判断该请求符合哪个路由规则。经过过滤器链处理后的请求会被转发到实际的后端服务。

m0_74910651的博客 799

网关Gateway

在微服务项目中,没有引入网关时,项目架构如下:引入网关后,架构如下:引入网关后,有如下优势:1、客户端请求经过网关向后台统一分发请求,后台微服务的增加、减少对客户端影响较小2、客户端请求到每个后台微服务,可以经过网关实现统一的鉴权认证3、网关可以对后台微服务做限流管理。

xujinwei_gingko的专栏 1139

SpringCloud-Gateway网关的使用

本文介绍如何再 SpringCloud 项目中引入 Gateway 网关并完成网关服务的调用。Gateway 网关是一个在微服务架构中起到入口和路由控制的关键组件。它负责处理客户端请求,进行路由决策,并将请求转发到相应的微服务。Gateway 网关还可以实现负载均衡、安全认证、日志记录等功能,集中管理服务间的通信,提升整体系统的可维护性和安全性。通过 Gateway 网关,可以实现统一的访问点,简化客户端与后端微服务之间的交互,同时也能够更灵活地进行流量控制和监控。

踏雨歌青春,诗酒趁年华 5315

Gateway服务网关

1.为什么需要网关?在微服务中,各个模块之间的调用,也可以称其为远程调用!但是,如果是外部(用户)对微服务进行访问时,发的请求能不加处理的直接访问微服务吗?答案肯定是不能的!!!例如,不是所有的业务都是对外公开的,如果“放任”任何用户都能对其进行访问,那么这是不安全的!所以,需要一个安全组件——网关!Gateway网关是我们服务的守门神,所有微服务的统一入口。2.图解微服务架构3.Zuul与Gateway对比在SpringCloud中网关的实现有两种--Zuul和Gateway。

2201_75345199的博客 2207

188. Gateway 网关配置

摘要:API网关是微服务架构中的核心组件,作为统一入口处理客户端请求。Spring Cloud Gateway基于Reactor模型,提供动态路由、负载均衡、请求过滤等核心功能,支持协议转换、安全认证和流量控制。网关与负载均衡器的主要区别在于,网关侧重请求处理与协议转换,而负载均衡器专注于流量分配。典型配置示例展示路由规则和限流设置,应用场景包括微服务聚合、灰度发布等。性能优化建议使用异步I/O和缓存机制,监控关键指标如请求成功率和响应时间。

weixin_43484713的博客 2765

形象的讲解什么是Gateway网关

要弄懂Gateway网关,我们需要知道什么是网关。在web应用服务中会涉及很多的接口调用,而且服务器的种类也有很多,为了更好的管理这些接口的调用规则,我们需要建立一个网络请求进入的统一入口。Spring Cloud Gateway是网关的一个实现方式,它是基于Spring+SpringBoot进行开发的。Gateway的组成主要是两大部分Predicate(断言)Filter(过滤器)

HYY的博客 1376

Gateway 网关

Spring Cloud Gateway 作为 Spring Cloud框架的第二代网关,在功能上要比 Zuul更加的强大,性能也更好。随着 Spring Cloud的版本迭代,Spring Cloud官方有打算弃用 Zuul的意思。在笔者调用了 Spring Cloud Gateway的使用和功能上,Spring Cloud Gateway替换掉 Zuul的成本上是非常低的,几乎可以无缝切换。Spring Cloud Gateway几乎包含了 Zuul的所有功能。 一、网关定义 API 网关是一..

m0_37235955的博客 2024
上一篇: m1芯片使用sass版本问题
下一篇: nacos和openfeign使用
livel_java
博客等级 码龄9年 2916粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值