環境
操作系統 | win10 1909 |
golang |
go1.14.2 windows/amd64 |
micro | [email protected] |
protoc | protoc-3.12.0-rc-1-win64 |
consul(可選) | consul_1.7.3_windows_amd64 |
安裝
-
protoc
下載對應版本的安裝包https://github.com/protocolbuffers/protobuf/releases
解壓後隨便找個地方放,把bin目錄地址加到環境變量中。
>protoc --version
libprotoc 3.12.0
-
micro和protoc相關的go插件
#設置mod模式和代理
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,https://proxy.golang.org,direct#安裝
go get -u -v github.com/golang/protobuf/protoc-gen-go
go get -u -v google.golang.org/grpc
#這裏若加-u選項貌似會報錯,就不加了
go get -v github.com/micro/micro/v2
go get -u -v github.com/micro/go-micro/v2
go get -v github.com/micro/micro/v2/cmd/protoc-gen-micro@master
順利安裝完畢後,在$GOPATH/bin下應該會有這仨執行文件
-
consul(可選)
因爲micro v2版本官方棄用consul,默認改用了mdns,生產推薦etcd。參考go-micro v2棄用了consul作爲默認的服務發現
所以裝不裝這個都可以。
https://www.consul.io/downloads.html下載對應版本,網速限制的話可以在這裏https://download.csdn.net/download/HJXINKKL/12428749下
解壓後添加路徑到環境變量
>consul -v
Consul v1.7.3
開始創建
-
目錄結構
│ go.mod
│ go.sum
│
└─helloworld
├─message
│ greeter.pb.go
│ greeter.pb.micro.go
│ greeter.proto
│
└─services
client.go
server.go
-
初始化項目
在$GOPATH/src下
mkdir microTest
go mod init microTest
-
定義API
創建helloworld/message/greeter.proto
syntax = "proto3";
package microTest;
option go_package = "helloworld/message";
service Greeter {
rpc Hello (Request) returns (Response) {
}
}
message Request {
string name = 1;
}
message Response {
string greeting = 2;
}
microTest下執行protoc命令,就會在helloworld/message/自動生成greeter.pb.go、greeter.pb.micro.go
protoc --micro_out=. --go_out=. helloworld/message/greeter.proto
-
創建service
創建helloworld/services/server.go文件
package main
import (
"context"
"fmt"
micro "github.com/micro/go-micro/v2"
proto "microTest/helloworld/message"
)
type Greeter struct{}
func (g *Greeter) Hello(ctx context.Context, req *proto.Request, rsp *proto.Response) error {
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)
}
}
-
創建client
創建helloworld/services/client.go文件
package main
import (
"context"
"fmt"
micro "github.com/micro/go-micro/v2"
proto "microTest/helloworld/message"
)
func main() {
// Create a new service
service := micro.NewService(micro.Name("greeter.client"))
// Initialise the client and parse command line flags
service.Init()
// Create new greeter client
greeter := proto.NewGreeterService("greeter", service.Client())
// Call the greeter
rsp, err := greeter.Hello(context.TODO(), &proto.Request{Name: "John"})
if err != nil {
fmt.Println(err)
}
// Print response
fmt.Println(rsp.Greeting)
}
運行服務
-
啓動server
go run helloworld/services/server.go
-
client請求
go run helloworld/services/client.go
此時,有可能會報錯
{"id":"go.micro.client","code":408,"detail":"context deadline exceeded","status":"Request Timeout"}
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x28 pc=0xeef454]
-
定位報錯原因
查看服務列表,greeter服務已經啓動了
> micro list services
greeter
查看指定服務信息
micro get service greeter
service greeter
version latest
ID Address Metadata
greeter-28a0d7a1-4a26-499d-bd9f-364151021f50 10.0.0.1:57647 broker=http,protocol=grpc,registry=mdns,server=grpc,transport=grpc
Endpoint: Greeter.Hello
Request: {
message_state MessageState {
no_unkeyed_literals NoUnkeyedLiterals
do_not_compare DoNotCompare
do_not_copy DoNotCopy
message_info MessageInfo
}
int32 int32
unknown_fields []uint8
name string
}
Response: {
message_state MessageState {
no_unkeyed_literals NoUnkeyedLiterals
do_not_compare DoNotCompare
do_not_copy DoNotCopy
message_info MessageInfo
}
int32 int32
unknown_fields []uint8
greeting string
}
注意到Address地址爲10.0.0.1:57647,也就是micro註冊到默認網段去了,所以導致服務不可達。
-
帶指定server_address參數啓動server
go run helloworld/services/server.go --server_address=localhost:8888
-
再次client請求
go run helloworld/services/client.go
這次返回正常結果
Hello John
-
再次查看指定服務信息
micro get service greeter
ID Address Metadata
greeter-f875a030-436a-420d-a29a-a66249d22381 127.0.0.1:8888 protocol=grpc,registry=mdns,server=grpc,transport=grpc,broker=http
-
服務調用
仿照官網給出的例子
micro call greeter Greeter.Hello '{"name": "John"}'
不管是PowerShell還是CMD都會報 invalid character 的錯誤。
需要將"進行轉義\",纔可以正常執行,注意PowerShell和CMD的不同
使用consul做服務發現
如果非要使用consul的話,就得往client.go和server.go的import中添加
_ "github.com/micro/go-plugins/registry/consul/v2"
-
啓動Consul agent的開發模式
consul agent -dev
-
啓動server
go run helloworld/services/server.go --registry=consul --server_address=localhost:8888
-
client請求
go run helloworld/services/client.go --registry=consul