[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-detail-ssr-49630226942004236":3},{"id":4,"title":5,"tag":6,"createTime":7,"updateTime":7,"renderedHtml":8,"description":9,"ogImageUrl":10},"49630226942004236","go-zero 初探","微服务","2023-12-09","\u003Ch2 id=\"h2-0-\">项目搭建\u003C\u002Fh2>\n\u003Cp>其实微服务框架的核心还是围绕 RPC 和 HTTP 通信构建的，提供了诸如服务发现、负载均衡、熔断、限流、跟踪、度量和配置管理等微服务必需的功能。比如利用\u003Ccode>.proto\u003C\u002Fcode>文件来定义服务接口和数据结构，然后使用相应的命令来自动生成 Go 的 gRPC 代码；通过\u003Ccode>.api\u003C\u002Fcode>文件和一些工具命令来生成 HTTP 服务的路由、请求和响应的处理代码。\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Flearnku.com\u002Farticles\u002F68612\">go-zero 微服务实战系列（二、服务拆分）\u003C\u002Fa>这篇文章详细的介绍了如何搭建一个微服务项目。下面是我对这篇文章的笔记补充和总结：\u003C\u002Fp>\n\u003Ch3 id=\"h3-1-\">微服务拆分的补充\u003C\u002Fh3>\n\u003Cp>商城系统作为一个复杂的业务系统，包括商品管理、订单处理、用户管理、支付处理、库存管理、推荐和营销等多个方面。下面是根据业务职能和领域驱动设计（DDD）的界限上下文进行微服务划分的对比分析：\u003C\u002Fp>\n\u003Col>\n\u003Cli>\n\u003Cp>\u003Cstrong>业务职能划分\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>按照业务职能划分，我们会根据每个职能的操作和职责来定义服务的边界。在商城系统中，可以进行如下划分：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Ccode>商品服务\u003C\u002Fcode>：处理商品的上架、信息更新、分类、搜索等功能。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>订单服务\u003C\u002Fcode>：管理订单的创建、修改、查询和状态跟踪。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>用户服务\u003C\u002Fcode>：维护用户信息、权限、登录、注册等。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>支付服务\u003C\u002Fcode>：处理支付请求、支付状态、退款等。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>库存服务\u003C\u002Fcode>：管理库存数量、库存锁定、库存释放等。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>推荐服务\u003C\u002Fcode>：基于用户行为和购买历史推荐商品。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>营销服务\u003C\u002Fcode>：管理促销活动、优惠券等营销工具。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>每个服务都是围绕特定的业务职能构建的，职责清晰，开发和维护的团队可以专注于特定的业务区域。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>DDD 界限上下文划分\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>DDD 提倡根据业务的边界上下文来划分服务，这通常是围绕业务流程和领域模型来组织代码和数据库模式的。在 DDD 中，界限上下文是具有明确界限的特定职责区域，在这之内部署了一致性的模型和接口。以商城系统为例，可能的界限上下文包括：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Ccode>产品目录上下文\u003C\u002Fcode>：包括商品的管理和展示，与其他上下文隔离，只关心商品的信息和分类。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>销售上下文\u003C\u002Fcode>：涉及订单处理的全部流程，从购物车管理到订单完成，可能还会包括支付和库存的交互。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>身份与访问管理上下文\u003C\u002Fcode>：处理用户的认证和鉴权，可能与订单服务交互以确定用户身份。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>库存管理上下文\u003C\u002Fcode>：独立处理库存，它将关注库存的状态和与订单服务的交互。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>支付上下文\u003C\u002Fcode>：处理所有支付流程，包括支付请求、验证和记录。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>推荐上下文\u003C\u002Fcode>：从用户行为、购买历史等多个上下文中收集数据，提供个性化推荐。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>在 DDD 中，服务的划分更加注重业务流程和领域逻辑的整体一致性，而不是单一的职能。它鼓励深入分析业务场景以发现领域模型，这些模型定义了实体、值对象、聚合根、领域事件等概念，并围绕这些模型构建服务。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>对比\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Ccode>专业知识要求\u003C\u002Fcode>：DDD 的划分方式要求团队对业务有更深入的理解，而业务职能划分可能更直观、易于理解。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>服务间的耦合\u003C\u002Fcode>：职能划分可能导致服务间的耦合度较高，因为它们通常是基于业务操作而不是业务流程来划分的。而 DDD 强调的是低耦合的上下文间关系。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>数据一致性\u003C\u002Fcode>：DDD 的划分可能更好地处理数据一致性问题，因为它通过聚合根和事务边界来控制数据的一致性。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>复杂性\u003C\u002Fcode>：按照 DDD 划分服务通常更复杂，需要更多的设计和模型发现工作，但最终可能提供更灵活和可扩展的系统架构。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>组织结构\u003C\u002Fcode>：DDD 的界限上下文划分使得团队可以更好地围绕业务能力组织，这与康威定律（Conway’s Law）相呼应，即组织架构会影响最终的系统设计。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 id=\"h3-2-\">项目结构的总结\u003C\u002Fh3>\n\u003Cp>关于项目的整体结构，大致如下：\u003C\u002Fp>\n\u003Cdiv class=\"ssr-code-block\" data-lang=\"text\">\u003Cdiv class=\"ssr-code-head\">\u003Cspan class=\"ssr-code-lang\">text\u003C\u002Fspan>\u003Cdiv class=\"ssr-code-actions\">\u003Cbutton class=\"ssr-code-fullscreen ssr-code-iconbtn\" type=\"button\" aria-label=\"全屏查看代码\" title=\"全屏\">\u003Csvg viewBox=\"0 0 24 24\" width=\"17\" height=\"17\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M5 5h6v2H7v4H5V5zm14 0v6h-2V7h-4V5h6zM5 19v-6h2v4h4v2H5zm14 0h-6v-2h4v-4h2v6z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cbutton class=\"ssr-code-copy ssr-code-iconbtn\" type=\"button\" aria-label=\"复制代码\" title=\"复制\">\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--default\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--success\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--error\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"ssr-code-body\">\u003Cdiv class=\"ssr-code-pane\">\u003Cdiv class=\"ssr-code-gutter\" aria-hidden=\"true\">\u003Cspan class=\"ssr-code-num\">1\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">2\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">3\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">4\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">5\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">6\u003C\u002Fspan>\u003C\u002Fdiv>\u003Cpre class=\"ssr-code-pre\">\u003Ccode class=\"hljs language-text\">\u003Cspan class=\"ssr-code-line\">├── Dockerfile 定义应用程序的容器化配置文件。\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">├── (apps)\u002F(internal) 存放内部代码的目录。\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">├── cmd 包含各个微服务的入口点，例如main.go文件。\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">├── conf 一些全局配置。\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">├── pkg 用于存放公共库和工具代码\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">└── go.mod\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003Cp>对于每一个微服务内部，apps 里面的目录结构大致如下：\u003C\u002Fp>\n\u003Cdiv class=\"ssr-code-block\" data-lang=\"text\">\u003Cdiv class=\"ssr-code-head\">\u003Cspan class=\"ssr-code-lang\">text\u003C\u002Fspan>\u003Cdiv class=\"ssr-code-actions\">\u003Cbutton class=\"ssr-code-fullscreen ssr-code-iconbtn\" type=\"button\" aria-label=\"全屏查看代码\" title=\"全屏\">\u003Csvg viewBox=\"0 0 24 24\" width=\"17\" height=\"17\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M5 5h6v2H7v4H5V5zm14 0v6h-2V7h-4V5h6zM5 19v-6h2v4h4v2H5zm14 0h-6v-2h4v-4h2v6z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cbutton class=\"ssr-code-copy ssr-code-iconbtn\" type=\"button\" aria-label=\"复制代码\" title=\"复制\">\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--default\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--success\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--error\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"ssr-code-body\">\u003Cdiv class=\"ssr-code-pane\">\u003Cdiv class=\"ssr-code-gutter\" aria-hidden=\"true\">\u003Cspan class=\"ssr-code-num\">1\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">2\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">3\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">4\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">5\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">6\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">7\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">8\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">9\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">10\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">11\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">12\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">13\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">14\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">15\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">16\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">17\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">18\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">19\u003C\u002Fspan>\u003C\u002Fdiv>\u003Cpre class=\"ssr-code-pre\">\u003Ccode class=\"hljs language-text\">\u003Cspan class=\"ssr-code-line\">├─app 对外的 BFF 服务，接受来自客户端的请求，暴露 HTTP 接口。\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">├─product 商品微服务\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">│  ├─admin 对内的服务，区别于 rpc，更多的是面向运营侧的且数据权限较高，通过隔离可带来更好的代码级别的安全，直接提供HTTP接口。\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">│  │  ├─etc\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">│  │  └─internal\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">│  └─rpc 对内的微服务，仅接受来自内部其他微服务或者 BFF 的请求，暴露 gRPC 接口。\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">│      ├─etc\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">│      ├─internal\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">│      ├─rpc\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">│      └─rpcclient\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">└─user 用户微服务\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">    ├─admin\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">    │  ├─etc\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">    │  └─internal\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">    └─rpc\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">        ├─etc\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">        ├─internal\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">        ├─rpc\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">        └─rpcclient\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003Ch2 id=\"h2-3--goctl-\">一些 goctl 命令总结\u003C\u002Fh2>\n\u003Ch3 id=\"h3-4-goctl-api-\">goctl api 命令\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>用法:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>goctl api [flags]\u003C\u002Fli>\n\u003Cli>goctl api [command]\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>flags 这里不做介绍，详细看一看 command 有哪些：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>dart 为提供的 api 文件生成 dart 文件\u003C\u002Fli>\n\u003Cli>doc 生成 doc 文件\u003C\u002Fli>\n\u003Cli>format 格式化 api 文件\u003C\u002Fli>\n\u003Cli>go 为提供的 api 文件生成 go 文件\u003C\u002Fli>\n\u003Cli>kt 为提供的 api 文件生成 kotlin 代码\u003C\u002Fli>\n\u003Cli>new 快速创建 api 服务\u003C\u002Fli>\n\u003Cli>plugin 自定义文件生成器\u003C\u002Fli>\n\u003Cli>ts 为提供的 api 文件生成 ts 文件\u003C\u002Fli>\n\u003Cli>validate 验证 api 文件\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4 id=\"h4-5-1-goctl-api-doc-\">1. goctl api doc 命令\u003C\u002Fh4>\n\u003Cp>根据 api 文件生成 markdown 文档。这个 Markdown 文件通常包含了 API 的详细文档，如 API 的路径、方法、请求参数、响应结构等信息，以及可能的注释。具体用法是：\u003Ccode>goctl api doc [flags]\u003C\u002Fcode>。其中 flags 可以是\u003Ccode>--dir\u003C\u002Fcode>或\u003Ccode>--o\u003C\u002Fcode>。具体含义如下：\u003C\u002Fp>\n\u003Cdiv class=\"ssr-table-wrap\">\u003Cbutton class=\"ssr-table-fs-btn\" type=\"button\" aria-label=\"全屏查看表格\" title=\"全屏\">\u003Csvg viewBox=\"0 0 24 24\" width=\"17\" height=\"17\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M5 5h6v2H7v4H5V5zm14 0v6h-2V7h-4V5h6zM5 19v-6h2v4h4v2H5zm14 0h-6v-2h4v-4h2v6z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cdiv class=\"ssr-table-scroll\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>参数字段\u003C\u002Fth>\n\u003Cth>参数类型\u003C\u002Fth>\n\u003Cth>是否必填\u003C\u002Fth>\n\u003Cth>默认值\u003C\u002Fth>\n\u003Cth>参数说明\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>dir\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>YES\u003C\u002Ftd>\n\u003Ctd>空字符串\u003C\u002Ftd>\n\u003Ctd>后面的参数必须是\u003Ccode>.api\u003C\u002Fcode>文件所在目录的路径，这个目录的路径可以是相对路径或绝对路径\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>o\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>NO\u003C\u002Ftd>\n\u003Ctd>当前的工作目录\u003C\u002Ftd>\n\u003Ctd>指定 md 文件所在的目录的名字\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Ch4 id=\"h4-6-2-goctl-api-format-\">2. goctl api format 命令\u003C\u002Fh4>\n\u003Cp>递归格式化指定目录下的 api 文件。具体用法：\u003Ccode>goctl api format [flags]\u003C\u002Fcode>。其中 flags 可以是\u003Ccode>--declare\u003C\u002Fcode>、\u003Ccode>--dir\u003C\u002Fcode>和\u003Ccode>--stdin\u003C\u002Fcode>。\u003C\u002Fp>\n\u003Cdiv class=\"ssr-table-wrap\">\u003Cbutton class=\"ssr-table-fs-btn\" type=\"button\" aria-label=\"全屏查看表格\" title=\"全屏\">\u003Csvg viewBox=\"0 0 24 24\" width=\"17\" height=\"17\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M5 5h6v2H7v4H5V5zm14 0v6h-2V7h-4V5h6zM5 19v-6h2v4h4v2H5zm14 0h-6v-2h4v-4h2v6z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cdiv class=\"ssr-table-scroll\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>参数字段\u003C\u002Fth>\n\u003Cth>参数类型\u003C\u002Fth>\n\u003Cth>是否必填\u003C\u002Fth>\n\u003Cth>默认值\u003C\u002Fth>\n\u003Cth>参数说明\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>declare\u003C\u002Ftd>\n\u003Ctd>boolean\u003C\u002Ftd>\n\u003Ctd>NO\u003C\u002Ftd>\n\u003Ctd>false\u003C\u002Ftd>\n\u003Ctd>是否检测上下文\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>dir\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>YES\u003C\u002Ftd>\n\u003Ctd>空字符串\u003C\u002Ftd>\n\u003Ctd>后面的参数必须是\u003Ccode>.api\u003C\u002Fcode>文件所在目录的路径，这个目录的路径可以是相对路径或绝对路径\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>stdin\u003C\u002Ftd>\n\u003Ctd>boolean\u003C\u002Ftd>\n\u003Ctd>NO\u003C\u002Ftd>\n\u003Ctd>false\u003C\u002Ftd>\n\u003Ctd>是否格式化终端输入的 api 内容\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Ch4 id=\"h4-7-3-goctl-api-go-\">3. goctl api go 命令\u003C\u002Fh4>\n\u003Cp>根据 api 文件生成 Go HTTP 代码。具体用法：\u003Ccode>goctl api go [flags]\u003C\u002Fcode>。\u003C\u002Fp>\n\u003Cdiv class=\"ssr-table-wrap\">\u003Cbutton class=\"ssr-table-fs-btn\" type=\"button\" aria-label=\"全屏查看表格\" title=\"全屏\">\u003Csvg viewBox=\"0 0 24 24\" width=\"17\" height=\"17\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M5 5h6v2H7v4H5V5zm14 0v6h-2V7h-4V5h6zM5 19v-6h2v4h4v2H5zm14 0h-6v-2h4v-4h2v6z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cdiv class=\"ssr-table-scroll\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>参数字段\u003C\u002Fth>\n\u003Cth>参数类型\u003C\u002Fth>\n\u003Cth>是否必填\u003C\u002Fth>\n\u003Cth>默认值\u003C\u002Fth>\n\u003Cth>参数说明\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>api\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>YES\u003C\u002Ftd>\n\u003Ctd>空字符串\u003C\u002Ftd>\n\u003Ctd>api 文件路径\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>branch\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>NO\u003C\u002Ftd>\n\u003Ctd>空字符串\u003C\u002Ftd>\n\u003Ctd>远程模板所在 git 分支名称，仅当 \u003Ccode>remote\u003C\u002Fcode> 有值时使用\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>dir\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>NO\u003C\u002Ftd>\n\u003Ctd>当前工作目录\u003C\u002Ftd>\n\u003Ctd>代码输出目录\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>home\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>NO\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>${HOME}\u002F.goctl\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>本地模板文件目录\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>remote\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>NO\u003C\u002Ftd>\n\u003Ctd>空字符串\u003C\u002Ftd>\n\u003Ctd>远程模板所在 git 仓库地址，当此字段传值时，优先级高于 \u003Ccode>home\u003C\u002Fcode> 字段值\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>style\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>NO\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>gozero\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>输出文件和目录的命名风格格式化符号，详情见\u003Ca href=\"https:\u002F\u002Fgo-zero.dev\u002Fdocs\u002Ftutorials\u002Fcli\u002Fstyle\"> 文件风格\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Ch4 id=\"h4-8-4-goctl-api-new-\">4. goctl api new 命令\u003C\u002Fh4>\n\u003Cp>快速生成 Go HTTP 服务，开发者需要在终端指定服务名称参数，输出目录为当前工作目录。具体用法：\u003Ccode>goctl api new [flags] server-name\u003C\u002Fcode>。\u003C\u002Fp>\n\u003Cdiv class=\"ssr-table-wrap\">\u003Cbutton class=\"ssr-table-fs-btn\" type=\"button\" aria-label=\"全屏查看表格\" title=\"全屏\">\u003Csvg viewBox=\"0 0 24 24\" width=\"17\" height=\"17\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M5 5h6v2H7v4H5V5zm14 0v6h-2V7h-4V5h6zM5 19v-6h2v4h4v2H5zm14 0h-6v-2h4v-4h2v6z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cdiv class=\"ssr-table-scroll\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>参数字段\u003C\u002Fth>\n\u003Cth>参数类型\u003C\u002Fth>\n\u003Cth>是否必填\u003C\u002Fth>\n\u003Cth>默认值\u003C\u002Fth>\n\u003Cth>参数说明\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>branch\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>NO\u003C\u002Ftd>\n\u003Ctd>空字符串\u003C\u002Ftd>\n\u003Ctd>远程模板所在 git 分支名称，仅当 \u003Ccode>remote\u003C\u002Fcode> 有值时使用\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>home\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>NO\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>${HOME}\u002F.goctl\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>本地模板文件目录\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>remote\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>NO\u003C\u002Ftd>\n\u003Ctd>空字符串\u003C\u002Ftd>\n\u003Ctd>远程模板所在 git 仓库地址，当此字段传值时，优先级高于 \u003Ccode>home\u003C\u002Fcode> 字段值\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>style\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>NO\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>gozero\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>输出文件和目录的命名风格格式化符号，详情见\u003Ca href=\"https:\u002F\u002Fgo-zero.dev\u002Fdocs\u002Ftutorials\u002Fcli\u002Fstyle\"> 文件风格\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Ch4 id=\"h4-9-5-goctl-api-plugin-\">5. goctl api plugin 命令\u003C\u002Fh4>\n\u003Cp>用于引用插件生成代码，开发者需要在终端指定插件名称、参数等信息。具体用法：\u003Ccode>goctl api plugin [flags]\u003C\u002Fcode>。\u003C\u002Fp>\n\u003Cdiv class=\"ssr-table-wrap\">\u003Cbutton class=\"ssr-table-fs-btn\" type=\"button\" aria-label=\"全屏查看表格\" title=\"全屏\">\u003Csvg viewBox=\"0 0 24 24\" width=\"17\" height=\"17\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M5 5h6v2H7v4H5V5zm14 0v6h-2V7h-4V5h6zM5 19v-6h2v4h4v2H5zm14 0h-6v-2h4v-4h2v6z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cdiv class=\"ssr-table-scroll\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>参数字段\u003C\u002Fth>\n\u003Cth>参数类型\u003C\u002Fth>\n\u003Cth>是否必填\u003C\u002Fth>\n\u003Cth>默认值\u003C\u002Fth>\n\u003Cth>参数说明\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>api\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>YES\u003C\u002Ftd>\n\u003Ctd>空字符串\u003C\u002Ftd>\n\u003Ctd>api 文件路径\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>dir\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>NO\u003C\u002Ftd>\n\u003Ctd>当前工作目录\u003C\u002Ftd>\n\u003Ctd>指定了插件处理后的文件存放的位置\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>plugin\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>YES\u003C\u002Ftd>\n\u003Ctd>空字符串\u003C\u002Ftd>\n\u003Ctd>插件可执行文件所在路径，支持本地和 http 文件\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>style\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>NO\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>gozero\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>输出文件和目录的命名风格格式化符号，详情见\u003Ca href=\"https:\u002F\u002Fgo-zero.dev\u002Fdocs\u002Ftutorials\u002Fcli\u002Fstyle\"> 文件风格\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Ch4 id=\"h4-10-6-goctl-api-validate-\">6. goctl api validate 命令\u003C\u002Fh4>\n\u003Cp>校验 api 文件是否符合规范。具体用法：\u003Ccode>goctl api validate [flags]\u003C\u002Fcode>。\u003C\u002Fp>\n\u003Cdiv class=\"ssr-table-wrap\">\u003Cbutton class=\"ssr-table-fs-btn\" type=\"button\" aria-label=\"全屏查看表格\" title=\"全屏\">\u003Csvg viewBox=\"0 0 24 24\" width=\"17\" height=\"17\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M5 5h6v2H7v4H5V5zm14 0v6h-2V7h-4V5h6zM5 19v-6h2v4h4v2H5zm14 0h-6v-2h4v-4h2v6z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cdiv class=\"ssr-table-scroll\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>参数字段\u003C\u002Fth>\n\u003Cth>参数类型\u003C\u002Fth>\n\u003Cth>是否必填\u003C\u002Fth>\n\u003Cth>默认值\u003C\u002Fth>\n\u003Cth>参数说明\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>api\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>YES\u003C\u002Ftd>\n\u003Ctd>空字符串\u003C\u002Ftd>\n\u003Ctd>api 文件路径\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Ch3 id=\"h3-11-goctl-rpc-\">goctl rpc 命令\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>用法:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>goctl rpc [flags]\u003C\u002Fli>\n\u003Cli>goctl rpc [command]\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>flags 这里不做介绍，详细看一看 command 有哪些：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>new 生成 rpc 演示服务\u003C\u002Fli>\n\u003Cli>protoc 生成 grpc 代码\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4 id=\"h4-12-1-goctl-rpc-new-\">1. goctl rpc new 命令\u003C\u002Fh4>\n\u003Cp>快速生成一个 rpc 服务，其接收一个终端参数来指定服务名称。具体用法：\u003Ccode>goctl rpc new [flags] rpc-name\u003C\u002Fcode>。\u003C\u002Fp>\n\u003Cdiv class=\"ssr-table-wrap\">\u003Cbutton class=\"ssr-table-fs-btn\" type=\"button\" aria-label=\"全屏查看表格\" title=\"全屏\">\u003Csvg viewBox=\"0 0 24 24\" width=\"17\" height=\"17\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M5 5h6v2H7v4H5V5zm14 0v6h-2V7h-4V5h6zM5 19v-6h2v4h4v2H5zm14 0h-6v-2h4v-4h2v6z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cdiv class=\"ssr-table-scroll\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>参数字段\u003C\u002Fth>\n\u003Cth>参数类型\u003C\u002Fth>\n\u003Cth>是否必填\u003C\u002Fth>\n\u003Cth>默认值\u003C\u002Fth>\n\u003Cth>参数说明\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>branch\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>NO\u003C\u002Ftd>\n\u003Ctd>空字符串\u003C\u002Ftd>\n\u003Ctd>模板仓库分支，配合 --remote 使用\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>home\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>NO\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>~\u002F.goctl\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>模板仓库本地路径，优先级高于 --remote\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>idea\u003C\u002Ftd>\n\u003Ctd>bool\u003C\u002Ftd>\n\u003Ctd>NO\u003C\u002Ftd>\n\u003Ctd>false\u003C\u002Ftd>\n\u003Ctd>仅 idea 插件用，终端请忽略此字段\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>remote\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>NO\u003C\u002Ftd>\n\u003Ctd>空字符串\u003C\u002Ftd>\n\u003Ctd>模板仓库远程路径\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>style\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>NO\u003C\u002Ftd>\n\u003Ctd>gozero\u003C\u002Ftd>\n\u003Ctd>文件命名风格，详情可参考 \u003Ca href=\"https:\u002F\u002Fgo-zero.dev\u002Fdocs\u002Ftutorials\u002Fcli\u002Fstyle\">文件风格\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Ch4 id=\"h4-13-2-goctl-rpc-protoc-\">2. goctl rpc protoc 命令\u003C\u002Fh4>\n\u003Cp>根据 protobufer 文件生成 rpc 服务。具体用法：\u003Ccode>goctl rpc protoc [flags]\u003C\u002Fcode>。\u003C\u002Fp>\n\u003Cdiv class=\"ssr-table-wrap\">\u003Cbutton class=\"ssr-table-fs-btn\" type=\"button\" aria-label=\"全屏查看表格\" title=\"全屏\">\u003Csvg viewBox=\"0 0 24 24\" width=\"17\" height=\"17\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M5 5h6v2H7v4H5V5zm14 0v6h-2V7h-4V5h6zM5 19v-6h2v4h4v2H5zm14 0h-6v-2h4v-4h2v6z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cdiv class=\"ssr-table-scroll\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>参数字段\u003C\u002Fth>\n\u003Cth>参数类型\u003C\u002Fth>\n\u003Cth>是否必填\u003C\u002Fth>\n\u003Cth>默认值\u003C\u002Fth>\n\u003Cth>参数说明\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>branch\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>NO\u003C\u002Ftd>\n\u003Ctd>空字符串\u003C\u002Ftd>\n\u003Ctd>模板仓库分支，配合 --remote 使用\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>home\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>NO\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>~\u002F.goctl\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>模板仓库本地路径，优先级高于 --remote\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>multiple\u003C\u002Ftd>\n\u003Ctd>bool\u003C\u002Ftd>\n\u003Ctd>NO\u003C\u002Ftd>\n\u003Ctd>false\u003C\u002Ftd>\n\u003Ctd>是否生成多个 rpc 服务\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>remote\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>NO\u003C\u002Ftd>\n\u003Ctd>空字符串\u003C\u002Ftd>\n\u003Ctd>模板仓库远程路径\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>style\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>NO\u003C\u002Ftd>\n\u003Ctd>gozero\u003C\u002Ftd>\n\u003Ctd>输出目录的文件命名风格，详情可参考 \u003Ca href=\"https:\u002F\u002Fgo-zero.dev\u002Fdocs\u002Ftutorials\u002Fcli\u002Fstyle\">文件风格\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>zrpc_out\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>NO\u003C\u002Ftd>\n\u003Ctd>空字符串\u003C\u002Ftd>\n\u003Ctd>生成 go-zero 框架专用的 RPC 服务代码的目录\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cp>除了上述参数外，还支持 protoc 指令的原生参数。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>示例\u003C\u002Fstrong>：goctl rpc protoc demo.proto --go_out=.\u002Fpb --go_grpc_out=.\u002Fpb --zrpc_out=.\u003C\u002Fp>\n\u003Col>\n\u003Cli>–go_out 与 --go_grpc_out 生成的最终目录必须一致。\u003C\u002Fli>\n\u003Cli>–go_out &amp; --go_grpc_out 和 --zrpc_out 的生成的最终目录必须不为同一目录。\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch5 id=\"h5-14-\">注意\u003C\u002Fh5>\n\u003Cp>goctl rpc protoc 指令生成 rpc 服务对 proto 有一些事项须知：\u003C\u002Fp>\n\u003Col>\n\u003Cli>proto 文件中如果有 \u003Ccode>import\u003C\u002Fcode> 语句，goctl 不会对 import 的 proto 文件进行处理，需要自行手动处理。\u003C\u002Fli>\n\u003Cli>rpc service 中的请求体和响应体必须是当前 proto 文件中的 message，不能是 import 的 proto 文件中的 message。\u003C\u002Fli>\n\u003C\u002Fol>\n","项目搭建 其实微服务框架的核心还是围绕 RPC 和 HTTP 通信构建的，提供了诸如服务发现、负载均衡、熔断、限流、跟踪、度量和配置管理等微服务必需的功能。比如利用 文件来定义服务接口和数据结构，然后使用相应的命令来自动生成 Go 的 gRPC 代码；通过 文件和一些工具命令来生成 HTTP 服务的路由、请求和响应的处",""]