分类 ALL 下的文章 - CorePlayers
首页
我的项目
708 智能控制台
Ethan认证中心
Ethan's ToDoList
Ethan's Tech Blog
好友链接
妙站分享
联系站长
搜 索
1
2026技术架构新趋势:从微服务回调到AI原生架构设计
45 阅读
2
DDD领域驱动设计:从底层原理到生产级全链路落地实战
41 阅读
3
Go + 云原生2026:从微服务到AI Infra的实战架构
35 阅读
4
事件驱动架构(EDA):从理论到项目落地的完整实践
34 阅读
5
2026 AI编程范式演进:从Vibe Coding到Spec-Driven Development再到Harness Engineering
31 阅读
ALL
(78)
AI
(20)
前端
(24)
后端
(23)
Dify/Coze
(7)
架构设计
(6)
登录
/
注册
搜 索
标签搜索
AI Agent
边缘计算
RSC
虚拟线程
Java
Spring Boot 4
Vibe Coding
AI原生
SDD
全栈开发
高并发
Project Loom
性能优化
2026趋势
协议标准
工具调用
MCP协议
多Agent协作
CrewAI
Spring AI
EthanCcc
累计撰写
78
篇文章
累计收到
1
条评论
首页
栏目
ALL
AI
前端
后端
Dify/Coze
架构设计
页面
我的项目
708 智能控制台
Ethan认证中心
Ethan's ToDoList
Ethan's Tech Blog
好友链接
妙站分享
联系站长
用户登录
登录
注册
ALL
2026-03-22
2026 AI Agent开发框架全景对比:LangChain4j vs Spring AI vs CrewAI选型指南
2026 AI Agent开发框架全景对比:LangChain4j vs Spring AI vs CrewAI选型指南一、引言:AI Agent从Demo到生产的跨越2026年,AI Agent不再是技术博客里的玩具Demo,而是真正跑在生产环境中的核心组件。过去一年,我们看到三类典型的Agent落地场景:智能客服:从预设话术升级为多轮推理、工具调用的自主Agent代码审查:Agent自动阅读PR、运行测试、生成审查意见业务流程自动化:Agent串联多个内部系统API,完成端到端任务框架的选择直接影响Agent的能力上限、开发效率和运维成本。本文将对Java和Python生态中最主流的三大Agent框架做深度对比,帮助团队做出正确的技术选型。二、三大框架概览2.1 LangChain4j——Java生态的Agent标准答案LangChain4j在2026年发布了1.0正式版,是Java生态中最成熟的AI框架:// LangChain4j 1.0 典型Agent定义 @AiService public interface CustomerSupportAgent { @SystemMessage(""" 你是电商客服助手。你可以: - 查询订单状态 (需要订单号) - 处理退款申请 (需要订单号和原因) - 回答产品问题 如果用户问题超出你的能力范围,请引导他们联系人工客服。 """) @Tool(PolicyCardService.class) @Tool(OrderService.class) Result<String> chat(@MemoryId String userId, @UserMessage String message); } // 工具定义 public class OrderService { @Tool("查询订单状态,输入订单号") public OrderStatus queryOrder(@P("订单号") String orderId) { return orderRepository.findById(orderId); } @Tool("申请退款,需要订单号和退款原因") public RefundResult requestRefund( @P("订单号") String orderId, @P("退款原因") String reason ) { return refundService.process(orderId, reason); } }核心特性:声明式Agent:通过注解定义Agent的能力和行为类型安全:Java的类型系统在编译期就能发现工具签名的错误企业级集成:原生支持Spring Boot、Quarkus、Micronaut多模型支持:OpenAI、Azure、DeepSeek、Ollama等RAG内置:嵌入存储、向量检索开箱即用2.2 Spring AI——Spring生态的原生AI扩展Spring AI 1.0在2026年2月正式GA,与Spring Boot 4深度整合:// Spring AI 1.0 Agent实现 @Controller public class AIController { private final ChatClient chatClient; public AIController(ChatClient.Builder builder) { this.chatClient = builder .defaultSystem("你是Spring技术专家,专注于回答Spring Boot相关问题") .defaultTools(new DocumentationTool(), new CodeSearchTool()) .build(); } @GetMapping("/ai/chat") public Flux<String> chat(@RequestParam String message) { // 流式响应 return chatClient.prompt() .user(message) .advisors(new SimpleLoggerAdvisor()) // 可插拔的顾问链 .stream() .content(); } // 多Agent编排(Spring AI独有) @GetMapping("/ai/orchestrate") public OrchestrationResult orchestrate(@RequestParam String task) { return chatClient.orchestrate() .addAgent("analyst", new AnalystAgent()) .addAgent("coder", new CoderAgent()) .addAgent("reviewer", new ReviewerAgent()) .execute(task); } }Spring AI的差异化优势:与Spring Boot深度集成:配置文件、Actuator监控、依赖注入全体系Advisor链:AOP式的横切关注点(日志、重试、向量检索)通过Advisor链织入多Agent编排:内置Agent编排引擎,支持顺序、并行、条件路由原生Observability:Micrometer + OpenTelemetry全链路追踪2.3 CrewAI——Python的多Agent协作引擎CrewAI 1.0在2026年持续领跑Python Agent框架赛道:# CrewAI 1.0 多Agent团队 from crewai import Agent, Task, Crew, Process # 定义专家Agent researcher = Agent( role="技术研究员", goal="深入调研的最新进展和应用案例", backstory="你是一位资深技术分析师,擅长从各类技术源挖掘关键信息", tools=[WebSearchTool(), GitHubTrendingTool()], llm="deepseek-v4", verbose=True ) writer = Agent( role="技术写作者", goal="将研究结果转化为结构清晰的技术文章", backstory="你是一位技术博客作者,能将复杂的技术概念转化为易懂的文字", tools=[MarkdownFormatter()], llm="deepseek-v4", ) reviewer = Agent( role="技术审核", goal="审核文章的技术准确性和可读性", backstory="你曾是Google的Principal Engineer,对技术细节极为敏感", tools=[FactCheckTool()], llm="gemini-3-pro", ) # 定义任务 research_task = Task( description="调研DeepSeek V4的架构创新", expected_output="500字技术调研报告", agent=researcher ) writing_task = Task( description="基于调研报告撰写一篇面向开发者的技术博客", expected_output="2000字技术文章", agent=writer, context=[research_task] # 依赖前序任务 ) review_task = Task( description="审核文章的技术准确性,提出修改建议", expected_output="审核意见和修改建议", agent=reviewer, context=[writing_task] ) # 组建团队 crew = Crew( agents=[researcher, writer, reviewer], tasks=[research_task, writing_task, review_task], process=Process.sequential, # 顺序执行 verbose=True ) result = crew.kickoff(inputs=)CrewAI的核心优势:角色化建模:为Agent定义角色、目标和背景故事,模拟人类团队协作灵活的执行流程:支持顺序(Sequential)和层级(Hierarchical)两种流程Python生态优势:TensorFlow/PyTorch/Transformers无缝集成任务依赖管理:context参数天然支持任务间的数据流转三、全面对比矩阵维度LangChain4j 1.0Spring AI 1.0CrewAI 1.0语言Java/KotlinJava/KotlinPython成熟度⭐⭐⭐⭐⭐ 生产验证⭐⭐⭐⭐ 稳定GA⭐⭐⭐⭐ 生产验证Spring集成✅ 集成良好⭐⭐⭐⭐⭐ 原生❌ 无关多Agent编排⭐⭐ 基础支持⭐⭐⭐⭐ 内置引擎⭐⭐⭐⭐⭐ 角色化建模RAG能力⭐⭐⭐⭐ 丰富⭐⭐⭐⭐ 丰富⭐⭐⭐ 需自行集成企业功能⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐API设计声明式注解Advisor链式声明式Pythonic工具调用@Tool注解FunctionCallback函数直接传递流式输出✅✅(响应式)✅可观测性需自行集成Micrometer原生需自行集成社区规模12k GitHub Stars18k GitHub Stars25k GitHub Stars四、选型决策指南决策流程图团队技术栈? ├── Java为主 │ ├── 需要企业级运维? │ │ ├── 是 → Spring AI(Actuator + Micrometer) │ │ └── 否 → 评估多Agent需求 │ │ ├── 简单Agent → LangChain4j(更简洁) │ │ └── 多Agent编排 → Spring AI(Orchestrator) │ └── 已有Spring Boot项目 → Spring AI(无缝集成) │ └── Python为主 ├── 需要多Agent协作? │ ├── 是 → CrewAI(角色化建模最成熟) │ └── 否 → LangChain Python └── 需要科学计算集成 → CrewAI(PyTorch/TF生态)典型场景推荐场景推荐框架理由企业内部系统集成(Java)Spring AISpring生态无缝对接多Agent科研分析CrewAIPython科学计算生态 + 角色化建模独立Java Agent服务LangChain4j轻量、声明式、类型安全高并发实时AgentSpring AI + 虚拟线程Spring Boot 4虚拟线程支撑数据科学工作流CrewAIPython生态天然优势五、2026下半年展望A2A协议标准化:Google的Agent-to-Agent协议将推动跨框架Agent互通MCP原生支持:三大框架都承诺2026年内完成MCP协议的一等公民支持Agent评估体系:Agent评估的Benchmark和工具链正在形成低代码Agent平台:Dify、Coze等平台与代码框架的边界正在模糊对于团队,现在是最好的Agent框架选型窗口。建议小项目快速验证,大项目做POC,而不是停留在看文档的阶段。发布日期:2026年3月22日 | 作者:Ethan | 分类:AI、Agent开发
2026年03月22日
19
0
1
2026-03-19
SpringBoot + 事件溯源 + CQRS:高一致性与高性能读写分离架构
一、你的系统是不是也遇到了这些问题?订单系统越来越慢了——用户查询订单要等好几秒,而且经常出现数据不一致的问题。更糟糕的是,每次优化查询性能,都会影响订单创建的性能;优化订单创建,查询又变慢了,陷入死循环。二、传统架构的困境在传统的CRUD架构中,读写操作都在同一个数据库上进行,相互影响: 读写冲突:写操作需要加锁,影响读性能;读操作占用连接,影响写性能 性能瓶颈:添加索引、分库分表都增加系统复杂度 数据一致性:多个服务同时操作同一份数据,容易出现不一致 审计困难:只知道数据的当前状态,不知道数据如何变成这样的 三、事件溯源 + CQRS:架构设计的革命3.1 事件溯源(Event Sourcing)传统CRUD存储的是数据的当前状态(就像拍照片),而事件溯源存储的是导致状态变化的事件序列(就像录像带,可以回放整个过程)。3.2 CQRS(Command Query Responsibility Segregation)核心思想是将写操作(Command)和读操作(Query)分离: 写操作:接收命令 → 验证 → 发布事件 → 存储事件 读操作:消费事件 → 构建物化视图 → 高效查询 四、实战实现4.1 事件定义// 订单创建事件 public class OrderCreatedEvent { private String orderId; private String userId; private BigDecimal amount; private List items; private LocalDateTime createTime; } // 订单支付事件 public class OrderPaidEvent { private String orderId; private String transactionId; private LocalDateTime payTime; } // 订单取消事件 public class OrderCancelledEvent { private String orderId; private String reason; private LocalDateTime cancelTime; }4.2 事件存储CREATE TABLE event_store ( id BIGINT AUTO_INCREMENT PRIMARY KEY, aggregate_id VARCHAR(64) NOT NULL, event_type VARCHAR(64) NOT NULL, event_data JSON NOT NULL, version BIGINT NOT NULL, create_time DATETIME NOT NULL, INDEX idx_aggregate (aggregate_id, version) );4.3 命令处理@Service public class OrderCommandService { public void createOrder(CreateOrderCommand command) { String orderId = UUID.randomUUID().toString(); OrderCreatedEvent event = new OrderCreatedEvent(); event.setOrderId(orderId); event.setUserId(command.getUserId()); event.setAmount(command.getAmount()); eventStore.saveEvent(orderId, "OrderCreated", event, 1); eventPublisher.publishEvent(event); } }4.4 查询投影@Component public class OrderProjection { @EventListener public void on(OrderCreatedEvent event) { OrderReadModel model = new OrderReadModel(); model.setOrderId(event.getOrderId()); model.setStatus("CREATED"); readRepository.save(model); } @EventListener public void on(OrderPaidEvent event) { readRepository.updateStatus(event.getOrderId(), "PAID"); } }五、关键设计考量 快照管理:定期创建聚合快照,避免重放过长事件链 幂等性:消费者基于eventId去重,确保重复消费安全 版本管理:事件结构演化时需支持向后兼容 最终一致性:设计合理的SLO(如99.9%的事件在500ms内投递),建立监控告警 六、适用场景与局限性CQRS+ES适用于:审计要求高、读写比差异大、需要事件回溯的业务系统。不适合:简单的CRUD应用、对强一致性要求极高且不可妥协的场景。选择前务必评估团队能力——该架构将系统复杂度提升了一个数量级。
2026年03月19日
30
0
3
2026-03-18
Go + 云原生2026:从微服务到AI Infra的实战架构
2026年,Go语言已经走过了第17个年头。从Docker、Kubernetes到Istio、Prometheus,云原生领域的核心基础设施几乎都由Go构建。而随着AI Infra需求的爆发和MCP协议的普及,Go正在从"云原生的语言"进化为"智能基础设施的语言"。一、Go在云原生生态的地位截至2026年初,CNCF Landscape中收录的项目已超过1500个,其中Go语言项目占比依然保持在65%以上: 领域代表项目语言 容器编排KubernetesGo 服务网格Istio, LinkerdGo 可观测性Prometheus, Jaeger, OpenTelemetryGo 容器运行时containerd, CRI-OGo GitOpsArgo CD, FluxGo 二、Go 1.24带来的关键改进 泛型的成熟应用:slices、maps标准库包以及samber/lo已成为日常开发标配 结构化日志标准化:log/slog包在生产环境广泛采用,配合OpenTelemetry统一可观测性 PGO持续优化:Profile-Guided Optimization在微服务场景吞吐量提升8-15% 三、微服务架构演进:从Sidecar到Ambient Mesh3.1 Sidecar模式的反思在过去几年中,Istio通过Sidecar代理(Envoy)实现流量管理、安全和可观测性。但代价逐渐暴露:每个Pod额外消耗100-200MB内存,启动延迟增加,调试复杂度上升。3.2 Ambient Mesh:2026年的新范式2026年,Istio的Ambient Mesh已进入生产可用阶段:节点级ztunnel取代Pod级Sidecar,L4流量处理下沉到节点,L7策略按需部署waypoint proxy。内存开销从Per-Pod降为Per-Node,大幅降低基础设施成本。四、Go微服务的标准化范式package main import ( "context" "log/slog" "net/http" "os" "os/signal" "syscall" "time" "go.opentelemetry.io/otel" ) func main() { logger := slog.New(slog.NewJSONHandler(os.Stdout, nil)) slog.SetDefault(logger) ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer stop() srv := &http.Server go func() { if err := srv.ListenAndServe(); err != http.ErrServerClosed { slog.Error("server error", "error", err) } }()
2026年03月18日
35
0
4
2026-03-10
React 19 + Next.js 15 全栈实战:Server Components与边缘计算新范式
React 19 + Next.js 15 全栈实战:Server Components与边缘计算新范式一、引言:前端开发的第三次范式革命2026年,React 19.2稳定版发布,React Server Components(RSC)正式结束实验阶段,成为官方推荐的默认渲染架构。Next.js 15将RSC深度整合到App Router中,前端开发完成了从"CSR"到"SSR"再到"RSC"的第三次范式革命。核心变化:RSC成为默认:在Next.js 15 App Router中,所有组件默认都是Server ComponentActions API稳定:useActionState、useFormStatus替代手动状态管理React Compiler落地:自动memoization,删除手写useMemo/useCallback边缘计算普及:代码运行在离用户最近的CDN节点本文将基于React 19 + Next.js 15,从零搭建一个具备真实业务价值的全栈应用——AI辅助的智能博客系统。二、React 19核心新特性2.1 Actions API:异步状态管理80%代码消减React 19的Actions API是最具"delete code"精神的特性:// React 18: 手动管理loading/error/success function OldForm() { const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [success, setSuccess] = useState(false); async function handleSubmit(e: FormEvent) { e.preventDefault(); setLoading(true); setError(null); try { await updateProfile(formData); setSuccess(true); } catch (err) { setError(err.message); } finally { setLoading(false); } } // ... 大量状态管理代码 } // React 19: useActionState + form action,代码减少80% function NewForm() { const [state, submitAction, isPending] = useActionState( async (prevState, formData: FormData) => { const name = formData.get('name') as string; if (!name) return ; await updateProfile(name); return ; }, ); return ( <form action=> <input name="name" disabled= /> <button disabled=> </button> </p>} </p>} </form> ); }2.2 use() Hook:条件化异步数据读取use() 是React 19引入的革命性Hook——它可以在组件内任意位置、条件性地读取Promise和Context:function BlogPost(: ) { // 在Server Component中直接调用数据库 const post = use(fetchPost(postId)); // use() 接受Promise return ( <article> <h1></h1> {use(fetchComments(postId)).map(comment => ( <Comment key= content= /> ))} </article> ); }2.3 React Compiler:删除所有useMemo/useCallbackReact Compiler(前身React Forget)在构建阶段自动分析组件代码,自动添加必要的记忆化:// 源码 —— 不需要手写任何memoization function ProductList(: Props) { const filtered = products.filter(p => p.category === category); const total = filtered.reduce((sum, p) => sum + p.price, 0); return ( <div> product= />)} <TotalPrice amount= /> </div> ); } // React Compiler自动编译为等价于手写useMemo的版本 // 开发者无需关心,只管写好业务逻辑三、Next.js 15:RSC的完美载体3.1 Server Components默认模式Next.js 15 App Router的核心设计理念——默认服务端、按需客户端:// app/blog/[slug]/page.tsx // 默认就是Server Component —— 可以直接访问数据库 import from '@/lib/db'; export default async function BlogPostPage({ params }: { params: Promise<> }) { const = await params; // 直接在组件中查询数据库,无需API层 const post = await db.post.findUnique({ where: , include: }); if (!post) notFound(); return ( <article className="prose lg:prose-xl"> <h1></h1> <div className="flex gap-2 text-sm text-gray-500"> <span></span> <span>·</span> <time></time> </div> <MDXRemote source= /> </article> ); } // generateMetadata —— RSC的SEO利器 export async function generateMetadata() { const = await params; const post = await db.post.findUnique( }); return { title: post.title, description: post.excerpt, openGraph: { images: [post.ogImage] } }; }3.2 何时使用Client ComponentsServer Components无法使用Hooks和浏览器API。当需要交互时,通过 use client 指令标记:// app/blog/[slug]/LikeButton.tsx 'use client'; import from 'react'; import from '@/app/actions'; export function LikeButton(: { postId: string; initialLikes: number; }) { const [state, action, isPending] = useActionState( () => toggleLike(postId), ); return ( <form action=> <button type="submit" disabled= className="flex items-center gap-1" > <HeartIcon filled= /> <span> 赞</span> </button> </form> ); } // 在Server Component中组合Client Component // app/blog/[slug]/page.tsx <div className="mt-8 border-t pt-4"> <LikeButton postId= initialLikes= /> </div>3.3 Server Actions:前后端融合的极致体验Server Actions让你在客户端组件中直接调用服务端函数:// app/actions.ts 'use server'; import from 'next/cache'; import from '@/lib/db'; export async function createComment( postId: string, formData: FormData ) { const content = formData.get('content') as string; // 服务端验证 if (!content || content.length < 2) { return ; } if (content.length > 1000) { return ; } // 直接操作数据库 await db.comment.create({ data: }); // 重新验证页面缓存 revalidatePath(`/blog/$`); return ; }四、边缘计算:0.023秒的极致响应Next.js 15 + Vercel Edge Functions,让计算运行在离用户最近的位置:// app/api/ai-summarize/route.ts export const runtime = 'edge'; // 指定在边缘运行 export async function POST(request: Request) { const = await request.json(); // 边缘函数中调用AI API(延迟仅5ms vs 传统Node的200ms+) const summary = await ai.summarize(content); return Response.json(, { headers: { 'Cache-Control': 'public, max-age=3600', // CDN缓存 } }); }关键数据:边缘函数冷启动:5ms(Cloudflare Workers)/ 50ms(Vercel Edge)传统Serverless冷启动:500ms-3s全球节点覆盖:3000+,用户访问最近节点延迟<10ms五、项目实战结构smart-blog/ ├── app/ # Next.js App Router │ ├── layout.tsx # 根布局(Server Component) │ ├── page.tsx # 首页 │ ├── blog/[slug]/ │ │ ├── page.tsx # 文章详情(Server Component) │ │ └── LikeButton.tsx # 点赞按钮(Client Component) │ ├── api/ │ │ └── ai-summarize/ │ │ └── route.ts # 边缘AI API │ └── actions.ts # Server Actions ├── components/ │ └── MDXContent.tsx # MDX渲染(Client Component) ├── lib/ │ ├── db.ts # 数据库客户端 │ └── ai.ts # AI服务封装 └── public/ └── images/六、总结2026年的React/Next.js技术栈,核心变化在于边界模糊化:传统认知2026现实前端只管UIServer Component直接查数据库需要BFF层Server Actions替代API层客户端渲染是主流RSC默认服务端渲染性能优化靠手写React Compiler自动优化部署到服务器边缘函数毫秒级响应对于前端开发者而言,全栈不再是"必须学后端框架",而是React本身就成为了全栈方案。这是2026年最值得投入时间学习的技术方向。发布日期:2026年3月10日 | 作者:Ethan | 分类:前端、React、Next.js
2026年03月10日
11
0
1
2026-03-05
DDD领域驱动设计:从底层原理到生产级全链路落地实战
一、为什么你需要DDD?传统架构的致命痛点在Java后端开发中,绝大多数项目都采用经典的三层架构:Controller→Service→DAO。这种架构在简单CRUD场景下高效易用,但随着业务复杂度提升,会暴露出致命问题: Service层无限膨胀:一个Service类动辄几千行,逻辑耦合严重 业务与技术深度绑定:以数据库表为核心设计,一旦表结构变更全链路代码都要修改 团队协作成本高:产品、开发、测试没有统一的业务术语 迭代效率指数级下降:新增需求需通读全量代码,最终陷入"不敢改、改不动" 二、DDD核心本质DDD的本质不是一套架构规范,而是一种以业务领域为核心的设计思想:先搞清楚业务是什么、业务规则有哪些,再基于业务去设计技术实现。核心目标有两个: 统一语言:让整个团队使用同一套业务术语,消除沟通偏差 边界隔离:把复杂业务拆分成多个独立边界,高内聚低耦合 三、DDD战略设计:划清业务边界3.1 通用语言(Ubiquitous Language)统一语言是团队在特定业务边界内使用的、无歧义的业务术语集合。反例:产品叫"订单履约",开发代码里写OrderSendService,数据库表叫t_delivery,完全是三套不同的语言。3.2 限界上下文(Bounded Context)限界上下文是通用语言的边界,也是业务的最小自治单元。以电商系统为例: 订单限界上下文:订单创建、支付、发货、完成、取消 库存限界上下文:库存查询、扣减、归还、盘点 支付限界上下文:支付渠道对接、流水管理、退款处理 用户限界上下文:用户信息、会员等级、收货地址 3.3 上下文映射核心有3种映射关系:合作关系、客户-供应商关系、防腐层(ACL)关系。防腐层尤其重要——当对接遗留系统时,通过防腐层隔离旧系统的影响,保护自身领域模型的纯净性。四、DDD战术设计:落地代码实现4.1 实体与值对象实体:有唯一标识(如订单号)和完整生命周期的业务对象。值对象:仅关注自身的值,无独立生命周期(如收货地址、支付金额)。4.2 聚合与聚合根聚合是一组相互关联的实体和值对象的集合,聚合根是聚合的核心控制点。以订单管理为例:订单本身就是聚合根,围绕它的订单商品、收货信息等构成订单聚合。4.3 领域服务与领域事件领域服务处理不属于单个实体的跨实体业务逻辑;领域事件是实现跨领域协作的关键,通过事件流转实现松耦合。4.4 仓储模式仓储封装了数据访问逻辑,让领域模型完全独立于持久化技术,是实现领域层与技术层解耦的关键。五、落地方案:分层架构与六边形架构四层架构:表现层 → 应用层 → 领域层 → 基础设施层,确保关注点分离。六边形架构(端口与适配器):领域模型处于中心,外部依赖通过适配器接入,天然适配事件驱动机制。六、总结DDD不是银弹,它最适合业务逻辑复杂、需要长期维护的系统。对于简单CRUD场景,三层架构仍然是最务实的选择。关键是根据业务复杂度做出合理选择,不要为了DDD而DDD。
2026年03月05日
41
0
5
1
2
3
...
16