Skip to main content

GRPC接口

下面是以一个grpc 的hello world为例演示

使用protobuf定义接口

关于如何定义protobuf和使用 请参考protobuf官方文档

syntax = "proto3";

package infraboard.mcube.example;
option go_package = "github.com/infraboard/mcube/v2/examples/rpc_grpc/pb";

// Hello world 样例
service Hello {
rpc Greet(GreetRequest) returns(GreetResponse);
}

message GreetRequest {
string name = 1;
}

message GreetResponse {
string msg = 2;
}

实现GRPC服务端

github.com/infraboard/mcube/v2/ioc/config/grpc提供了全局GRPC Server对象

  • grpc.Get().Server(): 获取Server对象

实现完GRPC Server对象后,只需要将对象注册给Server及可通过grpc server对我暴露GRPC服务了

定义HelloGrpc对象:

package (
"github.com/infraboard/mcube/v2/ioc/config/grpc"
)

type HelloGrpc struct {
// 继承自Ioc对象
ioc.ObjectImpl
// 集成Grpc Server对象
pb.UnimplementedHelloServer
}

func (h *HelloGrpc) Name() string {
return "hello_module"
}

func (h *HelloGrpc) Init() error {
pb.RegisterHelloServer(grpc.Get().Server(), h)
return nil
}

实现GRPC服务

func (h *HelloGrpc) Greet(ctx context.Context, in *pb.GreetRequest) (*pb.GreetResponse, error) {
return &pb.GreetResponse{
Msg: fmt.Sprintf("hello, %s", in.Name),
}, nil
}

注册GRPC对象

GRPC是属于服务端控制器, 需要注册到控制器空间

// 注册HTTP接口类
ioc.Controller().Registry(&HelloGrpc{})

启动服务

// 启动应用
err := server.Run(context.Background())
if err != nil {
panic(err)
}

可以看到grpc的对象 hello_module.v1 已经注册, 并且服务监听在127.0.0.1:18080

$ Golang/inforboard/mcube ‹master*› » go run examples/rpc_grpc/server/main.go 
2023-12-18T15:27:03+08:00 INFO config/application/application.go:106 > loaded configs: [log.v1 app.v1] component:APPLICATION
2023-12-18T15:27:03+08:00 INFO config/application/application.go:107 > loaded controllers: [hello_module.v1] component:APPLICATION
2023-12-18T15:27:03+08:00 INFO config/application/application.go:108 > loaded apis: [] component:APPLICATION
2023-12-18T15:27:03+08:00 INFO config/application/grpc.go:119 > GRPC 服务监听地址: 127.0.0.1:18080 component:GRPC

编写客户端并进行测试

编写客户端

func main() {
// 连接到服务
conn, err := grpc.Dial(
"127.0.0.1:18080",
grpc.WithTransportCredentials(insecure.NewCredentials()),
)
if err != nil {
panic(err)
}

resp, err := pb.NewHelloClient(conn).Greet(context.Background(), &pb.GreetRequest{
Name: "old yu",
})
if err != nil {
panic(err)
}
fmt.Println(resp)
}

进行测试

$ Golang/inforboard/mcube ‹master*› » go run examples/rpc_grpc/client/main.go                                                                                            1 ↵
msg:"hello, old yu"

完整的例子请查看: gin