go proto 微服務

1711293058發表於2020-04-28

環境是 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. 寫程式碼

  1. 目錄結構如下

go  proto 微服務

  1. 定義資料結構

在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
  1. 服務端

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)
    }
}
  1. 客戶端

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管理介面

go  proto 微服務

開啟服務端

cd server
go run main.go

執行客戶端

cd client
go run main.go
#輸出: Hello User from client
#輸出: 我的年紀是:18

4. web管理端

micro
#開啟 http://localhost:8082/registry

檢視服務

go  proto 微服務

測試服務

go  proto 微服務

5.遇到錯誤

如果執行報錯:etcd undefined: resolver.BuildOption

修改go.mod 的grpc版本為 v1.26.0

go  proto 微服務

6. 參考

參考文章

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章