以下是一个基于 go-zero 框架的简单 RPC 服务示例,该示例包括一个服务端和一个客户端通过 gRPC 进行通信。
服务端
1、定义 .proto 文件
在 rpc/add 目录下创建 adder.proto 文件,定义 RPC 服务:
proto
syntax = "proto3";
package adder;
service Adder {
rpc Add(AddRequest) returns (AddResponse) {}
}
message AddRequest {
int32 a = 1;
int32 b = 2;
}
message AddResponse {
int32 result = 1;
}
2、生成代码
使用 protoc 工具生成 Go 代码:
sh
protoc --go_out=plugins=grpc:. adder.proto
3、实现服务
创建 adder_grpc.go 文件,实现 Adder 服务:
go
package adder
import (
"context"
)
type AdderServer struct{}
func (s *AdderServer) Add(ctx context.Context, req *AddRequest) (*AddResponse, error) {
result := req.GetA() + req.GetB()
return &AddResponse{Result: result}, nil
}
4、启动服务
创建 server.go 文件,启动 gRPC 服务:
go
package main
import (
"flag"
"fmt"
"net"
"github.com/zeromicro/go-zero/core/conf"
"github.com/zeromicro/go-zero/core/logx"
"github.com/zeromicro/go-zero/zrpc"
"github.com/your/path/to/rpc/add"
)
var configFile = flag.String("f", "etc/config.yaml", "the config file")
func main() {
flag.Parse()
var c zrpc.RpcServerConf
conf.MustLoad(*configFile, &c)
server := zrpc.MustNewServer(c)
defer server.Stop()
adderServer := &add.AdderServer{}
add.RegisterAdderServer(server.Server, adderServer)
fmt.Printf("Starting rpc server on %s...\n", c.ListenOn)
server.Start()
}
5、配置文件
在 etc 目录下创建 config.yaml 文件,配置服务地址和端口:
yaml
Name: adder
ListenOn: 127.0.0.1:8080
6、启动服务端
运行 server.go 文件,启动 RPC 服务:
sh
go run server.go
客户端
1、创建客户端
创建 client.go 文件,创建 gRPC 客户端:
go
package main
import (
"context"
"fmt"
"time"
"github.com/zeromicro/go-zero/zrpc"
"github.com/your/path/to/rpc/add"
)
func main() {
client := zrpc.MustNewClient("127.0.0.1:8080")
defer client.Conn.Close()
adderClient := add.NewAdderClient(client.Conn)
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
req := &add.AddRequest{
A: 5,
B: 7,
}
resp, err := adderClient.Add(ctx, req)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", resp.GetResult())
}
}
2、运行客户端
运行 client.go 文件,调用 RPC 服务:
sh
go run client.go
输出结果:
Result: 12
至此,一个基于 go-zero 框架的简单 RPC 服务示例完成。