[{"data":1,"prerenderedAt":206},["ShallowReactive",2],{"content:\u002F2026\u002F04\u002Fkratos-folder":3,"surround:\u002F2026\u002F04\u002Fkratos-folder":197},{"id":4,"title":5,"body":6,"categories":173,"date":175,"description":176,"draft":177,"extension":178,"image":179,"meta":180,"navigation":182,"path":183,"permalink":179,"published":179,"readingTime":184,"recommend":179,"references":179,"seo":189,"sitemap":190,"stem":191,"tags":192,"type":195,"updated":175,"__hash__":196},"content\u002Fposts\u002F2026\u002F04\u002Fkratos-folder.md","Kratos 项目目录结构详解",{"type":7,"value":8,"toc":161},"minimark",[9,18,32,46,50,93,99,104,107,110,114,117,120,124,127,129,134,137,140,146,149,157],[10,11,12,13,17],"p",{},"生成api接口后，就要自己实现",[14,15,16],"code",{"code":16},"service","层代码，也就是做DTO和DO之间的类型转换",[10,19,20,21,24,25,28,29,31],{},"然后把数据提交给",[14,22,23],{"code":23},"biz","层，也就是业务逻辑层，相当于",[14,26,27],{"code":27},"DDD","的",[14,30,16],{"code":16},"层",[10,33,34,36,37,40,41,28,43,31],{},[14,35,23],{"code":23},"层调用",[14,38,39],{"code":39},"data","层，用于直接调用数据库的方法，相当于",[14,42,27],{"code":27},[14,44,45],{"code":45},"repo",[47,48,49],"h2",{"id":49},"依赖关系",[51,52,57],"pre",{"className":53,"code":54,"language":55,"meta":56,"style":56},"language-bash shiki shiki-themes github-light github-dark","data -> repo -> biz -> service\n","bash","",[14,58,59],{"__ignoreMap":56},[60,61,64,67,71,75,79,81,83,86,88,90],"span",{"class":62,"data-line":63,"line":63},"line",1,[60,65,39],{"class":66},"sScJk",[60,68,70],{"class":69},"sVt8B"," -",[60,72,74],{"class":73},"szBVR",">",[60,76,78],{"class":77},"sZZnC"," repo",[60,80,70],{"class":69},[60,82,74],{"class":73},[60,84,85],{"class":77}," biz",[60,87,70],{"class":69},[60,89,74],{"class":73},[60,91,92],{"class":77}," service\n",[47,94,96],{"id":95},"kratos分层",[97,98,95],"strong",{},[100,101,102],"h3",{"id":39},[97,103,39],{},[10,105,106],{},"基础设施",[10,108,109],{},"mysql，redis，kafka，es，等等",[100,111,112],{"id":23},[97,113,23],{},[10,115,116],{},"业务逻辑",[10,118,119],{},"用户，视频，评论，点赞，等等",[100,121,122],{"id":16},[97,123,16],{},[10,125,126],{},"服务接口",[10,128,119],{},[100,130,132],{"id":131},"server",[97,133,131],{},[10,135,136],{},"服务实现",[10,138,139],{},"grpc，http，等等",[10,141,142],{},[143,144],"img",{"alt":143,"src":145},"https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fcodepzj\u002Fimages@main\u002F20260412152459682.png",[10,147,148],{},"目录结构",[51,150,155],{"className":151,"code":153,"language":154,"meta":56},[152],"language-text",".\n├── Dockerfile\n├── LICENSE\n├── Makefile\n├── README.md\n├── api \u002F\u002F 下面维护了微服务使用的proto文件以及根据它们所生成的go文件\n│   └── helloworld\n│       └── v1\n│           ├── error_reason.pb.go\n│           ├── error_reason.proto\n│           ├── error_reason.swagger.json\n│           ├── greeter.pb.go\n│           ├── greeter.proto\n│           ├── greeter.swagger.json\n│           ├── greeter_grpc.pb.go\n│           └── greeter_http.pb.go\n├── cmd  \u002F\u002F 整个项目启动的入口文件\n│   └── server\n│       ├── main.go\n│       ├── wire.go  \u002F\u002F 我们使用wire来维护依赖注入\n│       └── wire_gen.go\n├── configs  \u002F\u002F 这里通常维护一些本地调试用的样例配置文件\n│   └── config.yaml\n├── generate.go\n├── go.mod\n├── go.sum\n├── internal  \u002F\u002F 该服务所有不对外暴露的代码，通常的业务逻辑都在这下面，使用internal避免错误引用\n│   ├── biz   \u002F\u002F 业务逻辑的组装层，类似 DDD 的 domain 层，data 类似 DDD 的 repo，而 repo 接口在这里定义，使用依赖倒置的原则。\n│   │   ├── README.md\n│   │   ├── biz.go\n│   │   └── greeter.go\n│   ├── conf  \u002F\u002F 内部使用的config的结构定义，使用proto格式生成\n│   │   ├── conf.pb.go\n│   │   └── conf.proto\n│   ├── data  \u002F\u002F 业务数据访问，包含 cache、db 等封装，实现了 biz 的 repo 接口。我们可能会把 data 与 dao 混淆在一起，data 偏重业务的含义，它所要做的是将领域对象重新拿出来，我们去掉了 DDD 的 infra层。\n│   │   ├── README.md\n│   │   ├── data.go\n│   │   └── greeter.go\n│   ├── server  \u002F\u002F http和grpc实例的创建和配置\n│   │   ├── grpc.go\n│   │   ├── http.go\n│   │   └── server.go\n│   └── service  \u002F\u002F 实现了 api 定义的服务层，类似 DDD 的 application 层，处理 DTO 到 biz 领域实体的转换(DTO -> DO)，同时协同各类 biz 交互，但是不应处理复杂逻辑\n│       ├── README.md\n│       ├── greeter.go\n│       └── service.go\n└── third_party  \u002F\u002F api 依赖的第三方proto\n    ├── README.md\n    ├── google\n    │   └── api\n    │       ├── annotations.proto\n    │       ├── http.proto\n    │       └── httpbody.proto\n    └── validate\n        ├── README.md\n        └── validate.proto\n","text",[14,156,153],{"__ignoreMap":56},[158,159,160],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":56,"searchDepth":162,"depth":162,"links":163},4,[164,166],{"id":49,"depth":165,"text":49},2,{"id":95,"depth":165,"text":95,"children":167},[168,170,171,172],{"id":39,"depth":169,"text":39},3,{"id":23,"depth":169,"text":23},{"id":16,"depth":169,"text":16},{"id":131,"depth":169,"text":131},[174],"微服务","2026-04-12","解析 Kratos 项目的目录结构和各层职责，说明 service、biz、data 与 server 等模块的关系。",false,"md",null,{"slots":181},{},true,"\u002F2026\u002F04\u002Fkratos-folder",{"text":185,"minutes":186,"time":187,"words":188},"3 min read",3.005,180300,601,{"title":5,"description":176},{"loc":183},"posts\u002F2026\u002F04\u002Fkratos-folder",[193,194],"Kratos","Protobuf","tech","k3aUi6YpX4JyR_LkC8BhZ-WvwpUiI8KWMoQFgNRwQnw",[198,202],{"title":199,"path":200,"stem":201,"date":175,"type":195,"children":-1},"Kratos 配置管理实践","\u002F2026\u002F04\u002Fkratos-config","posts\u002F2026\u002F04\u002Fkratos-config",{"title":203,"path":204,"stem":205,"date":175,"type":195,"children":-1},"Kratos 常用命令速查","\u002F2026\u002F04\u002Fkratos-instruction","posts\u002F2026\u002F04\u002Fkratos-instruction",1786555052637]