grpc支持
hade框架增加了对grpc的支持,grpc本质上是一个rpc远程调用,使用protobuf作为数据传输格式,使用http2作为传输协议。 hade框架依赖于grpc的go语言实现库: google.golang.org/grpc, 提供了如下命令行工具:
hade grpc start
启动grpc服务hade grpc stop
停止grpc服务hade grpc restart
重启grpc服务hade grpc state
查看grpc服务状态
如何用hade创建一个grpc服务
1. 创建proto文件
在项目的app/grpc/proto/目录下创建一个proto文件,例如:proto/helloworld.proto
,内容如下:
syntax = "proto3";
option go_package = "examples/helloworld";
option java_multiple_files = true;
option java_package = "io.grpc.examples.helloworld";
option java_outer_classname = "HelloWorldProto";
package helloworld;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
2. 生成go文件
使用grpc官网提供的proto工具生成对应的go文件。
关于proto工具的使用,网上有很多文章了。这里就简要列下mac端的安装命令。
brew install protobuf
go install google.golang.org/protobuf/cmd/protoc-gen-go
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc
生成go文件的命令如下:
protoc --go_out=./app/grpc/proto/ --go-grpc_out=./app/grpc/proto/ ./app/grpc/proto/helloworld.proto
我们可以看到,在目录app/grpc/proto/
下生成了文件
examples/helloworld/helloworld.pb.go
examples/helloworld/helloworld_grpc.pb.go
3. 创建服务
我们要实现pb中定义的这个服务:helloworld.GreeterServer
在 app/grpc/service/ 目录下创建一个文件:app/grpc/service/helloworld/service.go
,内容如下:
package helloworld
import (
"context"
"log"
pb "github.com/gohade/hade/app/grpc/proto/examples/helloworld"
)
// Server is used to implement helloworld.GreeterServer.
type Server struct {
pb.UnimplementedGreeterServer
}
// SayHello implements helloworld.GreeterServer
func (s *Server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
log.Printf("Received: %v", in.GetName())
return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil
}
4. 注册服务
在 app/grpc/kernel.go 文件中注册服务
package grpc
import (
helloworldgen "github.com/gohade/hade/app/grpc/proto/examples/helloworld"
"github.com/gohade/hade/app/grpc/service/helloworld"
"github.com/gohade/hade/framework"
pkggrpc "google.golang.org/grpc"
"google.golang.org/grpc/reflection"
)
// NewGrpcEngine 创建了一个绑定了路由的Web引擎
func NewGrpcEngine(container framework.Container) (*pkggrpc.Server, error) {
s := pkggrpc.NewServer()
// 这里进行服务注册
helloworldgen.RegisterGreeterServer(s, &helloworld.Server{})
reflection.Register(s)
return s, nil
}
这里我们不仅注册了服务,还注册了反射服务,这样我们就可以使用grpcurl工具来测试我们的grpc服务了。
5. 启动服务
先编译自身项目 hade build self
在项目根目录下执行命令:hade grpc start
,启动grpc服务。
➜ hade git:(dev/feature-grpc) ✗ ./hade grpc start
成功启动进程: hade grpc
进程pid: 96290
监听地址: grpc://localhost:8888
基础路径: /Users/jianfengye/Documents/workspace/gohade/hade/
日志路径: /Users/jianfengye/Documents/workspace/gohade/hade/storage/log
运行路径: /Users/jianfengye/Documents/workspace/gohade/hade/storage/runtime
配置路径: /Users/jianfengye/Documents/workspace/gohade/hade/config
你也可以通过命令 hade grpc start -d
启动服务,这样服务会在后台运行。
默认端口是8888,你可以通过命令行参数 --address
来指定端口。
hade git:(dev/feature-grpc) ✗ ./hade grpc start --address=:8777 -d
成功启动进程: hade grpc
进程pid: 97685
监听地址: grpc://localhost:8777
基础路径: /Users/jianfengye/Documents/workspace/gohade/hade/
日志路径: /Users/jianfengye/Documents/workspace/gohade/hade/storage/log
运行路径: /Users/jianfengye/Documents/workspace/gohade/hade/storage/runtime
配置路径: /Users/jianfengye/Documents/workspace/gohade/hade/config
6. 测试服务
假设我们现在用 daemon 方式启动了一个grpc进程在8777端口
我们要使用grpcurl工具来测试我们的grpc服务。
grpcurl 是 Go 语言开源社区开发的工具,需要手工安装:
$ go get github.com/fullstorydev/grpcurl
$ go install github.com/fullstorydev/grpcurl/cmd/grpcurl
➜ hade git:(dev/feature-grpc) ✗ grpcurl -plaintext localhost:8777 list
grpc.reflection.v1.ServerReflection
grpc.reflection.v1alpha.ServerReflection
helloworld.Greeter
可以看到,我们的服务已经注册成功了。
我们来测试一下我们的服务:
➜ hade git:(dev/feature-grpc) ✗ grpcurl -plaintext -d '{"name": "hade"}' localhost:8777 helloworld.Greeter/SayHello
{
"message": "Hello hade"
}
7. 查看grpc服务状态
我们可以通过命令 hade grpc state
来查看grpc服务的状态。
➜ hade git:(dev/feature-grpc) ✗ ./hade grpc state
grpc服务已经启动, pid: 97685
8. 停止grpc服务
我们可以通过命令 hade grpc stop
来停止grpc服务。
➜ hade git:(dev/feature-grpc) ✗ ./hade grpc stop
停止进程: 97685
9. 重启grpc服务
我们可以通过命令 hade grpc restart
来重启grpc服务。
➜ hade git:(dev/feature-grpc) ✗ ./hade grpc restart
结束进程成功:1590
成功启动进程: hade grpc
进程pid: 1622
监听地址: grpc://localhost:8888
基础路径: /Users/jianfengye/Documents/workspace/gohade/hade/
日志路径: /Users/jianfengye/Documents/workspace/gohade/hade/storage/log
运行路径: /Users/jianfengye/Documents/workspace/gohade/hade/storage/runtime
配置路径: /Users/jianfengye/Documents/workspace/gohade/hade/config