環境是 mac 系統
1. 下載軟體
1.下載consul
brew install consul
2.下載golang依賴
go get google.golang.org/grpc
go get github.com/golang/protobuf/protoc-gen-go
go get github.com/micro/go-micro //Micro 框架
go get github.com/micro/protoc-gen-micro //protoc micro外掛
go get github.com/micro/micro //micro工具包
3.下載protoc工具
我是mac,選擇下載 protoc-3.11.4-osx-x86_64.zip
#移動到src目錄
sudo mv protoc-3.11.4-osx-x86_64.zip /usr/local/src
#重新命名
mv protoc-3.11.4-osx-x86_64.zip protoc-3.11.4.zip
#解壓
unzip protoc-3.11.4.zip
#建立軟連,只要能把protoc放入可執行環境中即可,隨便哪個目錄啦
ln -s /usr/local/src/protoc-3.11.4/bin/protoc $GOPATH/bin/protoc
2. 寫程式碼
- 目錄結構如下
- 定義資料結構
在protos目錄下面建立user.proto
syntax = "proto3";
service User {
rpc Hello(Request) returns (Response) {}
rpc Age(AgeRequest)returns(AgeResponse){}
}
message AgeRequest {
}
message AgeResponse{
int32 age = 10;
}
message Request {
string name = 1;
}
message Response {
string msg = 1;
}
其中, protos/user.proto檔案是定義的userMessage基礎結構,而message下面的user.proto.go是protoc命令生成的user.proto自動生成的。
protoc -I ./protos/ --go_out=./message user.proto --micro_out=./message/ ./protos/user.proto
#自動生成user.pb.go 和user.pb.micro.go
- 服務端
server/main.go
package main
import (
"context"
proto "demo/go-micro/message"
"fmt"
micro "github.com/micro/go-micro"
)
type User struct{}
func (u *User) Hello(ctx context.Context, req *proto.Request, res *proto.Response) error {
res.Msg = "Hello " + req.Name
return nil
}
func (u *User) Age(ctx context.Context, request *proto.AgeRequest, response *proto.AgeResponse) error {
response.Age = 18
return nil
}
func main() {
service := micro.NewService(
micro.Name("user"),
)
service.Init()
proto.RegisterUserHandler(service.Server(), new(User))
if err := service.Run(); err != nil {
fmt.Println(err)
}
}
- 客戶端
client/main.go
package main
import (
"context"
"fmt"
proto "demo/go-micro/message"
micro "github.com/micro/go-micro"
"strconv"
)
func main() {
service := micro.NewService(micro.Name("user.client"))
service.Init()
user := proto.NewUserService("user", service.Client())
//呼叫Hello方法
res, err := user.Hello(context.TODO(), &proto.Request{Name: "User from client"})
if err != nil {
fmt.Println(err)
}
fmt.Println(res.Msg)
//呼叫Age方法
resAge, errAge := user.Age(context.TODO(), &proto.AgeRequest{})
if errAge != nil {
fmt.Println(errAge)
}
fmt.Println("我的年紀是:" + strconv.Itoa(int(resAge.Age)))
}
3.執行
開啟consul服務
consul agent -dev
開啟 http://127.0.0.1:8500,可以看到ui管理介面
開啟服務端
cd server
go run main.go
執行客戶端
cd client
go run main.go
#輸出: Hello User from client
#輸出: 我的年紀是:18
4. web管理端
micro
#開啟 http://localhost:8082/registry
檢視服務
測試服務
5.遇到錯誤
如果執行報錯:etcd undefined: resolver.BuildOption
修改go.mod 的grpc版本為 v1.26.0
6. 參考
本作品採用《CC 協議》,轉載必須註明作者和本文連結