起步
在使用 go-micro 之前,我们需要做一些环境准备。
$ go get github.com/micro/protoc-gen-micro/v2
$ go get -u github.com/golang/protobuf/protoc-gen-go
然后安装 protoc,这是软件下载连接。我用的操作系统是 centos 7,因此下载的是:protoc-3.11.4-linux-x86_64.zip。
$ uzip protoc-3.11.4-linux-x86_64.zip -d protoc
$ mv protoc /usr/local/
$ ln -s /usr/local/protoc/bin/protoc /usr/sbin
如果你在终端能够正常使用 protoc (protoc -h
)命令,那么环境就准备 OK 了。
初探 Micro
第一步:创建项目目录。
$ mkdir hello-world
$ cd hello-world && mkdir server client proto
$ go mod init hello-world
第二步:创建 greeter.proto (vim proto/greeter.proto
)。
syntax="proto3";
package hello_world;
option go_package = "proto";
service Greeter {
rpc Hello(Request) returns (Response) {}
}
message Request {
string name = 1;
}
message Response {
string msg = 1;
}
package hello_world
声明项目名;option go_package = "proto"
声明 proto 的包名。
利用 protoc “解释” proto 文件:
$ protoc --proto_path=$GOPATH/src:. --micro_out=. --go_out=. proto/greeter.proto
第三步:编写服务器 server (vim server/main.go
)。
package main
import (
"context"
"fmt"
"hello-world/proto"
"github.com/micro/go-micro/v2"
)
type Greeter struct{}
func (g *Greeter) Hello(ctx context.Context, req *proto.Request, rsp *proto.Response) error {
rsp.Msg = "Name: " + req.Name // 对客户端传递的字符串做处理
return nil
}
func main() {
// 创建服务器
service := micro.NewService(
micro.Name("greeter"),
)
service.Init()
// 注册 handler
proto.RegisterGreeterHandler(service.Server(), new(Greeter))
if err := service.Run(); err != nil {
fmt.Println(err.Error())
}
}
第四步:编写客户端 client (vim client/main.go
)。
package main
import (
"context"
"fmt"
"hello-world/proto"
"github.com/micro/go-micro/v2"
)
func main() {
service := micro.NewService(micro.Name("greeter.client"))
service.Init()
// 创建 greeter 客户端
greeter := proto.NewGreeterService("greeter", service.Client())
// 调用 Greeter.Hello
rsp, err := greeter.Hello(context.TODO(), &proto.Request{Name: "Zhong"})
if err != nil {
fmt.Println(err.Error())
}
fmt.Println(rsp.Msg)
}
第五步:启动服务器。
$ go run server/main.go
最后启动客户端:
$ go run client/main.go
如果不出意外,客户端运行后打印 Name: Zhong 字样。一个简单的 micro 微服务就搭建好了。
感谢
- 参考 gRPC in Golang
- 参考 Micro Docs
还不快抢沙发