分布式系统架构设计:基于Spring Cloud与Kubernetes的实践

Spring Cloud Alibaba与K8s的集成 Spring Cloud Alibaba 与 K8s 的集成,就像让智能工厂接入全球化物流网——前者专注业务精细化管理,后者提供弹性基础设施。下一篇文章我们将实战灰度发布,像在游乐场同时开放新旧过山车,逐步切换流量。如果你在容器化过程中经历过“水土不服”,这种组合方案就是专治不服的“调和剂”。技术融合的魅力,在于让每个组件做自己最擅长的事。 阅读详情

分布式系统架构设计:基于Spring Cloud与Kubernetes的实践

问题背景

在金融行业数字化转型中,支付系统面临高并发、高可用和快速迭代的需求。传统的单体架构难以应对这些挑战,尤其是在业务量激增时,系统扩展性和稳定性成为瓶颈。

架构设计

通过Spring Cloud实现微服务化,结合Kubernetes进行容器化部署,构建一个高可用、高性能的分布式系统架构。

技术选型

  • 核心框架:Spring Boot、Spring Cloud
  • 服务治理:Nacos
  • 容器化:Kubernetes、Docker
  • 负载均衡:Nginx

实现细节

@SpringBootApplication
@EnableDiscoveryClient
public class PaymentServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(PaymentServiceApplication.class, args);
    }
}

性能优化

  • 使用Redis缓存热点数据
  • 通过Kubernetes的HPA实现自动扩缩容

最佳实践

  • 服务拆分粒度适中
  • 监控告警系统完善

未来展望

  • 服务网格(Service Mesh)的引入
  • 云原生技术的进一步应用
【Kubernetes的SpringCloud最佳实践】Spring Cloud netflix 能否被K8s资源完全替代? Spring Cloud netflix能否被K8s替代最佳实践? 阅读详情

相关推荐

Spring Cloud系列教程 | 第十四篇:Spring Cloud与Kubernetes的集成

Spring Cloud与Kubernetes的集成      Spring Cloud提供了专门的spring-cloud-kubernetes项目与k8s集成,尽管k8s提供了服务注册和发现等功能与Spring cloud是竞争的,甚至k8s加装服务网格Istio以后超过Spring cloud,但是在Spring cloud提供与代

qq_43253123的博客 3236

spring-cloud-kubernetes与k8s的configmap

spring-cloud-kubernetes-config是spring-cloud-kubernetes框架下的一个库,用于将kubernetes的configmap作为配置文件,提供给springboot应用

程序员欣宸的博客 8653

云原生三剑客:Kubernetes + Docker + Spring Cloud 实战指南与深度整合

K8s 根据 CPU/内存或自定义指标 (HPA) 自动扩缩容微服务实例。容器共享 OS 内核,比虚拟机更轻量;K8s 优化节点资源分配。K8s 自动重启失败容器、替换不健康节点、滚动更新实现零停机。Docker 镜像保障从开发到生产环境完全一致。K8s 声明式 API 统一管理所有微服务生命周期。CNCF 生态 (Prometheus, Grafana, Istio, Fluentd 等) 无缝集成。

心猿意码 1849

如何快速上手Spring Cloud Kubernetes?5分钟搭建你的第一个K8s微服务

Spring Cloud Kubernetes是Spring Cloud生态系统与Kubernetes的无缝集成方案,它让开发者能够轻松构建在Kubernetes环境中运行的微服务应用。通过提供服务发现、配置管理、健康检查等核心功能,Spring Cloud Kubernetes帮助开发者实现微服务的快速部署与动态扩展,同时保持Spring Boot应用的开发体验。 ## 🌟 核心功能概览

gitblog_00747的博客 1096

Spring Cloud Config整合Spring Cloud Kubernetes,在k8s上管理配置

1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Kubernetes有专门的ConfigMap和Secret来管理配置,但它也有一些局限性,所以还是希望通过Spring Cloud Config来管理。在Kubernetes上面的微服务系统会有所不同,我们来探索一下如何整合Spring Cloud Kubernetes来做配置管理。 整体方案与《使用Spring Cloud Config统一管理配置,别再到处放配置文件了》差不多,只是引入Spring Cloud Kubern

南瓜慢说 1158

SpringCloud与Kubernetes融合实战项目spring-cloud-k8s-demo

动态伸缩虽好,但也带来新问题:新启动的 Pod 还没预热完成就被打死了怎么办?解决方案三连击:当我们把 Spring Cloud 微服务从“依赖中间件”转向“平台自治”,你会发现:架构更轻了(少了 Eureka、Config Server)响应更快了(秒级发现、毫秒级故障转移)运维更简单了(一切通过 YAML 声明)弹性更强了(自动伸缩、自动恢复)这不仅仅是技术替换,而是一种思维方式的转变:从“我在 K8s 上运行应用”变成“我的应用天生属于 K8s”

weixin_42126677的博客 1071

Spring Cloud Kubernetes 实践 服务注册发现、服务动态配置

随着云计算和微服务架构的不断发展,k8s 和Spring Cloud成为了当今技术领域的两大热门话题。k8s作为一个开源的容器编排平台,已经在自动化部署、扩展和管理方面取得了巨大的成功,而Spring Cloud则以其丰富的生态和语言亲和性,为Java开发者提供了便利的微服务框架支持。在现如今的技术趋势下,两者融合已经成为了必要的方向。

小毕超博客 2554

SOI技术解析:绝缘体上硅的结构优势与应用场景

本文深入解析了SOI(绝缘体上硅)技术的核心结构、性能优势与应用场景。SOI通过在硅衬底与器件层之间引入绝缘的埋氧层,实现了优异的电隔离,从而显著降低芯片功耗、提升工作频率并增强抗干扰能力。该技术已广泛应用于5G射频前端、高性能计算、汽车电子及MEMS传感器等关键领域,是推动半导体性能持续提升的重要技术路径。

jj890的博客 405

Spring Cloud Kubernetes:在K8s环境中的服务发现与配置

Spring Cloud Kubernetes通过将Spring Cloud抽象层与Kubernetes原生功能无缝集成,为Java开发者提供了在Kubernetes环境中构建微服务应用的强大工具。本文详细介绍了Spring Cloud Kubernetes的服务发现、负载均衡、配置管理和高级特性等核心功能,以及相关的最佳实践。在实际应用中,Spring Cloud Kubernetes不仅简化了从传统部署向容器化环境的迁移过程,还使开发者能够充分利用Kubernetes的编排能力和弹性扩展能力。

程序媛学姐的博客 1928

解决RocketMQ中@Bean配置DefaultMQProducer时的MQClientException问题

本文针对Spring Boot整合RocketMQ时,因在@Bean配置中手动调用DefaultMQProducer的start()方法而引发的MQClientException问题,深入剖析了其根本原因在于生命周期管理冲突。文章提供了简洁有效的解决方案——移除手动启动,让Spring容器自动管理,并给出了完整的配置示例与生产环境最佳实践。

rnn9storyteller的博客 690

CAD文件转换避坑指南:Inventor导出STP时这些设置千万别忽略

本文深入解析了使用Autodesk Inventor导出STP文件时的关键设置与避坑指南。重点探讨了应用协议选择、样条曲线拟合精度对几何保真度的影响,以及装配体结构和元数据的保全策略,旨在帮助用户实现高质量、零误差的CAD数据交付,避免下游软件打开时出现特征丢失或曲面破碎等问题。

weixin_29214559的博客 520

探索Spring Cloud Kubernetes:无缝集成K8s与微服务

在当今的云计算时代,Kubernetes(K8s)已成为容器编排的事实标准,而Spring Boot和Spring Cloud则是Java微服务开发的首选框架。`spring-cloud-kubernetes`项目将这两个强大的工具集结合在一起,为开发者提供了一种无缝的方式,利用Kubernetes平台的力量来构建、部署和管理Spring Cloud应用。 ## 项目简介 `spring-cl

gitblog_00064的博客 1406

petalinux i2c的配置

1.硬件平台配置 1.内核配置 cd petalinux-config -c kernel -> Device Drivers -> I2C support -> i2C Hardware Bus support -> Xilinx I2C Controller Pressing 启用CONFIG_I2C_XILINX=y 2.修改用户设备树 cd cd project-spec/meta-user/recipes-bsp/device-tree/files/ i2c2:

u013403954的博客 4315

spring cloud项目改造为spring-cloud-kubernetes项目

spring cloud去掉eureka注册中心 spring cloud使用etcd作为注册中心 spring cloud改造成spring cloud kubernetes

水中加点糖 6924

OpenEuler22.03 LTS下Zabbix7.0监控系统的容器化部署避坑指南(含Docker-Compose完整配置)

本文详细介绍了在OpenEuler22.03 LTS操作系统上容器化部署Zabbix7.0监控系统的完整流程,包括Docker引擎配置、Docker-Compose编排、网络模式选择及性能调优等关键步骤。针对OpenEuler环境下的特殊问题提供了解决方案,帮助用户高效搭建稳定可靠的监控系统。

python9snake的博客 270

大模型的安全发展与安全治理

2022 年底,OpenAI 推出的 ChatGPT 在文本生成领域实现了重大突破,引领了大模型技术的发展方向,推动了各式各样的基座大模型及行业大模型的发展,并逐步向多模态和具身化方向迅速演进。显然,大模型展现出的强大能力为人工智能通用化揭开了序幕。然而,大模型技术的安全性也面临着生成内容的安全性、伦理道德等重大挑战。只有积极确保大模型的安全性,才能更有效地推动其持续发展,进而更好地应对大模型技术变革所带来的机遇与挑战。

qq_41432686的博客 2585

K8s(Kubernetes)在企业级实际项目中的应用原理与实践:与Spring Boot和Spring Cloud结合使用

Kubernetes,简称K8s,是由Google开源的容器编排平台,旨在帮助开发者和运维人员自动化部署、扩展和管理容器化应用。容器调度与编排:K8s可以根据需求调度容器的部署,进行负载均衡、自动扩展等操作。自愈能力:K8s可以检测到容器的失败并进行自动恢复。滚动更新与回滚:可以平滑地进行应用版本的更新,且支持版本回滚。服务发现与负载均衡:提供内建的服务发现机制和负载均衡能力,确保微服务之间的通信高效且稳定。

一碗黄焖鸡三碗米饭的博客 1178

ROS从入门到精通2-7:Gazebo仿真之动态生成障碍物

动态生成障碍物在机器人导航、碰撞避障算法测试、多机协同等领域应用广泛,可以帮助开发人员快速测试,本文介绍该技术并提供基于ROS Gazebo的实现

FRIGIDWINTER的博客 4901

Spring Cloud Kubernetes 使用教程

Spring Cloud Kubernetes 是 Spring Cloud 的一个子项目,旨在将 Spring Cloud 的编程模型与 Kubernetes 的容器编排平台集成。通过这种方式,开发者可以利用 Spring Cloud 的丰富功能,如服务发现、配置管理、负载均衡等,同时在 Kubernetes 环境中无缝运行这些服务。 ## 项目快速启动 ### 环境准备 - JDK 1....

gitblog_00751的博客 1122

通信原理 | python调制识别数据及代码

数据集包含了从-20dB 到+18dB 总共 20 个信噪比(步长为 2)下的 11 种调制信号, 包括 AM-DSB、 AM-SSB 和 WBFM 三种模拟调制信号,以及 BPSK、 QPSK、 8PSK、 CPFSK、 GFSK、 PAM4、 QAM16 和 QAM64 八种数字调制信号。其中信号的中心频率为 200KHz,采样频率为 1Msamp/s,且每个信噪比下每种调制信号包含 1000 个信号。其中每个信号包含 IQ 两路数据,且每一路数据都包含有 128 个采样点。

若北辰 1758

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【序列晋升】23 Spring Cloud Kubernetes 云原生架构的终极整合方案

Spring Cloud Kubernetes是连接Spring Cloud生态与Kubernetes容器编排平台的关键桥梁,它通过适配器模式将Spring Cloud接口与Kubernetes原生资源对接,使Java微服务开发者能够在不放弃Spring生态便利性的同时,充分利用Kubernetes的云原生能力。

愚者Turbo的博客 1891

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

k8s部署Spring Cloud应用

jdk镜像 cat <<EOF > Dockerfile FROM centos:7 ADD jdk-8u212-linux-x64.tar.gz /opt/ ENV JAVA_HOME=/opt/jdk1.8.0_212 \ PATH=$PATH:/opt/jdk1.8.0_212/bin:/usr/tomcat/bin ENTRYPOINT bash EOF doc...

wanght笔记 1万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

spring-cloud-kubernetes自动同步k8s的configmap更新

上一篇《spring-cloud-kubernetes与k8s的configmap》中,我们应用将k8s的configmap当做配置中心,但配置文件变更后我们的应用无法及时同步,今天就来解决这个问题

程序员欣宸的博客 1万+

Spring Cloud Kubernetes高级特性:Hystrix熔断与容错机制详解

Spring Cloud Kubernetes作为Kubernetes与Spring Cloud生态的桥梁,不仅提供了服务发现、配置管理等基础能力,还通过集成Hystrix实现了强大的熔断与容错机制。本文将深入解析这一高级特性,帮助开发者构建更稳定可靠的微服务架构。 ## 为什么需要熔断机制? 在分布式系统中,服务间依赖关系复杂,当某个服务出现故障或响应延迟时,可能会导致级联失败,最终引发整个

gitblog_00230的博客 635

分布式系统选型之Kubernetes (K8s) vs Spring Cloud

Kubernetes 是由 Google 开发并捐赠给 Cloud Native Computing Foundation (CNCF) 的开源容器编排平台。Kubernetes 的主要目的是自动化应用程序的部署、扩展和管理。它允许开发者和运维人员高效地管理成千上万的容器化应用,并确保这些应用能够高可用、可扩展和易于维护。Kubernetes是一个容器编排平台,属于基础设施层,主要关注容器的部署、管理和扩展。它有一个丰富的生态系统,包括 Helm、Istio、Prometheus 等工具。

qq_36176028的博客 3540

Spring Cloud Kubernetes服务发现实战:轻松实现微服务间通信

Spring Cloud Kubernetes是Spring Cloud生态系统的重要组件,它为Kubernetes环境中的微服务提供了服务发现、配置管理等核心功能。通过服务发现机制,微服务可以自动识别并通信,无需手动配置服务地址,极大简化了分布式系统的开发和运维。 ## 什么是服务发现?为什么它如此重要? 在微服务架构中,服务实例的数量和地址经常变化(如扩缩容、故障恢复等)。服务发现机制允许

gitblog_00205的博客 1085
上一篇: 高并发系统架构优化:基于Spring Cloud与Redis的实践
下一篇: 微服务架构设计与实践:企业级系统架构的核心挑战与解决方案
不早睡不改名@
博客等级 码龄5年 536粉丝 306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值