今年大部分時間飄過去了,沒怎麼更博和github,如今開發任務也差很少完成了,會比較輕鬆,考慮到從此發展,打算看看微服務框架。java
常見微服務框架主要有這麼幾個python
gizmo
, a microservice toolkit from The New York Times ★
go-micro
, a microservices client/server library ★
gotalk
, async peer communication protocol & library
Kite
, a micro-service framework
gocircuit
, dynamic cloud orchestration
Kratos
,bilibili開源的一套Go微服務框架,包含大量微服務相關框架及工具。mysql
這裏有一篇關於kit
,go-mirco
,gizmo
,Kite
的比較:git
Go 微服務框架對比:Go Micro, Go Kit, Gizmo, Kitegithub
我打算最早看看的框架是kratos
,也不爲何,由於喜歡b站(#^.^#)。golang
github上關於kratos的介紹:sql
名字來源於:《戰神》遊戲以希臘神話爲背景,講述由凡人成爲戰神的奎託斯(Kratos)成爲戰神並展開弒神屠殺的冒險歷程。shell
目標
致力於提供完整的微服務研發體驗,整合相關框架及工具後,微服務治理相關部分可對總體業務開發週期無感,從而更加聚焦於業務交付。對每位開發者而言,整套Kratos框架也是不錯的學習倉庫,能夠了解和參考到bilibili在微服務方面的技術積累和經驗。windows
Features
HTTP Blademaster
:核心基於gin進行模塊化設計,簡單易用、核心足夠輕量;
GRPC Warden
:基於官方gRPC開發,集成discovery服務發現,並融合P2C負載均衡;
Cache
:優雅的接口化設計,很是方便的緩存序列化,推薦結合代理模式overlord;
Database
:集成MySQL/HBase/TiDB,添加熔斷保護和統計支持,可快速發現數據層壓力;
Config
:方便易用的paladin sdk,可配合遠程配置中心,實現配置版本管理和更新;
Log
:相似zap的field實現高性能日誌庫,並結合log-agent實現遠程日誌管理;
Trace
:基於opentracing,集成了全鏈路trace支持(gRPC/HTTP/MySQL/Redis/Memcached);
Kratos Tool
:工具鏈,可快速生成標準項目,或者經過Protobuf生成代碼,很是便捷使用gRPC、HTTP、swagger文檔;
先拉代碼
若是下不動能夠試試配置下代理
記得打開 go111module
kratos本體
相似於go命令,能夠執行各類子工具,如go build
、 go tool
: kratos build
、kratos 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.1 COMMANDS: new, n 建立新項目 build, b kratos build run, r kratos run tool, t kratos tool version, v kratos version self-upgrade kratos self-upgrade help, h Shows a list of commands or help for one command GLOBAL OPTIONS: --help, -h show help --version, -v print the version C:\server\src\test-src\Go_Test\kratos>kratos version Version: 0.3.1 Go version: go1.13.5 Built: 2019/11/06 OS/Arch: windows/amd64
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 1 goroutine 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+incompatible C:\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 for imports. May be specified multiple times; directories will be searched in order. If not given, the current working directory is used. If not found in any of the these directories, the --descriptor_set_in descriptors will be checked 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 type from standard input and write it in binary to standard output. The message type must be defined in PROTO_FILES or their imports. --decode=MESSAGE_TYPE Read a binary message of the given type from standard input and write it in text format to standard output. The message type must be defined in PROTO_FILES or their imports. --decode_raw Read an arbitrary protocol message from standard input and write the raw tag/value pairs in text format to standard output. No PROTO_FILES should be given when using this flag. --descriptor_set_in=FILES Specifies a delimited list of FILES each containing a FileDescriptorSet (a protocol buffer defined in descriptor.proto). The FileDescriptor for each of the PROTO_FILES provided will be loaded from these FileDescriptorSets. If a FileDescriptor appears multiple times, the first occurrence will be used. -oFILE, Writes a FileDescriptorSet (a protocol buffer, --descriptor_set_out=FILE defined in descriptor.proto) containing all of the input files to FILE. --include_imports When using --descriptor_set_out, also include all dependencies of the input files in the set, so that the set is self-contained. --include_source_info When using --descriptor_set_out, do not strip SourceCodeInfo from the FileDescriptorProto. This results in vastly larger descriptors that include information about the original location of each decl in the source file as well as surrounding comments. --dependency_out=FILE Write a dependency output file in the format expected by make. This writes the transitive set 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 messages defined in the given proto files. Groups share the same field number space with the parent message. Extension ranges are counted as occupied fields numbers. --plugin=EXECUTABLE Specifies a plugin executable to use. Normally, protoc searches the PATH for plugins, but you may specify additional executables not in the path using this flag. Additionally, EXECUTABLE may be of the form NAME=PATH, in which case the given plugin name is mapped to the given executable even if the 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 a relative file path is specified, the file will be searched in the working directory. The --proto_path option will not affect how this argument file is searched. Content of the file will be expanded in the position of @<filename> as in the argument list. Note that shell expansion is not applied to the content of the file (i.e., you cannot use quotes, wildcards, escapes, commands, etc.). Each line corresponds to a single argument, even if it contains spaces.
確保protoc可以執行,刪除demo目錄從新建立:
此次可以運行成功了
先試試文檔給的路徑:
不行, 看看源碼:
blademaster
應該就是對gin
框架的裁剪
看看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 = s engine = 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
成功了: