protoc 下載地址
https://github.com/protocolbuffers/protobuf/releases
下載好之后,bin 文件夾中有個 protoc 的可執(zhí)行文件,把這個也添加到環(huán)境變量。(可以直接把它放到已經(jīng)添加了環(huán)境變量的文件夾下就可以了,可以避免電腦里寫滿了各種環(huán)境變量,并且常用工具放到一個文件夾也方便管理)
推薦:《go語言》
還有個 protoc-gen-go 也需要放進去,可以用下面的方式下載。
go get -u github.com/golang/protobuf/proto go get -u github.com/golang/protobuf/protoc-gen-go
example
現(xiàn)在讓我們寫一個 demo 來練習(xí)一下。
一共有三個文件,server.go,client.go,greeter.proto
greeter.proto
syntax = "proto3";package protos;service Greeter {
rpc Hello (Request) returns (Response){};}message Request {
string name = 1;}message Response {
string greeting = 2;}
server.go
package mainimport (
"context"
"fmt"
"github.com/micro/go-micro/v2")type Greeter struct {}func (g *Greeter) Hello(context context.Context, req *Request, rsp *Response) error {
rsp.Greeting = "Hello " req.Name return nil}func main() {
service := micro.NewService(
micro.Name("greeter"),
)
service.Init()
err := RegisterGreeterHandler(service.Server(), new(Greeter))
if err != nil {
fmt.Println(err)
}
if err := service.Run(); err != nil {
fmt.Println(err)
}}
client.go
package mainimport (
"context"
"fmt"
"github.com/micro/go-micro/v2")func main() {
service := micro.NewService(micro.Name("greeter.client"))
service.Init()
greeter := NewGreeterService("greeter", service.Client())
rsp, err := greeter.Hello(context.TODO(), &Request{Name: "Zaun pianist"})
if err != nil {
fmt.Println(err)
}
fmt.Println(rsp.Greeting)}
強烈建議使用 go mod 來管理依賴,項目更新速度很快,百度上的很多教程都不行了,安裝過程各種錯誤
這是我的 mod 文件
module hello
go 1.14require (
github.com/golang/protobuf v1.4.0
github.com/micro/go-micro/v2 v2.9.1
google.golang.org/protobuf v1.22.0)
注意,我的 greeter.proto 和 server.go、client.go 文件是放在同一個文件夾下面的
編譯greeter.proto
protoc --micro_out=. --go_out=. greeter.proto
編譯完成之后,會生成兩個 go 源代碼文件:
greeter.pb.gogreeter.pb.micro.go運行
現(xiàn)在可以運行 server 了,這里因為 client 和 server 是放在同一個文件夾,也就是同一個包中,兩個都有 main 函數(shù),所以不能用 go run ./,至于為什么要加上另外兩個,這個是 go 語言編譯器的要求,必須要指明編譯所需要用到的文件。
go run server.go greeter.pb.go greeter.pb.micro.go
可以用 micro 來查看當前正在運行的微服務(wù)
micro list services
也可以在 web 端查看
micro web
如果沒有出錯,這個時候是可以看到服務(wù)已經(jīng)注冊成功了。
$ micro list services go.micro.web greeter
測試
現(xiàn)在可以運行客戶端來測試一下了
go run client.go greeter.pb.go greeter.pb.micro.go
我在測試的時候出了問題,服務(wù)已經(jīng)注冊好了,但是 client 去調(diào)用的時候,缺返回了
{"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]
檢查一下服務(wù)的信息
micro get service greeter
$ micro get service greeter
service greeter
version latest
ID Address Metadata
greeter-5d86321e-86f2-41a6-8230-f015466bf791 10.198.75.60:51395 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
}
注意看里面的 IP 地址,注冊到了 10.198.xx 去了,因此才會報錯???
因此在注冊服務(wù)的時候,指定 IP 地址
go run server.go greeter.pb.go greeter.pb.micro.go --server_address=localhost:8888
這個時候再用 client 調(diào)用就不會出錯了。
$ go run client.go greeter.pb.go greeter.pb.micro.go Hello Zaun pianist
更多關(guān)于云服務(wù)器,域名注冊,虛擬主機的問題,請訪問西部數(shù)碼官網(wǎng):m.ps-sw.cn