go proto 微服务

环境是 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 协议》,转载必须注明作者和本文链接