go-micro的簡介:
可插入RPC分佈式系統開發的框架,支持json,proto -rpc的編碼方式,可使用consul或者其它方式的服務發現,默認是consul提供隨機散列的負載均衡。
1.服務發現 2.編碼解碼 3.服務端,客戶端 4.發佈訂閱消息
以下是詳情說明下:
1.安裝 micro install
$ go get -u github.com/micro/micro
提示缺少golang/net ,text,tools,crypto, hashicorp/consul幾個包,一般情況下是需要去github上把這些缺少的包都下全,micro才被安裝成功
go get : 其實是go命令的下載與安裝兩步合併,
-u : 只更新已有的代碼包
-v: 顯示更新過程
2.首次如何使用micro,第一次可以利用micro命令自動生成一個模板srv工程(業務服務模塊),也可以自己新建
$ micro new example
(默認爲生成名爲example的srv服務)
—type “api”
—type “web”
—type “srv”
到此已經生成一個工程,工程下面包含一個proto文件夾,下面做詳情說明
3.protoc 說明:
micro 依賴google的protobuf,這裏要熟悉protoc的命令使用
$ protoc --proto_path=. --micro_out=. --go_out=. ./greeter/greeter.proto
--proto_path等同於-I選項:
-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.
--go_out : 生成.go文件後要存放的路徑(這裏應該是和.proto文件放在同一路徑)
./greeter/greeter.proto : 這是我的.proto文件所在位置
報錯:
--micro_out: protoc-gen-micro: 系統找不到指定的文件
提示下面protoc相關依賴包
$ go get github.com/micro/protoc-gen-micro
--go_out: protoc-gen-go: 系統找不到指定的文件。
$ go get -u github.com/golang/protobuf/protoc-gen-go
下載完成之後,再次運行以上命令
$ protoc --proto_path=. --micro_out=. --go_out=. ./greeter/greeter.proto
protoc-gen-micro: program not found or is not executable
--micro_out: protoc-gen-micro: Plugin failed with status code 1.
需要通過如下方式解決
$ protoc \
--plugin=protoc-gen-go=${GOPATH}/bin/protoc-gen-go \
--plugin=protoc-gen-micro=${GOPATH}/bin/protoc-gen-micro \
--proto_path=${GOPATH}/src:. \
--micro_out=. --go_out=. \
proto/*.proto
運行make後再對應目錄下生成這兩個文件
生成example.micro.go
生成example.pb.go
protobuf使用介紹得差不多,後面要把服務跑起來
運行micro
直接go run main.go即可,把服務端的代碼跑起來
package main
import (
"context"
"fmt"
micro "github.com/micro/go-micro"
proto "../greeter"
)
type Greeter struct{}
func (g *Greeter) Call(ctx context.Context, req *proto.HelloRequest, rsp *proto.HelloResponse) error {
fmt.Println("11")
rsp.Greeting = "Hello " + req.Name
return nil
}
func main() {
// Create a new service. Optionally include some options here.
service := micro.NewService(
micro.Name("greeter"),
)
// Init will parse the command line flags.
service.Init()
// Register handler
proto.RegisterGreeterHandler(service.Server(), new(Greeter))
// Run the server
if err := service.Run(); err != nil {
fmt.Println(err)
}
}
傳參方式 : 1.可以在創建時傳入 (構造的方式) 2.可以用命令行方式 (micro.Flags() ) 與go原生接收命令行參數相同
如何調用服務端代碼
方式一客戶端調用(再跑一個相同的服務,main.go文件改成以下方式)
通過protobuf方式進行調用,跨語言
package main
import (
"context"
"fmt"
proto "../greeter"
"github.com/micro/go-micro"
)
func main() {
// Create a new service. Optionally include some options here.
service := micro.NewService(micro.Name("greeter.client"))
service.Init()
// Create new greeter client
greeter := proto.NewGreeterService("greeter", service.Client())
// Call the greeter,通過protobuf生成的函數進行調用其它微服務
rsp, err := greeter.Hello(context.TODO(), &proto.HelloRequest{Name: "John"})
if err != nil {
fmt.Println(err)
}
// Print response
fmt.Println(rsp.Greeting)
}
方式二
以上啓動的srv服務都是不能被http直接調用,需要再啓動micro api
$ micro api
通過http調用 http://localhost:8080/rpc
{ "service": "go.exb", "method": "Example.Call", "request": {"name": "John”} }
也可以通過micro call命令調用服務
$ ./micro call go.exa Example.Call '{"name": "John”}'
go.exb : namespace
Example.Call : 服務端代碼實現的接口
如果需要使用consul的話,可以用以下方式起動集羣或者單機調式
consul 集羣啓動
$ ./consul agent -server -bootstrap-expect 2 -data-dir=data \
-node=n1 -bind=192.168.0.240 -client=0.0.0.0 &
$ ./consul join 192.168.0.112
$ ./consul join 192.168.0.122
consul 單機啓動
$ ./consul agent -dev -client 0.0.0.0 -ui
agent 運行一個consul agent
join 將agent加入到consul集羣
連接遠程consul
--registry_address=127.0.0.1:8500 爲遠程註冊中心地址與端口
$ go run .\service.go --registry_address=127.0.0.1:8500
$ go run client.go --registry_address=127.0.0.1:8500
最後奉上最重要的就是文檔 micro官方文檔 , golang相關micro doc
總結的正確姿勢:
a.安裝micro:具體步驟下面都有了,go get 下載報錯,請自行github下載到gopath下面即可
b.可以使用micro new <工程名> 生成模板,工程目錄下Makefile 和dockerfile都已經配置好了,如果使用模板請忽略下面手寫的代碼
c.使用make build && make run 執行makefile文件裏面命令
d.make命令沒有報錯的話,這時工程就可以運行了,可以用go run main.go 把工程跑起來
e.使用用micro list serivces 查看是否運行成功
f.使用 micro call 調用微服務