社区文章|MOSN 路由框架详解

MOSN:基于延迟负载均衡算法实现更快速、更稳定的分布式网络 总结起来,MOSN作为一个基于延迟负载均衡算法的分布式网络代理,通过优化请求分发和选择最佳服务器的过程,实现了更快速、更稳定的分布式网络服务。MOSN利用延迟负载均衡算法实现了更快速的请求分发,并且通过一系列的优化措施,保证了系统的稳定性和可靠性。连接池中保存着与后端服务器的连接,当有新的请求到达时,MOSN会从连接池中选择一个可用的连接,并将请求发送到对应的服务器。通过上述的延迟负载均衡算法的实现,MOSN能够快速、准确地选择最佳的服务器,并将请求发送到该服务器,从而提高了系统的处理速度和性能。 阅读详情

8a39d1fbc83c63cf260560c96600c45b.gif

文|曹先胜

e签宝中间件开发

负责 e签宝中间件开发和维护

包括 MQ、网关、微服务、数据同步、全链路压测等

本文 4827 字 阅读 7 分钟

01 贡献者前言 

MOSN

「 开源就是在使用中,

共同成长的过程 」

从 2018 年学习 SOFAStack 的一些开源项目,到如今深入使用 MOSN,伴随着 SOFA 走到四周年。

因为兴趣也接触了不少的开源社区,唯独对 SOFA 社区的组件体验颇多, 例如 SOFAArk、SOFARPC、MOSN。长年混迹在钉钉群里提问题,都能得到及时回复,这对我们研究 MOSN 有很大的帮助。也因此通过 MOSN 的代码设计,学习到了很多关于 Sidecar 的设计理念。

我们使用 MOSN 的出发点是公司框架使用了很多的中间件,每个中间件有自己的依赖,这些依赖经常性的会发生冲突。虽然我们使用了类似 Spring Boot 的 Pom 管理机制,但升级框架过程中,如果有同学自行引入了 jar 包,就不可避免的会发生 jar 冲突。为了解决这个问题,我们调研了很多方案,最终认为 Service Mesh 是解决这个问题的一个比较合适的方案。

同时,也调研了一些其他的开源产品,经过内部讨论和各种取舍,我们选择了MOSN。

在使用 MOSN 时,因为要对接 Eureka,需要进行动态路由,而官网关于路由的文章不是很多。因此,在自己和烈元老师学习后,总结了这样一篇路由分享文章。

MOSN 作为网络边缘代理组件,路由功能是核心功能,本文将介绍 MOSN 路由如何使用,以及 MOSN 路由的一些高级使用技巧,欢迎大家留言指导。

02 路由基本设计 

MOSN

在 MOSN 的路由设计中,Cluster 和 Route 是高度关联的,说白了 Route 的配置,就是为了表达如何准确找到你想找到的 Cluster,另外一个 Cluster 可以有多个 Host 机器。

例如一个 Cluster 有 100 台机器,其中有 50 台是 v1 版本,50 台是 v2 版本,如何根据一些特定的规则,准确地把请求路由到 v1 版本或者 v2 版本呢?

再例如,我想根据 Header 里的某个值,再将这个值和“配置中心”里的某个值进行计算,才能找到 Cluster,那么我该如何配置呢?

- 首先,我们看最简单的路由设置。

b4bf07c44023ea418cb87155f5594a57.png

上图是一个简单的 Json 配置。其中,Cluster Manager 和 Routers 的配置是路由的关键。我们可以根据 Cluster Manager 配置多个 Cluster,每个 Cluster 配置多个 Host。

然后在 Routers 配置中,根据一些规则,告诉 MOSN 如何将请求路由到 Cluster 中。

如下图:

ddcc03b9d5088f5481d794aca4a72b60.png

此配置表示,现在有一个 Rouer 配置名为 Server_Router,有一个虚拟主机,可配置多个域名,这里匹配所有域名。

同时,这个域名有多个路由配置,这里暂且配置了一个路由配置:前缀匹配,只要是 / 开头的,就转发到 ServerCluster 里的 Host 中,也就是下面的 Cluster Manager 配置里的 ServerCluster。

这样,就实现了一个简单的 MOSN 路由的配置。

03 动态路由 Cluster 

MOSN

大部分情况下,如果我们的路由逻辑很简单,例如根据 Header 里的某个名字,找到对应的 Cluster,代码或者配置就是这么写的:

router := v2.Router{
    // header 匹配
    RouterConfig: v2.RouterConfig{
        Match: v2.RouterMatch{
            Headers: []v2.HeaderMatcher{
                // 这个 header 匹配, 就转发到 app.Name cluster.
                {
                    Name:  "X-service-id",
                    Value: app.Name,
                },
            },
        },
        // cluster 名称匹配.
        Route: v2.RouteAction{
            RouterActionConfig: v2.RouterActionConfig{
                ClusterName: app.Name,
            },
        },
    },
}
r.VirtualHosts[0].Routers = append(r.VirtualHosts[0].Routers, router)

上面代码的意思是如果 Header 里有 X-service-id 这个 kv,那么就能找到下面 RouteAction 对应的 Cluster 了。

那如果是更复杂的逻辑呢?

比如利用请求里的 Header 和“配置中心”的某个值进行计算,如何才能找到 Cluster呢?

此时,通过配置已经无法解决这个需求,因为这其中涉及到了计算逻辑,MOSN 通过动态配置可以支持该需求。

如下图配置:

7d076d75356f97ffee478e63e78bf949.png

我们设置了一个("Cluster_Variable": "My-ClusterVariable") 的 KV 配置。

同时,我们还需要在 StreamFilter 中,利用变量机制设置 key 为 “My-ClusterVariable” 的 Value ,这个 Value 就是计算出来的 Cluster 名称。

代码如下:

// 先注册这个 key 到变量表中。
func init() {
  variable.Register(variable.NewStringVariable("My-ClusterVariable", nil, nil, variable.DefaultStringSetter, 0))
}




var clusterMap = make(map[int]string, 0)


func (f *MyFilter) OnReceive(ctx context.Context, headers api.HeaderMap, buf buffer.IoBuffer, trailers api.HeaderMap) api.StreamFilterStatus {
  l := len(clusterMap)
    // 找 Cluster
  cluster := // 执行一些计算
    // 设置到上下文变量中。这个 key 必须和配置文件中保持一致。
  variable.SetString(ctx, "My-ClusterVariable", cluster)
  return api.StreamFilterContinue
}

上面的代码展示了如何基于变量机制动态的找到 Cluster,这种机制在面对复杂路由逻辑的场景时,能够解决你的问题。

04 MOSN Subset 

MOSN

如上面所述,我们经常有在一个集群里有多个版本,如何根据某些标签将请求路由到指定的版本呢? 

通常,我们会使用 Subset 方案,即“子集合”。可在一个 Cluster 里面,为每个应用打标。同时我们的路由也配置相关的配置(MOSN 称为 Metadata),实现较为复杂的路由。

MOSN 官方文档中,简单介绍了 Metadata 的使用。

下面让我们更详细的介绍 Subset 的使用:

e6f56f8a15d7d870f439dbd92adad7fa.png

上图中左边是 Cluster Host 配置,右边是 Router 配置。

这个路由配置的 Match 意思是:当请求者的 Header 里指定了 Name 和 Value,且其值匹配这个路由值 Service 和 Service.Green,那么该请求就被路由到了这个 Cluster_Subset 集群中。

这个集群可能有多个机器,那么需要这个机器的元数据和路由配置的元数据相同, 必须都是 Subset:Green,才能匹配上这个 Host,否则提示找不到(fall_back_policy 策略是 0 为前提)。

由此,我们解决了一个 Cluster 里面有多个版本的 Host 的路由问题。

再进一步,一个 Cluster 会有多个 Host,每个 Host 可能有不同的 Subset,这可能就需要很多的路由,如果都使用配置文件的方式写死,就比较麻烦。

MOSN 支持基于 stream filter 的方式,设置动态路由。

如下:

72838d5a3621aa0092dd2763ad8553a9.png

基于 MOSN 的变量机制,在请求级别的 VarRouterMeta 中设置 kv Metadata 组合,效果和上面配置文件的方式类似。

另外,如果路由配置中配置 Metadata,请求级别也配置了 Metadata。那么, MOSN 会将 2 个元数据进行合并,和 Host 进行匹配,这个逻辑在 pkg/proxy/downstream.go:1497 代码中有体现。

来个简单的例子,例如分组里指定机器调用:

1.请求时

可在 Header 里指定 IP,并在 VarRouterMeta 里设置这个 IP

2.Host 配置

可在 Metadata 里配置 IP kv,例如 IP:192.168.2.3

如下图:

3dd3e2f61e0b81db2bfeacbd729b5a62.png

这样就能匹配到指定机器了。

ps: 关于这个例子,我们其实也可以使用 MOSN 的 ORIGINAL_DST 机制,将 Cluster 的 Type 设置为 ORIGINAL_DST(MOSN 还支持 DNS 集群类型),然后配置 cluster.original_dst_lb_config.use_header = true。我们请求的时候,在 Header 里加入Host = {目标地址}, MOSN 就会根据这个指定的 Host Header 进行转发。

当然,MOSN 也可以自定义名字,不一定要叫 Host。

 来个复杂的例子:

假设一个场景,单个 Host 存在于多个分组,而请求时只能指定一个分组。

如下图:

ccdbe76d36aab684c66b22337f2dbc4a.png

我们现在有 2 台机器,共 3 个分组:AAA、BBB、CCC。每个机器都包含 AAA 分组。现在有 3 个请求,每个请求都是不同的分组。

此时,我们该如何配置元数据呢?

首先,本质上给机器加分组,其实就是打标,我们将元数据想象成 Tag 列表即可。

上面的代码展示了:

我们将多个分组标签,转换成 MOSN 可以认识的元数据 kv,每个标签对应一个固定的 value true(为什么设置为 true 呢?value 自身其实在 MOSN 的 SubsetLB 中是有含义的,即最终根据请中携带的 metadata 的值去匹配 cluster 中满足条件的 Subset host entry。但由于 metadata 是个 map, 而因为我们这个例子的特殊性,只能使用 key 自身做分组,所有的 value 都保持一样,本质上任何值都是可以的)。同时注意这些 Key 都要保存到 SubsetSelectors 中,否则 MOSN 无法识别。每次调用时,我们在 Filter 里从 Header 里面取出分组标签,然后设置进“上下文变量”中。

例如:

fcd07f534d731a1658879460ca2d757b.png

这样,我们就能够完成更加复杂的分组路由。

那 MOSN 是如何寻找 Subset 的呢?

代码如下:

9daadb3949473cc6a3854649725aa463.png

当执行 chooseHost 时,subsetLoadBalancer.findSubset 函数会根据当前请求的元数据,从 subSetLoadbalancer 里找出匹配的 Host List。

05 总结 

MOSN

我们先讲了基于简单的配置,来实现简单的 Router 和 Cluster 的配置文件路由。

再讲了可以基于 stream filter 的方式实现动态寻找 Cluster。同时 MOSN 支持 Subset,可以基于 Route 配置文件来进行路由和 Cluster Host 进行匹配,如果逻辑复杂,也可以基于 stream filter + varRouterMeta 变量的方式来动态寻找 Subset。

其实大部分情况下,我们用 Json 配置就能解决我们的路由问题。如果复杂的话,我们就用 stream filter + varRouterMeta / stream filter + cluster_variable 这两种动态机制解决我们的需求。

下面尝试用一张图来结束本文

c75358a32900ffefa007b2a0d61863cd.png

「参考资料」

[1] 《Router 配置 MOSN SubsetLB 开发文档 Load Balancer Subsets》

https://www.bookstack.cn/read/SOFAMesh-zh/mosn-develop-SubsetLB.md

[2] 《Metadata 的使用》

https://mosn.io/docs/configuration/custom/#metadata

如果您对杭州 e 签宝(智能电子合同)上述领域感兴趣

我们期待您的加入

联系方式:cxstateis0@gmail.com

   本周推荐阅读  

9d2267a9ee2932fd092807c93d82d586.png

SOFAChannel#26 解读 BabaSSL :项目概况和最新进展 |直播预告

23619d96a0373c64ac5f86fd4fe29f45.png

HAVE FUN | SOFARegistry 源码解析

d6b248c88f1d2a5fcec40f432eecfc96.png

BabaSSL:支持半同态加密算法 EC-ElGamal

58ec62aa2b4b30655414a49956200fb6.png

恭喜 吕冰洁 成为 SOFAStack committer!

8fcf61349179b5b8444badd2d13c4aa3.png

深入了解MOSN云原生网络数据平面源码 v0.21.0 本文还有配套的精品资源,点击获取 简介:MOSN(Mesh Over Service Network)是一个面向服务网格的数据平面,用于提供灵活的服务间通信解决方案。本源码解析文档详细介绍了v0.21.0版本的MOSN,它是一个高度可扩展、高性能的云原生网络代理。文档涵盖了MOSN的设计理念、核心架构、服务发现机制、负载均衡策略、安全特性,以及如何阅读源码和参与社区贡献。此... 阅读详情

相关推荐

手把手教你用Chrome DevTools逆向分析抖音a_bogus参数(附完整日志插桩方法)

本文详细介绍了如何使用Chrome DevTools逆向分析抖音a_bogus参数的生成逻辑,包括XHR断点定位、日志插桩追踪和加密核心逻辑解析。通过实战案例,帮助开发者掌握逆向工程技巧,应对抖音接口的动态加密变化,特别适合研究dy接口和a_bogus参数的技术人员。

weixin_27741699的博客 787

从一次 RPC 请求,探索 MOSN 的工作流程

王程铭(呈铭)蚂蚁集团技术工程师,Apache Committer专注 RPC、Service Mesh 和云原生等领域。本文7368 字,预计阅读15 分钟前言MOSN(Modular Open Smart Network)是一款主要使用 Go 语言开发的云原生网络代理平台,由蚂蚁集团开源并经过了双十一大促几十万容器的生产级验证。MOSN 为服务提供多协议、模块化、智能化、安全的代理...

金融级分布式架构 1763

粒子滤波在基于误差状态量的INS/GNSS组合导航中的使用技巧-On Particle Filter based Error-State INS/GNSS Intergrated Navigation

本文面向以15维惯导(INS)误差为状态量,3维位置误差为量测量的INS/GNSS组合导航系统,​在西工大严恭敏老师的开源工具箱中PF相关库函数基础上实现基于粒子滤波(PF)的惯导误差状态量的递推估计,设计了粒子重置环节并强调了其在本特定场景下的重要性。

I33D33I的博客 1742

MOSN 反向通道详解

目前例如 SuperEdge、Yurttunnel 等业界知名云边协同开源框架,对于云边通信的实现方案都是基于反向通道。本文将着重介绍 MOSN 之上的反向通道运作流程和原理。

金融级分布式架构 586

深信服PT1-AF实验考试

深信服PT1-AF实验考试实验练习可以去深信服的在线实验平台(链接如下):深信服在线实验平台 (sangfor.com.cn)实验考试其实就是把所有的每一部分实验综合了起来以下内容仅做参考,不确保一样。

m0_72019240的博客 7116

Unity3d实现红外热成像效果

1.将需要在红外图像中高亮的物体设置到图层PostProcessing。 2.新建一个相机CameraHighLight,设置其Culling Mask为PostProcessing,也就是在这个相机中只有PostProcessing图层的物体可见。 3.新建一个RenderTexture,命名为HightLightRt,将CameraHighLight的Target Texture设HightLightRt。 4.新建一个相机Camera2,这个相机用于显示其他物体。 接下来将CameraHigh

zouxin_88的专栏 8327

MOSN 多协议扩展开发实践

Service Mesh 是当今云原生的关键部分,蚂蚁已经在生产环境完成了大规模的落地,但是业界整体 Service Mesh 改造程度还不高。其中平稳的进行 Mesh 化改造是可以对已上...

金融级分布式架构 462

Android SDK安装教程(超详细),从零基础入门到精通,从这篇开始_android sdk下载安装

Android SDK安装教程(超详细),从零基础入门到精通,从这篇开始_android sdk下载安装

Jinmindong 5014

社区文章|MOSN 构建 Subset 优化思路分享

MOSN 使用了 Subset 算法作为其标签匹配路由负载均衡的方式。本文主要介绍 Subset 的原理,包括了在超大规模集群下 MOSN 的 Subset 所遇到的一些性能瓶颈与采用的优化算法。

金融级分布式架构 253

FPGA新手必看:Create HDL Wrapper和Generating Output Products到底该先用哪个?

本文深入解析了FPGA设计中Create HDL Wrapper与Generating Output Products的正确使用顺序,帮助新手避免常见错误。详细介绍了两者的功能差异、执行顺序的底层逻辑以及工程管理的最佳实践,特别适合使用Vivado进行FPGA开发的初学者。

xk7n92h3p5m的博客 1065

CODESYS做Modbus TCP主站踩坑记:从IP配置到数据映射的完整避坑指南

本文详细记录了在CODESYS中配置Modbus TCP主站的全过程,从IP配置到数据映射的常见问题及解决方案。重点解析了网络适配器选择、Slave ID误解、地址偏移陷阱等关键问题,并提供了实用的调试技巧和性能优化建议,帮助工业通信开发者高效避坑。

weixin_30642561的博客 624

开启云原生 MOSN 新篇章 — 融合 Envoy 和 GoLang 生态

注:本文是王发康(毅松)在 2021 GopherChina 上演讲的文字稿,相关分享 PPT 可自行到 MOSN meetup 下载。MOSN meetup 地址:https://g...

Go中国 1128

Simulink开发项1000例实战专栏--实例38:基于Simulink的周波变换器(Cycloconverter)

需求分析周波变换器(Cycloconverter),也称为频率变换器或直接变频器,是一种将输入的固定频率交流电直接转换为不同频率的交流电的电力电子设备。它广泛应用于工业领域,如大功率电机驱动、风力发电、船舶推进系统等场合。与传统的间接变频器(如交-直-交变频器)相比,周波变换器具有更高的效率和更简单的结构,适用于需要低频输出的应用场景。

xiaoheshang_123的博客 334

基于 MOSN 和 Istio Service Mesh 的服务治理实践

Service Mesh Webinar 是由 ServiceMesher 社区和 CNCF 联合发起的线上直播活动,活动将不定期举行,为大家带来 Service Mesh 领域的知识和...

金融级分布式架构 773

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

lwip-2.0.3

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

MOSN 发布 v1.0 版本!

MOSN(Modular Open Smart Network)是一款主要使用 Go 语言开发的云原生网络代理平台,由蚂蚁集团开源并经过双 11 大促几十万容器的生产级验证。经过 4 年的蓬勃发展,在 11 位 Commiter、100 多位Contributor 和整个社区的共同努力下,经历 27 个小版本的迭代...现在 MOSN 1.0 版本正式发布了!一个足够...

金融级分布式架构 423

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

MOSN 文档使用指南

2018 年,MOSN 开源以来,随着各种需求的迭代、更新,逐渐导致官网文档存在比较多缺失,新功能的实现未能及时更新,原有功能不断重构、优化调整,导致文档描述也不那么准确了。MOSN 在不断开源,影响力也在增加,拥有更多用户。很多新加入的社区同学,使用时发现文档与项目不匹配。为了配合 MOSN1.0 的发布,打造成熟稳定的社区生态,降低新用户的学习成本,让 MOSN 更易...

金融级分布式架构 508

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

MOSN 子项目 Layotto:开启服务网格+应用运行时新篇章

作者简介:马振军,花名古今,在基础架构领域耕耘多年,对 Service Mesh 有深度实践经验,目前在蚂蚁集团中间件团队负责 MOSN、Layotto 等项目的开发工作。Layotto...

金融级分布式架构 824

SOFA Weekly |社区插话小剧场、本周 Contributor、QA 整理

SOFA WEEKLY | 每周精选筛选每周精华问答,同步开源进展欢迎留言互动~SOFAStack(ScalableOpenFinancialArchitecture Stack...

金融级分布式架构 248

SOFA Weekly|SOFAArk 社区会议预告、Layotto 社区会议回顾、社区本周贡献

SOFA WEEKLY | 每周精选筛选每周精华问答,同步开源进展欢迎留言互动~SOFAStack(ScalableOpenFinancialArchitecture Stack)是蚂蚁集团自主研发的金融级云原生架构,包含了构建金融级云原生架构所需的各个组件,包括微服务研发框架,RPC 框架,服务注册中心,分布式定时任务,限流/熔断框架,动态配置推送,分布式链路追踪,Metrics 监控...

金融级分布式架构 991

SOFA Weekly|Layotto 会议预告、社区本周贡献 & issue 精选

SOFA WEEKLY | 每周精选筛选每周精华问答,同步开源进展欢迎留言互动~SOFAStack(ScalableOpenFinancialArchitecture Stack)是蚂蚁集团自主研发的金融级云原生架构,包含了构建金融级云原生架构所需的各个组件,包括微服务研发框架,RPC 框架,服务注册中心,分布式定时任务,限流/熔断框架,动态配置推送,分布式链路追踪,Metrics 监控...

金融级分布式架构 386

蚂蚁金服 API Gateway Mesh 思考与实践

本文整理自蚂蚁金服高级技术专家贾岛在12月28日Service Mesh Meetup杭州站现场分享。 MOSN 完成孵化, 启用独立 Group 2020.2019.12.18,MOSN 项目负责人、蚂蚁金服应用网络组负责人涵畅宣布 MOSN 完成从 SOFAStack 的孵化,将启用独立 Group 进行后续运作,欢迎大家共同建设社区。 MOSN 是一款使用 Go 语言...

weixin_42121754的博客 1338

SOFA Weekly|Meetup 广州站参会指南、本周 QA、本周 Contributor

SOFA WEEKLY | 每周精选筛选每周精华问答,同步开源进展欢迎留言互动~SOFAStack(ScalableOpenFinancialArchitecture Stack)是蚂蚁集团自主研发的金融级云原生架构,包含了构建金融级云原生架构所需的各个组件,包括微服务研发框架,RPC 框架,服务注册中心,分布式定时任务,限流/熔断框架,动态配置推送,分布式链路...

金融级分布式架构 200

SOFARegistry 源码|数据分片之核心-路由表 SlotTable 剖析

文|程征征(花名:泽睿)高德软件开发工程师负责高德新场景业务探索开发与维护对领域驱动、网络通讯、数据一致性有一定的研究与实践本文 23009字 阅读 25分钟“第一次关注 SOFA 社区是在开发一个故障剔除组件时,发现 SOFARPC 中也有类似的组件。在 SOFARPC 的设计中,入口采用了一种无缝插入的设计方式,使得在不破坏开放封闭原则前提下,引入单机故障剔除能...

金融级分布式架构 437

服务网格框架初探:Istio、Linkerd和SOFAmesh

导读 2018年,Service Mesh在国内大热,有多家公司推出自己的Service Mesh产品和方案。本篇文章结合Service Mesh领域内关注度较高的几种开源方案,从架构层面出发,进行初步解读。 服务网格(ServiceMesh)是什么? Willian Morgan——Bouyant CEO给出的ServiceMesh定义:服务网格是一个用于处理服务间通信的基础设施层...

一个天秤座的架构师 2万+

istio sidecar流量接管_服务网格框架初探:Istio、Linkerd和SOFAmesh

点击“博云技术社区”,获取最新技术分享导读2018年,Service Mesh在国内大热,有多家公司推出自己的Service Mesh产品和方案。本篇文章结合Service Mesh领域内关注度较高的几种开源方案,从架构层面出发,进行初步解读。服务网格(ServiceMesh)是什么?Willian Morgan——Bouyant CEO给出的ServiceMesh定义:服务网...

weixin_39616071的博客 150
上一篇: 【直播倒计时 3 天】SOFAChannel#26 解读 BabaSSL :项目概况和最新进展
下一篇: HAVE FUN | 源码解析活动进展
SOFAStack
博客等级 码龄7年 747粉丝 389原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值