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. 写代码
- 目录结构如下
- 定义数据结构
在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 协议》,转载必须注明作者和本文链接
你好,打开下载地址没有看到v3版本的,怎么都是 v26.0呢