kratos微服务框架学习笔记一(kratos-demo)

TAG:本系列笔记以demo为主,适合微服务初学者入门,如果有地方我没具体写的话,那肯定是我也没去看,一笔带过了,所以很多细节可能还是需要自行研究哦 ! 补的话,得看时机,除非不恰饭哈。


常见微服务框架主要有这么几个

gizmogo-microgotalkKitegocircuitKratos
kitgo-mircogizmoKite

Go 微服务框架对比:Go Micro, Go Kit, Gizmo, Kite

kratos

github上关于kratos的介绍:

名字来源于:《战神》游戏以希腊神话为背景,讲述由凡人成为战神的奎托斯(Kratos)成为战神并展开弑神屠杀的冒险历程。

目标
致力于提供完整的微服务研发体验,整合相关框架及工具后,微服务治理相关部分可对整体业务开发周期无感,从而更加聚焦于业务交付。对每位开发者而言,整套Kratos框架也是不错的学习仓库,可以了解和参考到bilibili在微服务方面的技术积累和经验。

FeaturesHTTP BlademasterGRPC WardenCacheDatabaseConfigLogTraceKratos Tool

kratos本体

先拉代码

在这里插入图片描述
如果下不动可以试试配置下代理
在这里插入图片描述

记得打开 go111module

G

kratos本体

go buildgo toolkratos buildkratos run
C:\server\src\test-src\Go_Test\kratos>kratos -h
NAME:kratos - kratos工具集USAGE:kratos [global options] command [command options] [arguments...]VERSION:0.3.1COMMANDS:new, n        创建新项目build, b      kratos buildrun, r        kratos runtool, t       kratos toolversion, v    kratos versionself-upgrade  kratos self-upgradehelp, h       Shows a list of commands or help for one commandGLOBAL OPTIONS:--help, -h     show help--version, -v  print the versionC:\server\src\test-src\Go_Test\kratos>kratos versionVersion:      0.3.1Go version:   go1.13.5Built:        2019/11/06OS/Arch:      windows/amd64

demo

Quick start

Requirments
Go version>=1.13

Installation

GO111MODULE=on && go get -u github.com/bilibili/kratos/tool/kratos
cd $GOPATH/src
kratos new kratos-demo
通过 kratos new 会快速生成基于kratos库的脚手架代码,如生成 kratos-demo

Build & Run

cd kratos-demo/cmd
go build
./cmd -conf …/configs
打开浏览器访问:http://localhost:8000/kratos-demo/start,你会看到输出了Golang 大法好 !!!

官方介绍的有点简洁,咱们动手一步步来:

先进入$GOPATH/src 目录

kratos new demo

C:\server\src\go\src>kratos new demo
go get -u github.com/bilibili/kratos/tool/kratos-gen-project
go: finding golang.org/x/sys latest
go: finding golang.org/x/crypto latest
genproject: 安装成功!
go: finding github.com/bilibili/kratos master
go: downloading github.com/bilibili/kratos v0.3.2-0.20191216053608-e8e05452b3b0
go: downloading google.golang.org/grpc v1.24.0
go: extracting google.golang.org/grpc v1.24.0
go: extracting github.com/bilibili/kratos v0.3.2-0.20191216053608-e8e05452b3b0
go: downloading golang.org/x/net v0.0.0-20191011234655-491137f69257
go: extracting golang.org/x/net v0.0.0-20191011234655-491137f69257
go: downloading github.com/prometheus/client_golang v1.1.0
go: downloading github.com/go-sql-driver/mysql v1.4.1
go: downloading github.com/fsnotify/fsnotify v1.4.7
go: downloading google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03
go: downloading gopkg.in/go-playground/validator.v9 v9.29.1
go: downloading github.com/shirou/gopsutil v2.19.6+incompatible
go: extracting github.com/go-sql-driver/mysql v1.4.1
go: extracting github.com/prometheus/client_golang v1.1.0
go: extracting gopkg.in/go-playground/validator.v9 v9.29.1
go: extracting github.com/fsnotify/fsnotify v1.4.7
go: downloading github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2
go: downloading github.com/gogo/protobuf v1.3.0
go: extracting github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2
go: downloading github.com/go-playground/universal-translator v0.16.0
go: extracting github.com/go-playground/universal-translator v0.16.0
go: extracting google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03
go: extracting github.com/gogo/protobuf v1.3.0
go: downloading github.com/go-playground/locales v0.12.1
go: downloading github.com/prometheus/common v0.6.0
go: downloading github.com/leodido/go-urn v1.1.0
go: extracting github.com/prometheus/common v0.6.0
go: extracting github.com/leodido/go-urn v1.1.0
go: downloading github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90
go: downloading github.com/matttproud/golang_protobuf_extensions v1.0.1
go: extracting github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90
go: extracting github.com/matttproud/golang_protobuf_extensions v1.0.1
go: downloading github.com/beorn7/perks v1.0.1
go: extracting github.com/go-playground/locales v0.12.1
go: extracting github.com/beorn7/perks v1.0.1
go get -u github.com/bilibili/kratos/tool/kratos-protoc
protoc: 安装成功!
2019/12/18 15:38:39 您还没安装protobuf,请进行手动安装:https://github.com/protocolbuffers/protobuf/releases
exit status 1
go get -u github.com/bilibili/kratos/tool/kratos-gen-bts
genbts: 安装成功!
Close: 无声明 忽略此方法
Ping: 无声明 忽略此方法
dao.bts.go: 生成成功
go get -u github.com/bilibili/kratos/tool/kratos-gen-mc
genmc: 安装成功!
mc.cache.go: 生成成功
go get -u github.com/google/wire/cmd/wire
go: finding github.com/google/wire v0.4.0
go: downloading github.com/google/wire v0.4.0
go: extracting github.com/google/wire v0.4.0
go: downloading golang.org/x/tools v0.0.0-20191105231337-689d0f08e67a
go: downloading github.com/google/subcommands v1.0.1
go: extracting github.com/google/subcommands v1.0.1
go: extracting golang.org/x/tools v0.0.0-20191105231337-689d0f08e67a
go: finding golang.org/x/tools latest
go: finding github.com/google/subcommands v1.0.1
go: downloading golang.org/x/tools v0.0.0-20191218040434-6f9e13bbec44
go: extracting golang.org/x/tools v0.0.0-20191218040434-6f9e13bbec44
wire: 安装成功!
wire: C:\server\src\go\src\demo\internal\di\wire.go:17:65: DemoServer not declared by package api
wire: generate failed
exit status 1
Project: demo
OnlyGRPC: false
OnlyHTTP: false
Directory: C:\server\src\go\src\demo项目创建成功.

其中提示了没安装protobuf,需要手动安装,先不管他直接跑demo试试。

2019/12/18 15:38:39 您还没安装protobuf,请进行手动安装:https://github.com/protocolbuffers/protobuf/releases

kratos run

C:\server\src\go\src\demo>kratos run
go: downloading github.com/shirou/gopsutil v2.19.6+incompatible
build command-line-arguments: cannot load github.com/shirou/gopsutil/cpu: github.com/shirou/gopsutil@v2.19.6+incompatible: reading https://goproxy.io/github.com/shirou/gopsutil/@v/v2.19.6+incompatible.zip: 410 Gone
panic: exit status 1goroutine 1 [running]:
main.runAction(0xc0000922c0, 0x0, 0xc000042f30)C:/server/src/go/pkg/mod/github.com/bilibili/kratos@v0.3.1/tool/kratos/run.go:25 +0x36e
github.com/urfave/cli.HandleAction(0x603080, 0x65fda8, 0xc0000922c0, 0xc0000922c0, 0x0)C:/server/src/go/pkg/mod/github.com/urfave/cli@v1.22.2/app.go:523 +0xc5
github.com/urfave/cli.Command.Run(0x64c994, 0x3, 0x0, 0x0, 0xc000042de0, 0x1, 0x1, 0x650d90, 0xa, 0x0, ...)C:/server/src/go/pkg/mod/github.com/urfave/cli@v1.22.2/command.go:174 +0x523
github.com/urfave/cli.(*App).Run(0xc0000ea000, 0xc0000044a0, 0x2, 0x2, 0x0, 0x0)C:/server/src/go/pkg/mod/github.com/urfave/cli@v1.22.2/app.go:276 +0x72c
main.main()C:/server/src/go/pkg/mod/github.com/bilibili/kratos@v0.3.1/tool/kratos/main.go:57 +0x3f7

报错:
cannot load github.com/shirou/gopsutil

gopsutil

go get -u github.com/shirou/gopsutil

C:\server\src\go\src\demo>go get -u github.com/shirou/gopsutil
go: downloading github.com/shirou/gopsutil v2.19.11+incompatible
go: extracting github.com/shirou/gopsutil v2.19.11+incompatibleC:\server\src\go\src\demo>kratos run
go: downloading github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6
go: extracting github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6
go: downloading github.com/go-ole/go-ole v1.2.4
go: extracting github.com/go-ole/go-ole v1.2.4
# demo/api
..\api\client.go:15:68: undefined: DemoClient
..\api\client.go:21:9: undefined: NewDemoClient
panic: exit status 2

可以运行了,但是没跑起来,api路径貌似和protobuf是有关联的,那么安装个protobuf试试。

https://github.com/protocolbuffers/protobuf/releases

下载,我是windows系统在path里面添加下bin目录环境变量即可。

protoc
Usage: protoc [OPTION] PROTO_FILES
Parse PROTO_FILES and generate output based on the options given:-IPATH, --proto_path=PATH   Specify the directory in which to search forimports.  May be specified multiple times;directories will be searched in order.  If notgiven, the current working directory is used.If not found in any of the these directories,the --descriptor_set_in descriptors will bechecked for required proto file.--version                   Show version info and exit.-h, --help                  Show this text and exit.--encode=MESSAGE_TYPE       Read a text-format message of the given typefrom standard input and write it in binaryto standard output.  The message type mustbe defined in PROTO_FILES or their imports.--decode=MESSAGE_TYPE       Read a binary message of the given type fromstandard input and write it in text formatto standard output.  The message type mustbe defined in PROTO_FILES or their imports.--decode_raw                Read an arbitrary protocol message fromstandard input and write the raw tag/valuepairs in text format to standard output.  NoPROTO_FILES should be given when using thisflag.--descriptor_set_in=FILES   Specifies a delimited list of FILESeach containing a FileDescriptorSet (aprotocol buffer defined in descriptor.proto).The FileDescriptor for each of the PROTO_FILESprovided will be loaded from theseFileDescriptorSets. If a FileDescriptorappears multiple times, the first occurrencewill be used.-oFILE,                     Writes a FileDescriptorSet (a protocol buffer,--descriptor_set_out=FILE defined in descriptor.proto) containing all ofthe input files to FILE.--include_imports           When using --descriptor_set_out, also includeall dependencies of the input files in theset, so that the set is self-contained.--include_source_info       When using --descriptor_set_out, do not stripSourceCodeInfo from the FileDescriptorProto.This results in vastly larger descriptors thatinclude information about the originallocation of each decl in the source file aswell as surrounding comments.--dependency_out=FILE       Write a dependency output file in the formatexpected by make. This writes the transitiveset of input file paths to FILE--error_format=FORMAT       Set the format in which to print errors.FORMAT may be 'gcc' (the default) or 'msvs'(Microsoft Visual Studio format).--print_free_field_numbers  Print the free field numbers of the messagesdefined in the given proto files. Groups sharethe same field number space with the parentmessage. Extension ranges are counted asoccupied fields numbers.--plugin=EXECUTABLE         Specifies a plugin executable to use.Normally, protoc searches the PATH forplugins, but you may specify additionalexecutables not in the path using this flag.Additionally, EXECUTABLE may be of the formNAME=PATH, in which case the given plugin nameis mapped to the given executable even ifthe executable's own name differs.--cpp_out=OUT_DIR           Generate C++ header and source.--csharp_out=OUT_DIR        Generate C# source file.--java_out=OUT_DIR          Generate Java source file.--js_out=OUT_DIR            Generate JavaScript source.--objc_out=OUT_DIR          Generate Objective C header and source.--php_out=OUT_DIR           Generate PHP source file.--python_out=OUT_DIR        Generate Python source file.--ruby_out=OUT_DIR          Generate Ruby source file.@<filename>                 Read options and filenames from file. If arelative file path is specified, the filewill be searched in the working directory.The --proto_path option will not affect howthis argument file is searched. Content ofthe file will be expanded in the position of@<filename> as in the argument list. Notethat shell expansion is not applied to thecontent of the file (i.e., you cannot usequotes, wildcards, escapes, commands, etc.).Each line corresponds to a single argument,even if it contains spaces.

确保protoc能够执行,删除demo目录重新创建:

这次能够运行成功了
在这里插入图片描述

先试试文档给的路径:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GjoA6Jd5-1576667177251)(./1576663269062.png)]

不行, 看看源码:

blademastergin

看看demo服务做了什么,

// New new a bm server.
func New(s pb.DemoServer) (engine *bm.Engine, err error) {var (hc struct {Server *bm.ServerConfig})if err = paladin.Get("http.toml").UnmarshalTOML(&hc); err != nil {if err != paladin.ErrNotExist {return}err = nil}svc = sengine = bm.DefaultServer(hc.Server)pb.RegisterDemoBMServer(engine, s)initRouter(engine)err = engine.Start()return
}func initRouter(e *bm.Engine) {e.Ping(ping)g := e.Group("/abc"){g.GET("/start", howToStart)}
}
/abc/start
// Group creates a new router group. You should add all the routes that have common middlwares or the same path prefix.
// For example, all the routes that use a common middlware for authorization could be grouped.
func (group *RouterGroup) Group(relativePath string, handlers ...HandlerFunc) *RouterGroup {return &RouterGroup{Handlers: group.combineHandlers(handlers),basePath: group.calculateAbsolutePath(relativePath),engine:   group.engine,root:     false,}
}

看介绍,大概意思是创建给使用相同中间件和路径前缀的路由使用的路由组。

试试路径
/abc/start

成功了:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IkNOXExS-1576667177253)(./1576663221469.png)]