教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 go微服务框架kratos学习笔记二(kratos demo 结构)

go微服务框架kratos学习笔记二(kratos demo 结构)

发布时间:2021-12-07   编辑:jiaochengji.com
教程集为您提供go微服务框架kratos学习笔记二(kratos demo 结构)等资源,欢迎您收藏本站,我们将为您提供最新的go微服务框架kratos学习笔记二(kratos demo 结构)资源
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"/></svg>

<h3>文章目录</h3> <ul><li><ul><li><ul><li>api</li><li>cmd</li><li>configs</li><li>dao</li><li>di</li><li>model</li><li>server</li><li>service</li></ul></li></ul></li></ul>


上篇文章go微服务框架kratos学习笔记一(kratos demo)跑了kratos demo

本章来看看demo项目的整体结构。

目录结构

<pre><code>├─api # 对外接口 ├─cmd # main ├─configs # 配置 ├─internal │ ├─dao #数据访问 │ ├─di #依赖注入 │ ├─model #业务结构体的声明 │ ├─server #grpc、http初始化 │ │ ├─grpc │ │ └─http │ └─service #业务逻辑处理 └─test </code></pre>

官方文档解释

<pre><code>├── CHANGELOG.md ├── OWNERS ├── README.md ├── api # api目录为对外保留的proto文件及生成的pb.go文件 │ ├── api.bm.go │ ├── api.pb.go # 通过go generate生成的pb.go文件 │ ├── api.proto │ └── client.go ├── cmd │ └── main.go # cmd目录为main所在 ├── configs # configs为配置文件目录 │ ├── application.toml # 应用的自定义配置文件,可能是一些业务开关如:useABtest = true │ ├── db.toml # db相关配置 │ ├── grpc.toml # grpc相关配置 │ ├── http.toml # http相关配置 │ ├── memcache.toml # memcache相关配置 │ └── redis.toml # redis相关配置 ├── go.mod ├── go.sum └── internal # internal为项目内部包,包括以下目录: │ ├── dao # dao层,用于数据库、cache、MQ、依赖某业务grpc|http等资源访问 │ │ ├── dao.bts.go │ │ ├── dao.go │ │ ├── db.go │ │ ├── mc.cache.go │ │ ├── mc.go │ │ └── redis.go │ ├── di # 依赖注入层 采用wire静态分析依赖 │ │ ├── app.go │ │ ├── wire.go # wire 声明 │ │ └── wire_gen.go # go generate 生成的代码 │ ├── model # model层,用于声明业务结构体 │ │ └── model.go │ ├── server # server层,用于初始化grpc和http server │ │ ├── grpc # grpc层,用于初始化grpc server和定义method │ │ │ └── server.go │ │ └── http # http层,用于初始化http server和声明handler │ │ └── server.go │ └── service # service层,用于业务逻辑处理,且为方便http和grpc共用方法,建议入参和出参保持grpc风格,且使用pb文件生成代码 │ └── service.go └── test # 测试资源层 用于存放测试相关资源数据 如docker-compose配置 数据库初始化语句等 └── docker-compose.yaml </code></pre>

下面简单看看各层目录,api应该是最复杂的部分,其他的都很好看懂。

<h3>api</h3> <pre><code>├── api # api目录为对外保留的proto文件及生成的pb.go文件 │ ├── api.bm.go │ ├── api.pb.go # 通过go generate生成的pb.go文件 │ ├── api.proto │ └── client.go </code></pre> <blockquote>

api目录主要为对外接口目录、<code>api.bm.go</code> 、<code>apb.pb.go</code> 可以通过kartos tool生成(kratos tool可以基于proto生成http&grpc代码,生成缓存回源代码,生成memcache执行代码,生成swagger文档等工具集) bm、 pb 分别为http和grpc的接口。

</blockquote> <pre><code>C:\server\src\go\src\demp\api>kratos tool protoc --grpc --bm api.proto go get -u github.com/bilibili/kratos/tool/kratos-protoc protoc: 安装成功! 2019/12/23 17:48:51 protoc --proto_path=C:\server\src\go/src --proto_path=C:\server\src\go/pkg/mod/github.com/bilibili/kratos@v0.3.2-0.20191216053608-e8e05452b3b0/third_party --proto_path=C:\server\src\go\src\demp\api --bm_out=:. api.proto 2019/12/23 17:48:52 protoc --proto_path=C:\server\src\go/src --proto_path=C:\server\src\go/pkg/mod/github.com/bilibili/kratos@v0.3.2-0.20191216053608-e8e05452b3b0/third_party --proto_path=C:\server\src\go\src\demp\api --gofast_out=plugins=grpc:. api.proto 2019/12/23 17:48:53 generate api.proto success. </code></pre>

<code>api.bm.go</code> 为http的对外接口, BM server即blademaster为热度http框架gin的裁剪.去除了gin中不需要的部分逻辑,

<blockquote>

api目录主要为对外目录、<code>api.bm.go</code> 、<code>apb.pb.go</code> 可以通过kartos tool生成(kratos tool可以基于proto生成http&grpc代码,生成缓存回源代码,生成memcache执行代码,生成swagger文档等工具集) bm、 pb 分别为http和grpc的接口。

</blockquote>

像上篇文章,protoc 没装 不能运行的情况下,其实可以用kratos tool 来生成 对应go文件的。

<pre><code class="lang-go hljs">C<span class="token punctuation">:</span>\server\src\<span class="token keyword">go</span>\src\demp\api<span class="token operator">></span>kratos tool protoc <span class="token operator">--</span>grpc <span class="token operator">--</span>bm api<span class="token punctuation">.</span>proto I<span class="token punctuation">:</span><span class="token punctuation">.</span> api<span class="token punctuation">.</span>proto client<span class="token punctuation">.</span><span class="token keyword">go</span> 没有子文件夹 I<span class="token punctuation">:</span>\VSProject\<span class="token keyword">go</span>\src\demo\api<span class="token operator">></span>kratos tool protoc <span class="token operator">--</span>grpc <span class="token operator">--</span>bm api<span class="token punctuation">.</span>proto <span class="token keyword">go</span> get <span class="token operator">-</span>u github<span class="token punctuation">.</span>com<span class="token operator">/</span>bilibili<span class="token operator">/</span>kratos<span class="token operator">/</span>tool<span class="token operator">/</span>kratos<span class="token operator">-</span>protoc protoc<span class="token punctuation">:</span> 安装成功<span class="token operator">!</span> <span class="token number">2019</span><span class="token operator">/</span><span class="token number">12</span><span class="token operator">/</span><span class="token number">24</span> <span class="token number">21</span><span class="token punctuation">:</span><span class="token number">13</span><span class="token punctuation">:</span><span class="token number">18</span> <span class="token keyword">go</span> get <span class="token operator">-</span>u github<span class="token punctuation">.</span>com<span class="token operator">/</span>bilibili<span class="token operator">/</span>kratos<span class="token operator">/</span>tool<span class="token operator">/</span>protobuf<span class="token operator">/</span>protoc<span class="token operator">-</span>gen<span class="token operator">-</span>bm <span class="token keyword">go</span><span class="token punctuation">:</span> downloading github<span class="token punctuation">.</span>com<span class="token operator">/</span>siddontang<span class="token operator">/</span><span class="token keyword">go</span> v0<span class="token punctuation">.</span><span class="token number">0.0</span><span class="token operator">-</span><span class="token number">20180604090527</span><span class="token operator">-</span>bdc77568d726 <span class="token keyword">go</span><span class="token punctuation">:</span> extracting github<span class="token punctuation">.</span>com<span class="token operator">/</span>siddontang<span class="token operator">/</span><span class="token keyword">go</span> v0<span class="token punctuation">.</span><span class="token number">0.0</span><span class="token operator">-</span><span class="token number">20180604090527</span><span class="token operator">-</span>bdc77568d726 <span class="token keyword">go</span><span class="token punctuation">:</span> finding google<span class="token punctuation">.</span>golang<span class="token punctuation">.</span>org<span class="token operator">/</span>genproto latest <span class="token keyword">go</span><span class="token punctuation">:</span> finding github<span class="token punctuation">.</span>com<span class="token operator">/</span>siddontang<span class="token operator">/</span><span class="token keyword">go</span> latest <span class="token keyword">go</span><span class="token punctuation">:</span> downloading google<span class="token punctuation">.</span>golang<span class="token punctuation">.</span>org<span class="token operator">/</span>genproto v0<span class="token punctuation">.</span><span class="token number">0.0</span><span class="token operator">-</span><span class="token number">20191223191004</span><span class="token operator">-</span><span class="token number">3</span>caeed10a8bf <span class="token keyword">go</span><span class="token punctuation">:</span> extracting google<span class="token punctuation">.</span>golang<span class="token punctuation">.</span>org<span class="token operator">/</span>genproto v0<span class="token punctuation">.</span><span class="token number">0.0</span><span class="token operator">-</span><span class="token number">20191223191004</span><span class="token operator">-</span><span class="token number">3</span>caeed10a8bf <span class="token number">2019</span><span class="token operator">/</span><span class="token number">12</span><span class="token operator">/</span><span class="token number">24</span> <span class="token number">21</span><span class="token punctuation">:</span><span class="token number">13</span><span class="token punctuation">:</span><span class="token number">37</span> protoc <span class="token operator">--</span>proto_path<span class="token operator">=</span>I<span class="token punctuation">:</span>\VSProject\<span class="token keyword">go</span><span class="token operator">/</span>src <span class="token operator">--</span>proto_path<span class="token operator">=</span>I<span class="token punctuation">:</span>\VSProject\<span class="token keyword">go</span><span class="token operator">/</span>pkg<span class="token operator">/</span>mod<span class="token operator">/</span>github<span class="token punctuation">.</span>com<span class="token operator">/</span>bilibili<span class="token operator">/</span>kratos@v0<span class="token punctuation">.</span><span class="token number">3.2</span><span class="token operator">-</span><span class="token number">0.20191216053608</span><span class="token operator">-</span>e8e05452b3b0<span class="token operator">/</span>third_party <span class="token operator">--</span>proto_path<span class="token operator">=</span>I<span class="token punctuation">:</span>\VSProject\<span class="token keyword">go</span>\src\demo\api <span class="token operator">--</span>bm_out<span class="token operator">=</span><span class="token punctuation">:</span><span class="token punctuation">.</span> api<span class="token punctuation">.</span>proto <span class="token number">2019</span><span class="token operator">/</span><span class="token number">12</span><span class="token operator">/</span><span class="token number">24</span> <span class="token number">21</span><span class="token punctuation">:</span><span class="token number">13</span><span class="token punctuation">:</span><span class="token number">37</span> <span class="token keyword">go</span> get <span class="token operator">-</span>u github<span class="token punctuation">.</span>com<span class="token operator">/</span>gogo<span class="token operator">/</span>protobuf<span class="token operator">/</span>protoc<span class="token operator">-</span>gen<span class="token operator">-</span>gofast <span class="token keyword">go</span><span class="token punctuation">:</span> finding github<span class="token punctuation">.</span>com<span class="token operator">/</span>gogo<span class="token operator">/</span>protobuf v1<span class="token punctuation">.</span><span class="token number">3.1</span> <span class="token keyword">go</span><span class="token punctuation">:</span> downloading github<span class="token punctuation">.</span>com<span class="token operator">/</span>gogo<span class="token operator">/</span>protobuf v1<span class="token punctuation">.</span><span class="token number">3.1</span> <span class="token keyword">go</span><span class="token punctuation">:</span> extracting github<span class="token punctuation">.</span>com<span class="token operator">/</span>gogo<span class="token operator">/</span>protobuf v1<span class="token punctuation">.</span><span class="token number">3.1</span> <span class="token number">2019</span><span class="token operator">/</span><span class="token number">12</span><span class="token operator">/</span><span class="token number">24</span> <span class="token number">21</span><span class="token punctuation">:</span><span class="token number">13</span><span class="token punctuation">:</span><span class="token number">46</span> protoc <span class="token operator">--</span>proto_path<span class="token operator">=</span>I<span class="token punctuation">:</span>\VSProject\<span class="token keyword">go</span><span class="token operator">/</span>src <span class="token operator">--</span>proto_path<span class="token operator">=</span>I<span class="token punctuation">:</span>\VSProject\<span class="token keyword">go</span><span class="token operator">/</span>pkg<span class="token operator">/</span>mod<span class="token operator">/</span>github<span class="token punctuation">.</span>com<span class="token operator">/</span>bilibili<span class="token operator">/</span>kratos@v0<span class="token punctuation">.</span><span class="token number">3.2</span><span class="token operator">-</span><span class="token number">0.20191216053608</span><span class="token operator">-</span>e8e05452b3b0<span class="token operator">/</span>third_party <span class="token operator">--</span>proto_path<span class="token operator">=</span>I<span class="token punctuation">:</span>\VSProject\<span class="token keyword">go</span>\src\demo\api <span class="token operator">--</span>gofast_out<span class="token operator">=</span>plugins<span class="token operator">=</span>grpc<span class="token punctuation">:</span><span class="token punctuation">.</span> api<span class="token punctuation">.</span>proto <span class="token number">2019</span><span class="token operator">/</span><span class="token number">12</span><span class="token operator">/</span><span class="token number">24</span> <span class="token number">21</span><span class="token punctuation">:</span><span class="token number">13</span><span class="token punctuation">:</span><span class="token number">47</span> generate api<span class="token punctuation">.</span>proto success<span class="token punctuation">.</span> I<span class="token punctuation">:</span>\VSProject\<span class="token keyword">go</span>\src\demo\api<span class="token operator">></span>tree <span class="token operator">/</span>f I<span class="token punctuation">:</span><span class="token punctuation">.</span> api<span class="token punctuation">.</span>bm<span class="token punctuation">.</span><span class="token keyword">go</span> api<span class="token punctuation">.</span>pb<span class="token punctuation">.</span><span class="token keyword">go</span> api<span class="token punctuation">.</span>proto client<span class="token punctuation">.</span><span class="token keyword">go</span> </code></pre>

但这样还是不够运行,错误是缺少di.InitApp(), 对比上次笔记(一)的正常项目,会发现还少了一个wire_gen.go文件

<pre><code class="lang-go hljs">I<span class="token punctuation">:</span>\VSProject\<span class="token keyword">go</span>\src\demo\internal\di<span class="token operator">></span>kratos run # command<span class="token operator">-</span>line<span class="token operator">-</span>arguments <span class="token punctuation">.</span>\main<span class="token punctuation">.</span><span class="token keyword">go</span><span class="token punctuation">:</span><span class="token number">21</span><span class="token punctuation">:</span><span class="token number">23</span><span class="token punctuation">:</span> undefined<span class="token punctuation">:</span> di<span class="token punctuation">.</span>InitApp <span class="token builtin">panic</span><span class="token punctuation">:</span> exit status <span class="token number">2</span> goroutine <span class="token number">1</span> <span class="token punctuation">[</span>running<span class="token punctuation">]</span><span class="token punctuation">:</span> main<span class="token punctuation">.</span><span class="token function">runAction</span><span class="token punctuation">(</span><span class="token number">0xc000102160</span><span class="token punctuation">,</span> <span class="token number">0x0</span><span class="token punctuation">,</span> <span class="token number">0xc0000ee170</span><span class="token punctuation">)</span> I<span class="token punctuation">:</span><span class="token operator">/</span>VSProject<span class="token operator">/</span><span class="token keyword">go</span><span class="token operator">/</span>pkg<span class="token operator">/</span>mod<span class="token operator">/</span>github<span class="token punctuation">.</span>com<span class="token operator">/</span>bilibili<span class="token operator">/</span>kratos@v0<span class="token punctuation">.</span><span class="token number">3.2</span><span class="token operator">-</span><span class="token number">0.20191216053608</span><span class="token operator">-</span>e8e05452b3b0<span class="token operator">/</span>tool<span class="token operator">/</span>kratos<span class="token operator">/</span>run<span class="token punctuation">.</span><span class="token keyword">go</span><span class="token punctuation">:</span><span class="token number">25</span> <span class="token operator"> </span><span class="token number">0x36e</span> github<span class="token punctuation">.</span>com<span class="token operator">/</span>urfave<span class="token operator">/</span>cli<span class="token punctuation">.</span><span class="token function">HandleAction</span><span class="token punctuation">(</span><span class="token number">0x603080</span><span class="token punctuation">,</span> <span class="token number">0x65fdc8</span><span class="token punctuation">,</span> <span class="token number">0xc000102160</span><span class="token punctuation">,</span> <span class="token number">0xc000102160</span><span class="token punctuation">,</span> <span class="token number">0x0</span><span class="token punctuation">)</span> I<span class="token punctuation">:</span><span class="token operator">/</span>VSProject<span class="token operator">/</span><span class="token keyword">go</span><span class="token operator">/</span>pkg<span class="token operator">/</span>mod<span class="token operator">/</span>github<span class="token punctuation">.</span>com<span class="token operator">/</span>urfave<span class="token operator">/</span>cli@v1<span class="token punctuation">.</span><span class="token number">22.2</span><span class="token operator">/</span>app<span class="token punctuation">.</span><span class="token keyword">go</span><span class="token punctuation">:</span><span class="token number">523</span> <span class="token operator"> </span><span class="token number">0xc5</span> github<span class="token punctuation">.</span>com<span class="token operator">/</span>urfave<span class="token operator">/</span>cli<span class="token punctuation">.</span>Command<span class="token punctuation">.</span><span class="token function">Run</span><span class="token punctuation">(</span><span class="token number">0x64c994</span><span class="token punctuation">,</span> <span class="token number">0x3</span><span class="token punctuation">,</span> <span class="token number">0x0</span><span class="token punctuation">,</span> <span class="token number">0x0</span><span class="token punctuation">,</span> <span class="token number">0xc0000ee020</span><span class="token punctuation">,</span> <span class="token number">0x1</span><span class="token punctuation">,</span> <span class="token number">0x1</span><span class="token punctuation">,</span> <span class="token number">0x650d90</span><span class="token punctuation">,</span> <span class="token number">0xa</span><span class="token punctuation">,</span> <span class="token number">0x0</span><span class="token punctuation">,</span> <span class="token operator">...</span><span class="token punctuation">)</span> I<span class="token punctuation">:</span><span class="token operator">/</span>VSProject<span class="token operator">/</span><span class="token keyword">go</span><span class="token operator">/</span>pkg<span class="token operator">/</span>mod<span class="token operator">/</span>github<span class="token punctuation">.</span>com<span class="token operator">/</span>urfave<span class="token operator">/</span>cli@v1<span class="token punctuation">.</span><span class="token number">22.2</span><span class="token operator">/</span>command<span class="token punctuation">.</span><span class="token keyword">go</span><span class="token punctuation">:</span><span class="token number">174</span> <span class="token operator"> </span><span class="token number">0x523</span> github<span class="token punctuation">.</span>com<span class="token operator">/</span>urfave<span class="token operator">/</span>cli<span class="token punctuation">.</span><span class="token punctuation">(</span><span class="token operator">*</span>App<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Run</span><span class="token punctuation">(</span><span class="token number">0xc0000e8000</span><span class="token punctuation">,</span> <span class="token number">0xc0000044a0</span><span class="token punctuation">,</span> <span class="token number">0x2</span><span class="token punctuation">,</span> <span class="token number">0x2</span><span class="token punctuation">,</span> <span class="token number">0x0</span><span class="token punctuation">,</span> <span class="token number">0x0</span><span class="token punctuation">)</span> I<span class="token punctuation">:</span><span class="token operator">/</span>VSProject<span class="token operator">/</span><span class="token keyword">go</span><span class="token operator">/</span>pkg<span class="token operator">/</span>mod<span class="token operator">/</span>github<span class="token punctuation">.</span>com<span class="token operator">/</span>urfave<span class="token operator">/</span>cli@v1<span class="token punctuation">.</span><span class="token number">22.2</span><span class="token operator">/</span>app<span class="token punctuation">.</span><span class="token keyword">go</span><span class="token punctuation">:</span><span class="token number">276</span> <span class="token operator"> </span><span class="token number">0x72c</span> main<span class="token punctuation">.</span><span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> I<span class="token punctuation">:</span><span class="token operator">/</span>VSProject<span class="token operator">/</span><span class="token keyword">go</span><span class="token operator">/</span>pkg<span class="token operator">/</span>mod<span class="token operator">/</span>github<span class="token punctuation">.</span>com<span class="token operator">/</span>bilibili<span class="token operator">/</span>kratos@v0<span class="token punctuation">.</span><span class="token number">3.2</span><span class="token operator">-</span><span class="token number">0.20191216053608</span><span class="token operator">-</span>e8e05452b3b0<span class="token operator">/</span>tool<span class="token operator">/</span>kratos<span class="token operator">/</span>main<span class="token punctuation">.</span><span class="token keyword">go</span><span class="token punctuation">:</span><span class="token number">57</span> <span class="token operator"> </span><span class="token number">0x3f7</span> </code></pre>

官方文档解释这个文件也是生成出来的、尝试后,发现go generate可以生成它。

<pre><code class="lang-go hljs">I<span class="token punctuation">:</span>\VSProject\<span class="token keyword">go</span>\src\demo\internal\di<span class="token operator">></span><span class="token keyword">go</span> generate <span class="token keyword">go</span> get <span class="token operator">-</span>u github<span class="token punctuation">.</span>com<span class="token operator">/</span>google<span class="token operator">/</span>wire<span class="token operator">/</span>cmd<span class="token operator">/</span>wire <span class="token keyword">go</span><span class="token punctuation">:</span> finding golang<span class="token punctuation">.</span>org<span class="token operator">/</span>x<span class="token operator">/</span>tools latest wire<span class="token punctuation">:</span> 安装成功<span class="token operator">!</span> wire<span class="token punctuation">:</span> demo<span class="token operator">/</span>internal<span class="token operator">/</span>di<span class="token punctuation">:</span> wrote I<span class="token punctuation">:</span>\VSProject\<span class="token keyword">go</span>\src\demo\internal\di\wire_gen<span class="token punctuation">.</span><span class="token keyword">go</span> I<span class="token punctuation">:</span>\VSProject\<span class="token keyword">go</span>\src\demo\internal\di<span class="token operator">></span> </code></pre>

后来发现其实前面的api路径下的go文件也可以用go generate生成。

<pre><code class="lang-go hljs"><span class="token keyword">go</span> generate <span class="token keyword">go</span> get <span class="token operator">-</span>u github<span class="token punctuation">.</span>com<span class="token operator">/</span>bilibili<span class="token operator">/</span>kratos<span class="token operator">/</span>tool<span class="token operator">/</span>kratos<span class="token operator">-</span>protoc protoc<span class="token punctuation">:</span> 安装成功<span class="token operator">!</span> <span class="token number">2019</span><span class="token operator">/</span><span class="token number">12</span><span class="token operator">/</span><span class="token number">24</span> <span class="token number">21</span><span class="token punctuation">:</span><span class="token number">42</span><span class="token punctuation">:</span><span class="token number">31</span> protoc <span class="token operator">--</span>proto_path<span class="token operator">=</span>I<span class="token punctuation">:</span>\VSProject\<span class="token keyword">go</span><span class="token operator">/</span>src <span class="token operator">--</span>proto_path<span class="token operator">=</span>I<span class="token punctuation">:</span>\VSProject\<span class="token keyword">go</span><span class="token operator">/</span>pkg<span class="token operator">/</span>mod<span class="token operator">/</span>github<span class="token punctuation">.</span>com<span class="token operator">/</span>bilibili<span class="token operator">/</span>kratos@v0<span class="token punctuation">.</span><span class="token number">3.2</span><span class="token operator">-</span><span class="token number">0.20191224125553</span><span class="token operator">-</span><span class="token number">6e1180</span>f53a8e<span class="token operator">/</span>third_party <span class="token operator">--</span>proto_path<span class="token operator">=</span>I<span class="token punctuation">:</span>\VSProject\<span class="token keyword">go</span>\src\demo\api <span class="token operator">--</span>bm_out<span class="token operator">=</span><span class="token punctuation">:</span><span class="token punctuation">.</span> api<span class="token punctuation">.</span>proto <span class="token number">2019</span><span class="token operator">/</span><span class="token number">12</span><span class="token operator">/</span><span class="token number">24</span> <span class="token number">21</span><span class="token punctuation">:</span><span class="token number">42</span><span class="token punctuation">:</span><span class="token number">31</span> protoc <span class="token operator">--</span>proto_path<span class="token operator">=</span>I<span class="token punctuation">:</span>\VSProject\<span class="token keyword">go</span><span class="token operator">/</span>src <span class="token operator">--</span>proto_path<span class="token operator">=</span>I<span class="token punctuation">:</span>\VSProject\<span class="token keyword">go</span><span class="token operator">/</span>pkg<span class="token operator">/</span>mod<span class="token operator">/</span>github<span class="token punctuation">.</span>com<span class="token operator">/</span>bilibili<span class="token operator">/</span>kratos@v0<span class="token punctuation">.</span><span class="token number">3.2</span><span class="token operator">-</span><span class="token number">0.20191224125553</span><span class="token operator">-</span><span class="token number">6e1180</span>f53a8e<span class="token operator">/</span>third_party <span class="token operator">--</span>proto_path<span class="token operator">=</span>I<span class="token punctuation">:</span>\VSProject\<span class="token keyword">go</span>\src\demo\api <span class="token operator">--</span>gofast_out<span class="token operator">=</span>plugins<span class="token operator">=</span>grpc<span class="token punctuation">:</span><span class="token punctuation">.</span> api<span class="token punctuation">.</span>proto <span class="token number">2019</span><span class="token operator">/</span><span class="token number">12</span><span class="token operator">/</span><span class="token number">24</span> <span class="token number">21</span><span class="token punctuation">:</span><span class="token number">42</span><span class="token punctuation">:</span><span class="token number">31</span> generate api<span class="token punctuation">.</span>proto success<span class="token punctuation">.</span> I<span class="token punctuation">:</span>\VSProject\<span class="token keyword">go</span>\src\demo\api<span class="token operator">></span> </code></pre>

回来看两个api下的两个go接口:

<code>api.bm.go</code> 为BM server的对外接口, BM server即blademaster为热度http框架gin的裁剪.去除了gin中不需要的部分逻辑,

<code>api.pb.go</code> 为grpc的对外接口,应该就是生成的protocbuf 文件。

看看熟悉的api.bm.go

<pre><code class="lang-go hljs"> <span class="token comment">// DemoBMServer is the server API for Demo service.</span> <span class="token keyword">type</span> DemoBMServer <span class="token keyword">interface</span> <span class="token punctuation">{</span> <span class="token function">Ping</span><span class="token punctuation">(</span>ctx context<span class="token punctuation">.</span>Context<span class="token punctuation">,</span> req <span class="token operator">*</span>google_protobuf1<span class="token punctuation">.</span>Empty<span class="token punctuation">)</span> <span class="token punctuation">(</span>resp <span class="token operator">*</span>google_protobuf1<span class="token punctuation">.</span>Empty<span class="token punctuation">,</span> err <span class="token builtin">error</span><span class="token punctuation">)</span> <span class="token function">SayHello</span><span class="token punctuation">(</span>ctx context<span class="token punctuation">.</span>Context<span class="token punctuation">,</span> req <span class="token operator">*</span>HelloReq<span class="token punctuation">)</span> <span class="token punctuation">(</span>resp <span class="token operator">*</span>google_protobuf1<span class="token punctuation">.</span>Empty<span class="token punctuation">,</span> err <span class="token builtin">error</span><span class="token punctuation">)</span> <span class="token function">SayHelloURL</span><span class="token punctuation">(</span>ctx context<span class="token punctuation">.</span>Context<span class="token punctuation">,</span> req <span class="token operator">*</span>HelloReq<span class="token punctuation">)</span> <span class="token punctuation">(</span>resp <span class="token operator">*</span>HelloResp<span class="token punctuation">,</span> err <span class="token builtin">error</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">var</span> DemoSvc DemoBMServer <span class="token keyword">func</span> <span class="token function">demoPing</span><span class="token punctuation">(</span>c <span class="token operator">*</span>bm<span class="token punctuation">.</span>Context<span class="token punctuation">)</span> <span class="token punctuation">{</span> p <span class="token operator">:=</span> <span class="token function">new</span><span class="token punctuation">(</span>google_protobuf1<span class="token punctuation">.</span>Empty<span class="token punctuation">)</span> <span class="token keyword">if</span> err <span class="token operator">:=</span> c<span class="token punctuation">.</span><span class="token function">BindWith</span><span class="token punctuation">(</span>p<span class="token punctuation">,</span> binding<span class="token punctuation">.</span><span class="token function">Default</span><span class="token punctuation">(</span>c<span class="token punctuation">.</span>Request<span class="token punctuation">.</span>Method<span class="token punctuation">,</span> c<span class="token punctuation">.</span>Request<span class="token punctuation">.</span>Header<span class="token punctuation">.</span><span class="token function">Get</span><span class="token punctuation">(</span><span class="token string">"Content-Type"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">}</span> resp<span class="token punctuation">,</span> err <span class="token operator">:=</span> DemoSvc<span class="token punctuation">.</span><span class="token function">Ping</span><span class="token punctuation">(</span>c<span class="token punctuation">,</span> p<span class="token punctuation">)</span> c<span class="token punctuation">.</span><span class="token function">JSON</span><span class="token punctuation">(</span>resp<span class="token punctuation">,</span> err<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">demoSayHello</span><span class="token punctuation">(</span>c <span class="token operator">*</span>bm<span class="token punctuation">.</span>Context<span class="token punctuation">)</span> <span class="token punctuation">{</span> p <span class="token operator">:=</span> <span class="token function">new</span><span class="token punctuation">(</span>HelloReq<span class="token punctuation">)</span> <span class="token keyword">if</span> err <span class="token operator">:=</span> c<span class="token punctuation">.</span><span class="token function">BindWith</span><span class="token punctuation">(</span>p<span class="token punctuation">,</span> binding<span class="token punctuation">.</span><span class="token function">Default</span><span class="token punctuation">(</span>c<span class="token punctuation">.</span>Request<span class="token punctuation">.</span>Method<span class="token punctuation">,</span> c<span class="token punctuation">.</span>Request<span class="token punctuation">.</span>Header<span class="token punctuation">.</span><span class="token function">Get</span><span class="token punctuation">(</span><span class="token string">"Content-Type"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">}</span> resp<span class="token punctuation">,</span> err <span class="token operator">:=</span> DemoSvc<span class="token punctuation">.</span><span class="token function">SayHello</span><span class="token punctuation">(</span>c<span class="token punctuation">,</span> p<span class="token punctuation">)</span> c<span class="token punctuation">.</span><span class="token function">JSON</span><span class="token punctuation">(</span>resp<span class="token punctuation">,</span> err<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">demoSayHelloURL</span><span class="token punctuation">(</span>c <span class="token operator">*</span>bm<span class="token punctuation">.</span>Context<span class="token punctuation">)</span> <span class="token punctuation">{</span> p <span class="token operator">:=</span> <span class="token function">new</span><span class="token punctuation">(</span>HelloReq<span class="token punctuation">)</span> <span class="token keyword">if</span> err <span class="token operator">:=</span> c<span class="token punctuation">.</span><span class="token function">BindWith</span><span class="token punctuation">(</span>p<span class="token punctuation">,</span> binding<span class="token punctuation">.</span><span class="token function">Default</span><span class="token punctuation">(</span>c<span class="token punctuation">.</span>Request<span class="token punctuation">.</span>Method<span class="token punctuation">,</span> c<span class="token punctuation">.</span>Request<span class="token punctuation">.</span>Header<span class="token punctuation">.</span><span class="token function">Get</span><span class="token punctuation">(</span><span class="token string">"Content-Type"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">}</span> resp<span class="token punctuation">,</span> err <span class="token operator">:=</span> DemoSvc<span class="token punctuation">.</span><span class="token function">SayHelloURL</span><span class="token punctuation">(</span>c<span class="token punctuation">,</span> p<span class="token punctuation">)</span> c<span class="token punctuation">.</span><span class="token function">JSON</span><span class="token punctuation">(</span>resp<span class="token punctuation">,</span> err<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment">// RegisterDemoBMServer Register the blademaster route</span> <span class="token keyword">func</span> <span class="token function">RegisterDemoBMServer</span><span class="token punctuation">(</span>e <span class="token operator">*</span>bm<span class="token punctuation">.</span>Engine<span class="token punctuation">,</span> server DemoBMServer<span class="token punctuation">)</span> <span class="token punctuation">{</span> DemoSvc <span class="token operator">=</span> server e<span class="token punctuation">.</span><span class="token function">GET</span><span class="token punctuation">(</span><span class="token string">"/demo.service.v1.Demo/Ping"</span><span class="token punctuation">,</span> demoPing<span class="token punctuation">)</span> e<span class="token punctuation">.</span><span class="token function">GET</span><span class="token punctuation">(</span><span class="token string">"/demo.service.v1.Demo/SayHello"</span><span class="token punctuation">,</span> demoSayHello<span class="token punctuation">)</span> e<span class="token punctuation">.</span><span class="token function">GET</span><span class="token punctuation">(</span><span class="token string">"/abc/say_hello"</span><span class="token punctuation">,</span> demoSayHelloURL<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre>

这个文件会生成以bm上下文为参数的三个接口函数,这些三个接口函数分别是在api.proto里面定义的grpc接口

<pre><code class="lang-go hljs">option go_package <span class="token operator">=</span> <span class="token string">"api"</span><span class="token punctuation">;</span> option <span class="token punctuation">(</span>gogoproto<span class="token punctuation">.</span>goproto_getters_all<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span> service Demo <span class="token punctuation">{</span> rpc Ping <span class="token punctuation">(</span><span class="token punctuation">.</span>google<span class="token punctuation">.</span>protobuf<span class="token punctuation">.</span>Empty<span class="token punctuation">)</span> returns <span class="token punctuation">(</span><span class="token punctuation">.</span>google<span class="token punctuation">.</span>protobuf<span class="token punctuation">.</span>Empty<span class="token punctuation">)</span><span class="token punctuation">;</span> rpc SayHello <span class="token punctuation">(</span>HelloReq<span class="token punctuation">)</span> returns <span class="token punctuation">(</span><span class="token punctuation">.</span>google<span class="token punctuation">.</span>protobuf<span class="token punctuation">.</span>Empty<span class="token punctuation">)</span><span class="token punctuation">;</span> rpc <span class="token function">SayHelloURL</span><span class="token punctuation">(</span>HelloReq<span class="token punctuation">)</span> returns <span class="token punctuation">(</span>HelloResp<span class="token punctuation">)</span> <span class="token punctuation">{</span> option <span class="token punctuation">(</span>google<span class="token punctuation">.</span>api<span class="token punctuation">.</span>http<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token punctuation">{</span> get<span class="token punctuation">:</span><span class="token string">"/kratos-demo/say_hello"</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> message HelloReq <span class="token punctuation">{</span> <span class="token builtin">string</span> name <span class="token operator">=</span> <span class="token number">1</span> <span class="token punctuation">[</span><span class="token punctuation">(</span>gogoproto<span class="token punctuation">.</span>moretags<span class="token punctuation">)</span><span class="token operator">=</span><span class="token string">'form:"name" validate:"required"'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> message HelloResp <span class="token punctuation">{</span> <span class="token builtin">string</span> Content <span class="token operator">=</span> <span class="token number">1</span> <span class="token punctuation">[</span><span class="token punctuation">(</span>gogoproto<span class="token punctuation">.</span>jsontag<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token string">'content'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre>

<code>RegisterDemoBMServer()</code> 会将这三个接口函数注册到bm 引擎的路由上。
可以看到生成的三个接口只是对请求的消息做了简单的校验,然后调用service下的service.go 实现这三个的接口业务。

<code>BindWith()</code> 简单看了下 其实就是校验数据格式是否正确。bind.Default()使用默认校验方式 。默认校验方式失败会返回400。

<h3>
cmd</h3> <pre><code class="lang-go hljs">├── cmd │ └── main<span class="token punctuation">.</span><span class="token keyword">go</span> # cmd目录为main所在 </code></pre>

main 函数路径 整个服务入口

也没干什么, 初始化日志、paladin配置包初始化、初始化依赖和服务、跑个循环等待信号退出。

<pre><code class="lang-go hljs"> flag<span class="token punctuation">.</span><span class="token function">Parse</span><span class="token punctuation">(</span><span class="token punctuation">)</span> log<span class="token punctuation">.</span><span class="token function">Init</span><span class="token punctuation">(</span><span class="token boolean">nil</span><span class="token punctuation">)</span> <span class="token comment">// debug flag: log.dir={path}</span> <span class="token keyword">defer</span> log<span class="token punctuation">.</span><span class="token function">Close</span><span class="token punctuation">(</span><span class="token punctuation">)</span> log<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span><span class="token string">"demo start"</span><span class="token punctuation">)</span> paladin<span class="token punctuation">.</span><span class="token function">Init</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token boolean">_</span><span class="token punctuation">,</span> closeFunc<span class="token punctuation">,</span> err <span class="token operator">:=</span> di<span class="token punctuation">.</span><span class="token function">InitApp</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> <span class="token function">panic</span><span class="token punctuation">(</span>err<span class="token punctuation">)</span> <span class="token punctuation">}</span> c <span class="token operator">:=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token keyword">chan</span> os<span class="token punctuation">.</span>Signal<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span> signal<span class="token punctuation">.</span><span class="token function">Notify</span><span class="token punctuation">(</span>c<span class="token punctuation">,</span> syscall<span class="token punctuation">.</span>SIGHUP<span class="token punctuation">,</span> syscall<span class="token punctuation">.</span>SIGQUIT<span class="token punctuation">,</span> syscall<span class="token punctuation">.</span>SIGTERM<span class="token punctuation">,</span> syscall<span class="token punctuation">.</span>SIGINT<span class="token punctuation">)</span> <span class="token keyword">for</span> <span class="token punctuation">{</span> s <span class="token operator">:=</span> <span class="token operator"><-</span>c log<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span><span class="token string">"get a signal %s"</span><span class="token punctuation">,</span> s<span class="token punctuation">.</span><span class="token function">String</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">switch</span> s <span class="token punctuation">{</span> <span class="token keyword">case</span> syscall<span class="token punctuation">.</span>SIGQUIT<span class="token punctuation">,</span> syscall<span class="token punctuation">.</span>SIGTERM<span class="token punctuation">,</span> syscall<span class="token punctuation">.</span>SIGINT<span class="token punctuation">:</span> <span class="token function">closeFunc</span><span class="token punctuation">(</span><span class="token punctuation">)</span> log<span class="token punctuation">.</span><span class="token function">Info</span><span class="token punctuation">(</span><span class="token string">"demo exit"</span><span class="token punctuation">)</span> time<span class="token punctuation">.</span><span class="token function">Sleep</span><span class="token punctuation">(</span>time<span class="token punctuation">.</span>Second<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token keyword">case</span> syscall<span class="token punctuation">.</span>SIGHUP<span class="token punctuation">:</span> <span class="token keyword">default</span><span class="token punctuation">:</span> <span class="token keyword">return</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <h3>
configs</h3>

配置目录、demo使用的toml格式。

<pre><code class="lang-go hljs">├── configs # configs为配置文件目录 │ ├── application<span class="token punctuation">.</span>toml # 应用的自定义配置文件,可能是一些业务开关如:useABtest <span class="token operator">=</span> <span class="token boolean">true</span> │ ├── db<span class="token punctuation">.</span>toml # db相关配置 │ ├── grpc<span class="token punctuation">.</span>toml # grpc相关配置 │ ├── http<span class="token punctuation">.</span>toml # http相关配置 │ ├── memcache<span class="token punctuation">.</span>toml # memcache相关配置 │ └── redis<span class="token punctuation">.</span>toml # redis相关配置 </code></pre>

简单看一个http的

<pre><code class="lang-go hljs"><span class="token punctuation">[</span>Server<span class="token punctuation">]</span> addr <span class="token operator">=</span> <span class="token string">"0.0.0.0:8000"</span> timeout <span class="token operator">=</span> <span class="token string">"1s"</span> </code></pre> <h3>
dao</h3> <pre><code class="lang-go hljs">│ ├── dao # dao层,用于数据库、cache、MQ、依赖某业务grpc<span class="token operator">|</span>http等资源访问 │ │ ├── dao<span class="token punctuation">.</span>bts<span class="token punctuation">.</span><span class="token keyword">go</span> │ │ ├── dao<span class="token punctuation">.</span><span class="token keyword">go</span> │ │ ├── db<span class="token punctuation">.</span><span class="token keyword">go</span> │ │ ├── mc<span class="token punctuation">.</span>cache<span class="token punctuation">.</span><span class="token keyword">go</span> │ │ ├── mc<span class="token punctuation">.</span><span class="token keyword">go</span> │ │ └── redis<span class="token punctuation">.</span><span class="token keyword">go</span> </code></pre>

我目前只了解redis、就看看redis了,是对redis的操作封装。

<pre><code class="lang-go hljs"><span class="token keyword">package</span> dao <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"context"</span> <span class="token string">"github.com/bilibili/kratos/pkg/cache/redis"</span> <span class="token string">"github.com/bilibili/kratos/pkg/conf/paladin"</span> <span class="token string">"github.com/bilibili/kratos/pkg/log"</span> <span class="token punctuation">)</span> <span class="token keyword">func</span> <span class="token function">NewRedis</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">(</span>r <span class="token operator">*</span>redis<span class="token punctuation">.</span>Redis<span class="token punctuation">,</span> err <span class="token builtin">error</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> cfg <span class="token keyword">struct</span> <span class="token punctuation">{</span> Client <span class="token operator">*</span>redis<span class="token punctuation">.</span>Config <span class="token punctuation">}</span> <span class="token keyword">if</span> err <span class="token operator">=</span> paladin<span class="token punctuation">.</span><span class="token function">Get</span><span class="token punctuation">(</span><span class="token string">"redis.toml"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">UnmarshalTOML</span><span class="token punctuation">(</span><span class="token operator">&</span>cfg<span class="token punctuation">)</span><span class="token punctuation">;</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">}</span> r <span class="token operator">=</span> redis<span class="token punctuation">.</span><span class="token function">NewRedis</span><span class="token punctuation">(</span>cfg<span class="token punctuation">.</span>Client<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>d <span class="token operator">*</span>dao<span class="token punctuation">)</span> <span class="token function">PingRedis</span><span class="token punctuation">(</span>ctx context<span class="token punctuation">.</span>Context<span class="token punctuation">)</span> <span class="token punctuation">(</span>err <span class="token builtin">error</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token boolean">_</span><span class="token punctuation">,</span> err <span class="token operator">=</span> d<span class="token punctuation">.</span>redis<span class="token punctuation">.</span><span class="token function">Do</span><span class="token punctuation">(</span>ctx<span class="token punctuation">,</span> <span class="token string">"SET"</span><span class="token punctuation">,</span> <span class="token string">"ping"</span><span class="token punctuation">,</span> <span class="token string">"pong"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> log<span class="token punctuation">.</span><span class="token function">Error</span><span class="token punctuation">(</span><span class="token string">"conn.Set(PING) error(%v)"</span><span class="token punctuation">,</span> err<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token punctuation">}</span> </code></pre>

NewRedis() 返回的的应该是redis的连接池,可通过Get()方法来取条连接,kratos/cache/redis里面对它做了进一步的封装。

<pre><code class="lang-go hljs"><span class="token keyword">type</span> Redis <span class="token keyword">struct</span> <span class="token punctuation">{</span> pool <span class="token operator">*</span>Pool conf <span class="token operator">*</span>Config <span class="token punctuation">}</span> <span class="token comment">// Get gets a connection. The application must close the returned connection.</span> <span class="token comment">// This method always returns a valid connection so that applications can defer</span> <span class="token comment">// error handling to the first use of the connection. If there is an error</span> <span class="token comment">// getting an underlying connection, then the connection Err, Do, Send, Flush</span> <span class="token comment">// and Receive methods return that error.</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>p <span class="token operator">*</span>Pool<span class="token punctuation">)</span> <span class="token function">Get</span><span class="token punctuation">(</span>ctx context<span class="token punctuation">.</span>Context<span class="token punctuation">)</span> Conn <span class="token punctuation">{</span> c<span class="token punctuation">,</span> err <span class="token operator">:=</span> p<span class="token punctuation">.</span>Slice<span class="token punctuation">.</span><span class="token function">Get</span><span class="token punctuation">(</span>ctx<span class="token punctuation">)</span> <span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> errorConnection<span class="token punctuation">{</span>err<span class="token punctuation">}</span> <span class="token punctuation">}</span> c1<span class="token punctuation">,</span> <span class="token boolean">_</span> <span class="token operator">:=</span> c<span class="token punctuation">.</span><span class="token punctuation">(</span>Conn<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token operator">&</span>pooledConnection<span class="token punctuation">{</span>p<span class="token punctuation">:</span> p<span class="token punctuation">,</span> c<span class="token punctuation">:</span> c1<span class="token punctuation">.</span><span class="token function">WithContext</span><span class="token punctuation">(</span>ctx<span class="token punctuation">)</span><span class="token punctuation">,</span> rc<span class="token punctuation">:</span> c1<span class="token punctuation">,</span> now<span class="token punctuation">:</span> beginTime<span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">// Close releases the resources used by the pool.</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>p <span class="token operator">*</span>Pool<span class="token punctuation">)</span> <span class="token function">Close</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">error</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> p<span class="token punctuation">.</span>Slice<span class="token punctuation">.</span><span class="token function">Close</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre> <h3>
di</h3> <pre><code class="lang-go hljs">│ ├── di # 依赖注入层 采用wire静态分析依赖 │ │ ├── app<span class="token punctuation">.</span><span class="token keyword">go</span> │ │ ├── wire<span class="token punctuation">.</span><span class="token keyword">go</span> # wire 声明 │ │ └── wire_gen<span class="token punctuation">.</span><span class="token keyword">go</span> # <span class="token keyword">go</span> generate 生成的代码 </code></pre>

使用了google wire静态分析依赖,它是golang的一个依赖注入解决的工具,这个工具能够自动生成类的依赖关系。
执行wire命令,会读取到wire.NewSet里面的ProviderSet,通过分析各个函数的参数和返回值,来自行解决依赖,可以生成wire_gen.go

<pre><code class="lang-go hljs"><span class="token comment">// build wireinject</span> <span class="token comment">// The build tag makes sure the stub is not built in the final build.</span> <span class="token keyword">package</span> di <span class="token keyword">import</span> <span class="token punctuation">(</span> pb <span class="token string">"demo/api"</span> <span class="token string">"demo/internal/dao"</span> <span class="token string">"demo/internal/server/grpc"</span> <span class="token string">"demo/internal/server/http"</span> <span class="token string">"demo/internal/service"</span> <span class="token string">"github.com/google/wire"</span> <span class="token punctuation">)</span> <span class="token keyword">var</span> daoProvider <span class="token operator">=</span> wire<span class="token punctuation">.</span><span class="token function">NewSet</span><span class="token punctuation">(</span>dao<span class="token punctuation">.</span>New<span class="token punctuation">,</span> dao<span class="token punctuation">.</span>NewDB<span class="token punctuation">,</span> dao<span class="token punctuation">.</span>NewRedis<span class="token punctuation">,</span> dao<span class="token punctuation">.</span>NewMC<span class="token punctuation">)</span> <span class="token keyword">var</span> serviceProvider <span class="token operator">=</span> wire<span class="token punctuation">.</span><span class="token function">NewSet</span><span class="token punctuation">(</span>service<span class="token punctuation">.</span>New<span class="token punctuation">,</span> wire<span class="token punctuation">.</span><span class="token function">Bind</span><span class="token punctuation">(</span><span class="token function">new</span><span class="token punctuation">(</span>pb<span class="token punctuation">.</span>DemoServer<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">new</span><span class="token punctuation">(</span><span class="token operator">*</span>service<span class="token punctuation">.</span>Service<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">func</span> <span class="token function">InitApp</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token operator">*</span>App<span class="token punctuation">,</span> <span class="token keyword">func</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token builtin">error</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">panic</span><span class="token punctuation">(</span>wire<span class="token punctuation">.</span><span class="token function">Build</span><span class="token punctuation">(</span>daoProvider<span class="token punctuation">,</span> serviceProvider<span class="token punctuation">,</span> http<span class="token punctuation">.</span>New<span class="token punctuation">,</span> grpc<span class="token punctuation">.</span>New<span class="token punctuation">,</span> NewApp<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre> <h3>
model</h3> <pre><code class="lang-go hljs">│ ├── model # model层,用于声明业务结构体 │ │ └── model<span class="token punctuation">.</span><span class="token keyword">go</span> </code></pre> <pre><code class="lang-go hljs">您可能感兴趣的文章:
golang微服务框架Kratos使用
go微服务框架kratos学习笔记二(kratos demo 结构)
语言叮叮消息接口_Go 语言 游戏服务器 开发笔记 其一
go-kratos 微服务框架 bm 模块使用
Golang笔记:语法,并发思想,web开发,Go微服务相关
用cmd运行python文件_怎么用cmd运行python文件
electron窗口自适应_Go 限流器系列(3)自适应限流
go 微服务框架_Go版微服务开发框架Micro及标准2019年大整合
想系统学习GO语言(Golang
golang微服务框架对比_Golang 微服务教程(一)

[关闭]
~ ~