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 协议》,转载必须注明作者和本文链接
讨论数量: 1

你好,打开下载地址没有看到v3版本的,怎么都是 v26.0呢

1个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!