DDD 参考工程架构

DDD 分层架构实战指南:从项目结构到落地挑战 聚合根(Aggregate Root)、实体(Entity)、值对象(Value Object)。DDD 分层架构通过明确的职责划分,将业务复杂度与技术复杂度解耦。,让业务逻辑与技术实现解耦。:数据库实体(与 ORM 框架绑定的对象)、DAO 实现。,并通过自动化测试和代码规范保障架构一致性。(简单 CRUD 系统无需 DDD),最终,DDD 的成败取决于团队是否愿意。DDD 分层架构的核心目标是通过。,而非让业务适应代码。 阅读详情
关注私信:资料 
免费赠送

1 背景

不同团队落地DDD所采取的应用架构风格可能不同,并没有统一的、标准的DDD工程架构。有些团队可能遵循经典的DDD四层架构,或改进的DDD四层架构,有些团队可能综合考虑分层架构、整洁架构、六边形架构等多种架构风格,有些在实践中可能引入CQRS解决读模型与写模型的差异化等等。即使无法制定通用的、标准的工程应用架构,但为团队制定一个遵循领域驱动设计思想的参考架构依然有价值。基于以下原因:

  • 为团队实践DDD的战术设计提供可以快速开始的工程参考
  • 参考工程大量的命名和结构决策,显式的体现DDD的相关理念,有利于团队对DDD的战术实现达成一致认知
  • 同时,参考架构有助于沉淀团队对领域驱动设计的一些思考和最佳实践

2 参考架构的考量因素

虽然无法制定完全通用的DDD参考架构,但制定某个特定上下文下的参考架构却具有可行性和实践价值。针对于上下文的选择要尽量贴合实际的工程实践场景并考虑多维度的因素。

本文所述参考工程架构遵循以下原则:

  • 遵循领域驱动设计的本质思想,
  • 充分考虑业务系统建设特点
  • 依赖最小化,保持轻量

希望工程参考架构能涵盖以下范围

  • 分离业务域与技术域
    • 参考架构要遵循技术和业务隔离的特性,可以参考多种架构风跟。业务与技术关注点的分离并不是DDD独有的特点,在六边形、整洁架构、洋葱架构中都遵循了这一重要原则。
  • 多限界上下文场景
    • 大多数团队基于DDD进行微服务拆分的时候,特别是系统建设初期,对单个微服务应用内的限界上下文的粒度需要权衡。由于团队组织架构因素及微服务成本问题,单个应用容纳的限界上下文一般是多个(理想情况下是1:1)。这些限界上下文随着后续的逐步迭代有可能会迁移至独立应用。因此,参考架构要考虑的多上下文应用场景。
  • 明确的组件、职责边界及依赖关系
  • 支持领域报表场景
    • 报表场景在业务系统较为常见,DDD并没有体现该场景的处理方式。作为工程参考架构,还是希望能够从实际业务触发,体现对写模型和报表模型的显示支持
  • 外部依赖最小化
    • 作为一个参考架构,需要排除不必要的依赖,保持工程架构的轻量化

3 参考架构剖析

3.1 应用的多上下文结构


基于以上原则,参考工程考虑单个应用内多上下文的场景,以期在模块化和服务粒度及成本间进行权衡折衷。应用架构对多上下文的支持的逻辑示意图如下所示,在解决方案域对限界上下文进行识别和划分之后,基于其业务内聚性和关联性,把多个上下文是现在某单个工程应用中。单个应用内的多个限界上下文间可能存在交互,交互的形式可以是基于事件驱动,也可以是基于进程内调用。采用事件驱动的方式上下文间的耦合性对低一些,但一般需要引入事件总线的支持,额外组件的引入必然会导致复杂性的上升。进程内调用则耦合性会高一些,但从实现角度复杂度会低一些。具体选择哪种方式开发人员可以基于实际情况进行权衡。

需要再次说明的是,这种应用架构决策是一种多因素的权衡,可能与我们所了解的子域与限界上下文1:1的理想化实践不一致。但从特定的架构决策上下文来整体考量依然具有实际应用价值。

从上图的逻辑示意图我们再深入一层,从分层的维度去剖析一下详细的应用架构的展现形式,如下图所示:

3.2 分层关注点

客户端

客户端与应用处于不同的进程,是应用能力的消费端,在实际项目中可能是APP端、PC端、小程序端、公众号端或三方的业务调用端等等。

接入层

接入层是外部系统与应用内部业务能力的中间层,接入层是应用层对外的门面,是当前应用对外暴露业务能力的入口。该层的组成可能是对外提供的HTTP接口声明、分布式定时任务调度、消息监听器、RPC服务等等。其重要职责包括对外部系统的请求进行基础的参数校验、入参适配和服务路由(转发至系一层的应用服务)以及响应数据的适配。

业务层:

该层是应用的业务逻辑所在层,整个架构风格采用模块化单体风格,在该层不同的限界上下文体现为不同的模块。在每个限界上下文内采用分层架构,独立划分为应用层、领域层和网关层。

应用层:

协调领域对象、领域服务或外部依赖服务完成业务用例,该层只做能力协调,不处理任何领域逻辑。

领域层:

领域层是整个分层的核心,与技术实现无关,主要负责领域模型、领域事件、领域服务定义,以及业务相关外部服务的接口抽象以及仓库的接口抽象等。

领域层与应用服务的本质区别是:应用层不包含领域逻辑,领域逻辑全部下沉到领域层实现。

网关层:

网关层定位是应用的出口网关,是应用与外部基础设施交互的适配层,处理所有技术相关实现。

该组件的命名有多种方式,比如有些团队将其命名为 “rpc”,也有些团队将其命名为 “infrastructure”,不同的命名体现了团队对其背后所表达的隐喻的决策选择。在本文的参考架构中选择了 网关-Gateway这一命名,决策原因是:限界上下文自身是高内聚的,其与外部的交互需要统一出口,Gateway所表达的网关的含义恰当的表现了这种统一出口的理念。如果Facade层是应用的北向网关,则此时的Gateway则表达的是限界上下文的南向网关。

3.3 组件及依赖


从宏观的分层我们再深入一层看下每层的组件划分。如下图所示:

Start组件:

整个应用的启动入口、加载应用配置信息等等。

Common组件

提供在不同的限界上下文间复用的领域模型元素的抽象,比如对Command、Query、Event、Entity、ValueObjec通用抽象t等。当然,领域模型的通用抽象不是必须在Common组件内以提供复用,也可以作为一个独立的限界上下文,并以共享内核方式与其它上下文进行共享,或者也可以实现为独立的jar包组件。

API 组件

RPC类型服务的接口声明组件,以公司内部使用的JSF为例,该组件是应用对外部系统暴露的JSF API的组件。该组件可以是独立的工程,当然,有些团队会将其作为一个Module放入应用工程中。

统一门面组件:Facade

外部客户端触达应用系统的入口,也是内部应用服务的统一门面,类似于六边形架构风格下的适配器。参考架构中基于不同场景划分为 provider(RPC服务)、task(定时任务)、listener(MQ监听)、rest(http接口)等几个子包。外部请求进入系统后,由Facade组件完成入参基本校验、入参转换、服务路由以及出参转换等操作。同时,还可以承担处理登录态、鉴权以及日志等相关能力。

应用服务组件:Application Service

应用服务代表着用例以及系统行为,其通过委托到领域层和基础设施层(参考架构中的Gateway组件)完成用例的应用逻辑逻辑处理,可以理解为应用服务是领域层的客户端。该组件典型的职责:

  • 从存储层加载领域对象、委托领域对象执行领域逻辑、保存领域对象
  • 重要事件通知到外部
  • 出入参转化适配
  • 事务处理
  • 外部非领域逻辑的服务调用

External API 

应用服务的逻辑不仅仅需要协调领域层,有时还需要依赖于外部的三方服务。External API 组件负责对这些外部服务进行接口声明定义,不做具体实现。

应用服务组件不直接依赖这些外部服务实现,而是依赖其接口抽象。同时,此处的模型定义是基于该限界上下文的语义,是一种对外部模型的适配。

该组件不依赖其它组件,且仅被应用服务组件和Gateway组件依赖。网关组件依赖External API 组件的接口声明并提供底层技术实现,应用服务组件依赖其接口,并通过IOC方式将具体实现注入完成服务调用。

注意,该组件所依赖的服务不涉及领域概念,只是用于支撑应用服务的编排。如果是涉及了领域逻辑,则对外部服务依赖的接口定义需要下沉到Domain层。

Query

Query组件解决领域相关的报表查询场景,在限界上下文内作为与应用服务对等的组件存在,两个组件分别负责业务的查询和命令逻辑。

虽然引入了Query组件对报表场景提供支持,但没有完全的引入CQRS这一模式。在很多资料中CQRS与DDD同时提及的概率比较高,因为,在DDD下我们解决了复杂的面向领域的写侧模型,但在报表场景下,这种富领域模型有可能并不是最佳选择。如果读侧和写侧都基于统一的领域模型,一般会导致领域模型的折衷设计。为了满足查询侧诉求,领域模型不得不引入额外的、领域无关的属性,由此造成领域模型的污染。

Domain

Domain组件是领域逻辑核心,承担整个系统领域逻辑的实现,其定义了领域模型、领域服务、领域事件以及仓储层的抽象。该组件不依赖其它组件(除了通用的领域模型抽象组件Common之外。

上图所体现的参考架构使用了DDD的战术设计的经典建模元素,比如聚合、实体、值对象、仓储、工厂以及领域事件等。在实际落地过程中,这些设计元素的抽象具有一定的挑战,设计过程中需要经过不断分析、权衡和重构以完成建模,这正是核心设计所在。

Gateway

网关层(有些架构下可能成为基础设施层Infrastructure)承担整个技术相关性的实现,是内部应用的出口网关。

技术相关性是网关组件区别于其它组件的根本特性。在该组件内要处理技术实现的所有细节,比如与外部服务、中间件、DB的交互等。同时,其与Domain组件以及External API组件的接口抽象协作,共同承担了系统与外部依赖间(包括外部服务以及应用依赖的中间件、DB等基础设施)的防腐层职能,负责内部模型到外部模型转化、外部模型到内部模型转化以及具体交互。基于网关组件的特性,也非常适合在该层做统一的外部服务数据缓存及降级熔断处理。

网关层依赖于Domain、Application Service、External API和Query组件,负责上述四个组件定义的接口实现。在Gateway组件通过子包对实现进行隔离:

  • query:查询服务组件的实现
  • external:External API 组件中依赖外部服务的接口实现
  • repository:仓储接口的实现

4 结语


应用架构模式是架构的重要维度之一,结构不仅仅是简单的包结构和命名,其传达的是一种顶层抽象,背后包含了大量的实践和知识。制定符合团队情况的工程参考架构,并在团队成员间达成共识非常重要。领域驱动设计并没有统一的、通用的架构,试图定义标准架构是不切实际的。本文描述的工程架构只是一个参考,实践过程中应该基于团队特定情况而有所差异,但原则上都应该遵循业务域与技术域分离的核心理念。

关注微信公众号:系统工程实验室,获取更多资料

架构师篇 DDD领域驱动设计篇 领域驱动设计(英文:Domain-Driven Design,缩写DDD)是一种模型驱动设计的方法,领域驱动设计常以战略设计与战术设计来将整个领域展现的淋漓尽致,其作用范围既面向业务也面向技术。从战略角度(个人更喜欢称其为上帝视角)去规划系统、划分领域。而从战术角度则从技术层面来指导我们该如何去设计。功能作用:1.通过模型直接反映软件的结构;2.以模型为基础形成团队的统一语言;3.把模型作为精粹的知识用于传递。领域驱动设计的核心在于领域建模,架构师的水平高低在很大程度上也体现在领域建模水平上。对于业务逻辑不 阅读详情

相关推荐

DDD概念复杂难懂,实际落地如何设计代码实现模型?

伴随着业务系统复杂度的不断提升,以及微服务架构等分布式技术体系的大行其道,领域驱动设计(Domain Driven Design,DDD),日渐成为系统建模领域的主流设计思想和模式。在DDD中,引入了限界上下文、聚合、实体、值对象、领域事件、资源库、应用服务等一系列核心概念。通过这些概念,开发人员可以开展系统设计和实现工作。但是,DDD中的这些概念相对都比较抽象,甚至有些晦涩难懂。再往相通或类似问题点上靠,我认为实质上对于复杂难懂的概念的理解和把握,我们一开始不必过于纠结这些概念本身,而是可以把它们与现实中

weixin_57907028的博客 1890

基于DDD的项目结构

基于DDD思想的简单落地demo

懒猫的脚印 4447

【实践篇】领域驱动设计:DDD工程参考架构 | 京东云技术团队

不同团队落地DDD所采取的应用架构风格可能不同,并没有统一的、标准的DDD工程架构。即使无法制定通用的、标准的工程应用架构,但为团队制定一个遵循领域驱动设计思想的参考架构依然有价值。

JDDTechTalk的博客 863

DDD领域驱动设计内容分享(三十八):DDD战术之项目工程结构

编码时,要特别注意各层间应有各自的语义。试想,业务逻辑和技术细节糅杂在一起,Service作为上帝类包揽一切情况:先几行check 检验,再几行是 convert 转换,紧跟是业务逻辑处理,中间抑或要通过 RPC 或 DAO 获取更多数据,拿到数据后,又是几行 convert,再接上一段业务逻辑代码,然后落库,发消息…特殊,步步为营计,可在基础设施层中单拎出demo-infrastructure-po模块,且领域层中demo-domian-model对其依赖,便于以后PO从领域层中再剥离出来。

之乎者也·的博客 2034

领域驱动设计(DDD)笔记(三)后端工程架构

基于DDD理论,通过战术设计原则;指导具体的落地实现细节,省去浮夸的DDD描述

ysf465639310的专栏 1484

Android高级开发工程师面试指南与参考答案(字节跳动番茄系业务方向)

字节跳动安卓开发工程师岗位聚焦番茄系产品的研发优化,要求扎实的Java/Kotlin基础(如协程应用)、深入理解Android系统原理(如Binder机制)。面试重点考察:1)架构设计能力,包括模块化架构、缓存策略等;2)性能优化实战,如启动加速、卡顿治理;3)技术赋能业务的能力,如提升完播率、预加载策略。候选者需熟悉主流工具链,并能将技术方案量化验证(如"优化后启动速度提升70%")。岗位特别强调复杂场景下的工程决策能力,需结合具体案例展现技术深度与业务敏感度。

郑伟强dev的专栏 1785

DDD之工程模型

但随着微服务的演进,越来越多的内容被填充到工程中,这个时候你细心的查看架构,就会发现原本的 MVC 结构其实已经变的非常混乱了。统一的异常、数据库的连接、日志的打印、外部服务的调用、消息的监听、任务的轮训以及服务的实现等一些列的东西要处理,分配到不同的工程包下承载。通用的、配置的、组件的、持久化的、内部的、外部的,在以往的单体应用时代开发下,其实是没有这么多东西的,那时候的工程结构都偏向于 Service + 贫血模型实现。这样你所有的通用配置,又和业务没有太大的关系的,就可以直接写到这里了。

优快云_LiMingfly的博客 1330

Oracle 19c RAC安装踩坑实录:OpenSSH 8.x版本与OUI的“兼容性战争”及一劳永逸的解决思路

本文深入解析Oracle 19c RAC在Linux8环境中部署时遇到的OpenSSH 8.x版本兼容性问题,特别是[INS-06006]错误的根源与解决方案。从协议层分析冲突本质,提供SCP包装器技术、官方补丁应用指南及现代化部署体系构建三种解决方案,帮助企业高效完成RAC安装并规避类似问题。

weixin_42648844的博客 458

可落地的DDD(5)-战术设计

摘要 本篇是DDD的战术篇,也就是关于领域事件、领域对象、聚合根、实体、值对象的讨论。也是DDD系列的完结篇。 这一部分在我们团队争论最多的,也有很多月经贴,比如对资源库的操作应该放在领域服务还是领域对象中。 聚合根应不应该暴露给外部,还是要转成DTO。这些问题我们讨论了大半年,最后大家基本达成了共识,在当前的业务规模下, 这些问题没那么重要,可东可西。不会对代码的质量有啥大的影响。关于DDD的实...

方丈的寺院 4061

保姆级教程:手把手教你用RKISP TURN为RV1106生成和配置IQfile(附AIQ版本匹配避坑指南)

本文提供RV1106 ISP调试的完整指南,详细讲解如何使用RKISP TURN工具生成和配置IQfile,包括环境搭建、参数调试、设备树配置及常见问题解决方案。特别强调AIQ版本匹配的重要性,帮助开发者避免常见陷阱,提升图像信号处理效率。

weixin_42520796的博客 496

开源大模型本地部署实战:Llama、DeepSeek、Qwen选型与工程落地指南

大语言模型(LLM)本地部署已成为AI工程化核心环节,其本质不是比拼参数量或榜单分数,而是考察模型架构、推理引擎、量化支持、IDE集成与多模态扩展能力的系统性适配。Llama以纯净Transformer结构成为通用底座,依赖llama.cpp和GGUF量化实现跨平台轻量推理;DeepSeek深度优化代码与数学推理,通过原生OpenAPI、FlashAttention-2及tensor parallelism显著降低API延迟;Qwen则采用模块化设计,支持视觉编码器(Qwen-VL)、生物计算(Qwen-B

weixin_29952383的博客 396

ddd 企业应用架构模式_可落地的DDD(5)-战术设计

摘要本篇是DDD的战术篇,也就是关于领域事件、领域对象、聚合根、实体、值对象的讨论。也是DDD系列的完结篇。 这一部分在我们团队争论最多的,也有很多月经贴,比如对资源库的操作应该放在领域服务还是领域对象中。 聚合根应不应该暴露给外部,还是要转成DTO。这些问题我们讨论了大半年,最后大家基本达成了共识,在当前的业务规模下, 这些问题没那么重要,可东可西。不会对代码的质量有啥大的影响。关于DDD的实践...

weixin_39545805的博客 227

机场数据治理系列介绍(1):机场行业数据中台中的数据管理顶层设计方案

民航机场行业的数据中台中,有关数据管理顶层设计方案需要结合机场行业的业务特点和技术需求进行具体的设计,今日我们简要考量设计提供一个参考方案:

机场信息系统研究员的专栏 1605

架构的本质之 DDD 架构:从 MVC 困境到四层领域驱动设计的工程化落地(xfg-frame-ddd 实战)

> 导读:本文以 DDD 架构(领域驱动设计)为核心,围绕小傅哥开源实践工程 xfg-frame-ddd 的完整分层结构展开:先剖析 MVC 长周期迭代中的腐化问题,再讲解 DDD 的“触发 → 函数 → 连接”简化模型与 api/app/domain/infrastructure/trigger/types/case 七层架构,深入 model 中的聚合、实体、值对象与仓储、服务的领域分层设计,

gitblog_01092的博客 946

【Prometheus】prometheus结合cAdvisor监控docker容器运行状态,并且实现实时告警通知

Docker的监控,可以使用Docker自带的stats命令来获取当前主机上运行中的容器的资源使用情况。 例如:容器的CPU使用率、内存占用、网络IO以及磁盘IO等指标。

景天科技苑 6万+

8.30华为OD机试真题 新系统 - 单词搜索计数 (Java/Py/C/C++/Js/Go)

8.30华为OD机试真题 新系统 - 单词搜索计数 (Java/Py/C/C++/Js/Go)

算法大师! 602

DDD与CQRS对比传统分层架构:到底该怎么选?

在软件架构演进中,领域驱动设计(DDD)、命令查询职责分离(CQRS)与传统分层架构常被放在一起讨论。DDD强调以业务边界和领域模型收敛复杂规则,CQRS则将写模型与读模型分离以适配读写失衡场景,而传统分层架构以数据表为中心,简单直接且具备强一致性。理解三者的原理与适用边界,是架构选型的关键:复杂业务、团队建模能力强且能接受最终一致性时,DDD+CQRS能显著降低变更成本;而对以CRUD为主的系统,传统分层仍是高性价比选择。从订单系统到营销中台,实际项目常采用渐进式改造,先局部引入DDD建模,再按需实施CQ

weixin_35755562的博客 165

YOLOv8 超参数调优教程! 使用Ray Tune进行高效的超参数调优!

YOLOv8超参数调优教程!😎 使用Ray Tune进行高效的超参数调优!

Coding... 1万+

从零手搓生产级记忆型AI Agent:DDD架构与SSE流式实战

AI Agent 正从简单对话走向具备记忆、工具调用与人机协同的生产级系统。其核心在于通过领域驱动设计实现业务逻辑与技术设施解耦,利用 SSE 流式传输实时推送模型输出,并借助 HITL 机制在关键决策点引入人工确认。这些技术共同解决了长会话失忆、上下文丢失、任务中断无法恢复等工程痛点,适用于智能客服、多轮任务编排、实时协作等场景。本文围绕 AgentScope 设计理念,深入拆解记忆分层、工具调用链路、SSE 保活与 HITL 中断恢复的完整实现,为构建稳定可用的记忆型 AI Agent 提供可落地的工程

weixin_29041767的博客 243

揭秘 C++ 性能优化的终极秘籍,让你面试时应答如流

VTune Amplifier 是英特尔开发的一款强大的性能分析工具,它可以深入分析应用程序在英特尔架构上的性能瓶颈。功能特点全面的分析视角:提供了多种分析模式,如热点分析、线程分析、内存分析等。热点分析模式能快速定位程序中最耗时的代码段;线程分析模式可帮助开发者了解多线程程序中线程的执行情况、同步开销等;内存分析模式则专注于内存访问的性能,包括缓存命中率、内存带宽使用等。硬件层面的洞察:能够深入到硬件层面,分析 CPU 的微架构指标,如指令级并行度、流水线停顿等。

大模型大数据攻城狮的专栏 1153

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

提示工程架构师实战:基于领域驱动设计(DDD)的智能旅游提示系统,用户体验优化案例

子域核心限界上下文核心实体/聚合根核心领域事件对提示工程的意义行程规划子域行程规划上下文(TripPlanning)Trip(聚合根)、Attraction(实体)、TripBudget(值对象)提示需包含行程结构、预算状态、景点关联信息景点探索子域景点探索上下文(AttractionExploration)Attraction(实体)、OpeningHours(值对象)提示需包含景点实时状态(开放/闭馆)、替代推荐交通接驳子域交通接驳上下文(Transportation)

AI算力网络与通信的博客 1132

efm32 入门.pdf

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

AI辅助单体仓库规划:Claude Code在工程架构重构中的实战指南

单体仓库(Monorepo)是一种将多个相关项目的代码统一存储在单一版本库中的软件工程策略,其核心原理是通过共享代码库、统一工具链和原子提交来管理复杂项目的模块化组件。这一架构模式的技术价值在于显著降低多仓库模式下的协作成本、消除依赖地狱、简化工具链维护并提升代码复用率,尤其适用于中大型全栈应用、微服务集群以及多包库的生态系统。在应用场景上,它广泛服务于需要统一构建、测试和部署的工程团队,解决跨模块修改困难、CI/CD配置冗余等痛点。借助Claude Code这类具备工作区级上下文感知能力的AI编程助手,开

weixin_34343000的博客 420

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

优秀的代码都是如何分层的?

点击上方“程序员小明”,选择“星标” 今晚可以不加班! 1、背景 说起应用分层,大部分人都会认为这个不是很简单嘛 就controller,service, mapper三层。看起来简单,很多人其实并没有把他们职责划分开,在很多代码中,controller做的逻辑比service还多,service往往当成透传了,这其实是很多人开发代码都没有注意到的地方,反正功能也能用,至于放哪无所谓呗。这样...

日常开发分享 792
上一篇: ASPICE对追踪性和一致性要求
下一篇: 软件架构可视化及C4模型
系统工程实验室
博客等级 码龄10年 258粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值