go学习笔记——Kratos框架
<p>官方文档</p><div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">https://go-kratos.dev/en/docs/getting-started/start/
</pre>
</div>
<h2>1.安装Go</h2>
<p>参考:mac安装go1.20</p>
<h2>2.安装Kratos框架</h2>
<p>kratos依赖protobuf grpc等框架,需要先进行安装</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">brew install grpc
brew install protobuf
brew install protoc-gen-go
brew install protoc-gen-go-grpc
</pre>
</div>
<p>验证</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">protoc --version
libprotoc 3.21.9
protoc-gen-go --version
protoc-gen-go v1.28.1
protoc-gen-go-grpc --version
protoc-gen-go-grpc 1.2.0
</pre>
</div>
<p>安装kratos框架</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">go install github.com/go-kratos/kratos/cmd/kratos/v2@latest
</pre>
</div>
<p>验证</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">kratos --version
kratos version v2.7.2
</pre>
</div>
<p>如果安装的latest的kratos版本过高,想要安装低版本的kratos,通过把latest改成@v2.7.2是不行的,会报</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">go: github.com/go-kratos/kratos/cmd/kratos/v2@v2.7.2: github.com/go-kratos/kratos/cmd/kratos/v2@v2.7.2: invalid version: unknown revision cmd/kratos/v2.7.2
</pre>
</div>
<p>需要通过源码才能安装旧版本的kratos</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">git clone git@github.com:go-kratos/kratos.git
cd kratos
git checkout v2.7.2
cd cmd/kratos
go install
</pre>
</div>
<p>安装特定版本protoc-gen-go-http</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">cd cmd/protoc-gen-go-http
go install
protoc-gen-go-http --version
protoc-gen-go-http v2.7.2
</pre>
</div>
<p>安装特定版本protoc-gem-go-grpc</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@1.3.0
protoc-gen-go-grpc --version
protoc-gen-go-grpc 1.3.0
</pre>
</div>
<p>安装特定版本protoc-gen-go</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">go install google.golang.org/protobuf/cmd/protoc-gen-go@1.28.1
protoc-gen-go --version
protoc-gen-go v1.28.1
</pre>
</div>
<h2>3.创建项目</h2>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># 创建项目
kratos new helloworld
# 也可以指定仓库
kratos new helloworld -r https://gitee.com/go-kratos/kratos-layout.git
</pre>
</div>
<p>编译项目</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">cd helloworld
# 安装依赖
make init
# 生成wire依赖注入
go generate ./...
# 或者使用make
make generate
# 生成bin执行文件
go build -o ./bin/ ./...
# 或者使用make
make build
# 运行
./bin/helloworld -conf ./configs
或者
kratos run
# 测试
curl 'http://127.0.0.1:8000/helloworld/kratos'
{"message":"Hello kratos"}%
</pre>
</div>
<p>项目结构</p>
<p><img src="https://img2024.cnblogs.com/blog/517519/202401/517519-20240114110648722-2006585277.png" width="300" height="569"></p>
<p>Kratos项目如果想要使用<span style="color: rgba(255, 0, 0, 1)"><strong>debug模式</strong>来运行</span></p>
<p>需要将run kind从File修改成Directory,并指定Directory为main.go和wire_gen.go所在的目录,否则会报</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># command-line-arguments
./main.go:77:23: undefined: wireApp
</pre>
</div>
<p>同时还需要额外指定conf文件的路径,否则会报</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">panic: stat ../../configs: no such file or directory
</pre>
</div>
<p>配置如下</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">-conf ./configs/config.yaml
</pre>
</div>
<p>其中config.yaml的路径是相对于Working directory的,如果有多个config文件,也可以写文件夹,比如</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">-conf ./configs
</pre>
</div>
<p><img src="https://img2024.cnblogs.com/blog/517519/202401/517519-20240114150451846-1493406162.png" width="700" height="469"></p>
<p>或者修改成package,指定成package path</p>
<p><img src="https://img2024.cnblogs.com/blog/517519/202401/517519-20240124213410086-1169458254.png" width="700" height="481"></p>
<p>debug成功</p>
<p><img src="https://img2024.cnblogs.com/blog/517519/202401/517519-20240114151508054-414842422.png" width="700" height="392"></p>
<p>如果想要添加额外的API,需要先添加proto文件</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">kratos proto add api/helloworld/demo.proto
</pre>
</div>
<p><img src="https://img2024.cnblogs.com/blog/517519/202401/517519-20240114113025510-266443633.png" width="700" height="430"></p>
<p>编译proto文件生成model和grpc代码</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">kratos proto client api/helloworld/demo/demo.proto
</pre>
</div>
<p>或者使用make命令</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">make api
</pre>
</div>
<p>注意make api命令无法生成validate验证代码,需要额外使用make validate命令,但是kratos proto client命令是可以的</p>
<p>参考:https://go-kratos.dev/docs/component/middleware/validate/</p>
<p><img src="https://img2024.cnblogs.com/blog/517519/202401/517519-20240114113514912-1396594130.png" width="300" height="162"></p>
<p>生成service模板代码</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">kratos proto server api/helloworld/demo/demo.proto -t internal/service
</pre>
</div>
<p><img src="https://img2024.cnblogs.com/blog/517519/202401/517519-20240114114153099-1701711080.png" width="800" height="260"></p>
<p>参考文档:从0到1安装启动Kratos框架 和 https://go-kratos.dev/en/docs/getting-started/usage</p>
<h2>4.Example项目</h2>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">https://github.com/go-kratos/examples
</pre>
</div>
<h2>5.Middleware</h2>
<p>区别于gin的middleware实现的是<span style="color: rgba(255, 0, 0, 1)"><strong>gin.HandlerFunc</strong><span style="color: rgba(0, 0, 0, 1)">以及在gin中<span style="color: rgba(0, 0, 0, 1)">基于<span style="color: rgba(255, 0, 0, 1)"><strong>http.Handler</strong></span>的实现</span></span><span style="color: rgba(0, 0, 0, 1)">,参考: go学习笔记——gin框架</span></span></p>
<h3><span style="color: rgba(255, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)">1.Kratos的middleware.Middleware</span></span></h3>
<p><span style="color: rgba(255, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)">kratos的middleware需要实现的是<span style="color: rgba(255, 0, 0, 1)"><strong>middleware.Middleware</strong><span style="color: rgba(0, 0, 0, 1)">,可以参考官方例子:https://github.com/go-kratos/examples/blob/main/i18n/internal/pkg/middleware/localize/localize.go</span></span></span></span></p>
<p><span style="color: rgba(255, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)">可以通过context的transport中获得header等信息</span></span></span></span></p>
<p><span style="color: rgba(255, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)">在middleware之后执行某些逻辑使用</span></span></span></span></p>
<p> </p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">defer func() {
// Do something on exiting
}()
</pre>
</div>
<p> </p>
<p> 参考:https://go-kratos.dev/docs/component/middleware/overview/</p>
<p>middleware中设置header,参考:go kratos框架跨域中间件实现(v2)</p>
<p>其他:<span>go微服务框架Kratos笔记(七)使用jwt认证中间件</span></p>
<p> </p>
<h3>2.在middle.Middleware中使用白名单</h3>
<p><span style="color: rgba(255, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)">参考:https://github.com/go-kratos/beer-shop/blob/main/app/shop/interface/internal/server/http.go#L21</span></span></span></span></p>
<h3>3.Kratos中使用net/http包的http.Handler</h3>
<p><span style="color: rgba(255, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)">如果想在kratos中使用<span style="color: rgba(255, 0, 0, 1)"><strong>http.Handler</strong></span>,可以参考官方例子:https://github.com/go-kratos/examples/blob/main/http/middlewares/middlewares.go</span></span></span></span></p>
<p><span style="color: rgba(255, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)">以及 https://github.com/tx7do/kratos-cms/blob/main/backend/pkg/middleware/auth/auth.go 或者 </span></span></span></span>04-参数校验中间件</p>
<h3>4.Kratos中使用kratos的http包的http.FilterFunc</h3>
<p>需要引入</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">kratos_http "github.com/go-kratos/kratos/v2/transport/http"
</pre>
</div>
<p>参考:kratos v2 基于http Filter 编写鉴权拦截器 和 Go Kratos2.0 Http请求如何获取IP地址(Filter,Middleware)</p>
<p><span style="color: rgba(0, 0, 0, 1)"> </span></p>
<p> </p>
</div>
<div id="MySignature" role="contentinfo">
<p>本文只发表于博客园和tonglin0325的博客,作者:tonglin0325,转载请注明原文链接:https://www.cnblogs.com/tonglin0325/p/18183178</p><br><br>
来源:https://www.cnblogs.com/tonglin0325/p/18183178
頁:
[1]