项目代码
https://github.com/hao1990/test_grpc
代码基本是来自官方的演示代码
开始吧 继续上一篇的 "hello.proto"
Golang-grpc 加 gateway(一)(protoc ,gateway,swagger)
下面代码, 和github中有略微不同,这里只留下一些必要的代码,配置相关的都暂时去掉
启动 grpc service
在hello.proto 中定义了 HelloService
// Hello服务
service HelloService {
// 接口SayHello
rpc SayHello (HelloRequest) returns (HelloReply){
option (google.api.http) = {
post:"/v1/examples/sayhello"
body:"*"
};
}
}
需要在go中实现这个服务和服务中的方法
实现定义的服务
代码 service/service.go
定义 一个HelloService 都结构体
type HelloService struct {
}
// SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloReply, error)
func (s *HelloService) SayHello(ctx context.Context, in *hello.HelloRequest) (*hello.HelloReply, error) {
log.Printf("Received: %v", in.Name)
var messge string = fmt.Sprintf("Hello , %v ; your age is %d", in.Name, in.Age)
return &hello.HelloReply{Message: messge}, nil
}
启动服务 main方法
func main() {
lis, err := net.Listen("tcp", "127.0.0.1:50123")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
grpcService := grpc.NewServer()
pb.RegisterHelloServiceServer(grpcService, &HelloService{})
if err := grpcService.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
运行
go run service/service.go
调用服务
代码 client/client.go
必要的代码
func main() {
// Set up a connection to the server.
conn, err := grpc.Dial("127.0.0.1:50123", grpc.WithInsecure())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewHelloServiceClient(conn)
// Contact the server and print out its response.
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
r, err := c.SayHello(ctx, &pb.HelloRequest{Name: "haohao_client", Age: 20})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", r.Message)
}
测试下,另启一个终端
go run client/client.go
可以看到 service 的终端输出
Received: haohao_client
client的终端输出了
Hello , haohao_client ; your age is 20
gateway
其实gateway的代码也很少的
看官方github中第6步就几行代码“6.Write an entrypoint”
https://github.com/grpc-ecosystem/grpc-gateway
代码 /gateway/main.go
必要的代码就是 newGateway()方法
func newGateway(ctx context.Context, opts ...runtime.ServeMuxOption) (http.Handler, error) {
mux := runtime.NewServeMux(runtime.WithMarshalerOption(runtime.MIMEWildcard, &runtime.JSONPb{OrigName: true, EmitDefaults: true}))
dialOpts := []grpc.DialOption{grpc.WithInsecure()}
//注册 hello service
err := gw.RegisterHelloServiceHandlerFromEndpoint(ctx, mux, *endpoint, dialOpts)
if err != nil {
return nil, err
}
return mux, nil
}
以后添加服务后,只需要在这里注册新的服务即可
主要“gw.RegisterHelloServiceHandlerFromEndpoint”这里,这方法是在自动生成的代码 hello.pb.gw.go中的。
当添加了新服务时只要在下面继续 Register。如 gw.Register*****HandlerFromEndpoint
可以在 hello.pb.gw.go 中看到 这个方法:
func RegisterHelloServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) {
....
}
其他代码时运行 swagger的
运行一下看看
cd进入 gateway目录
然后
go run main.go
在浏览器打开
http://127.0.0.1:8123/swagger
看到
点开接口输入内容测试下
好了
结束
入门测试没问题了
有疑问加站长微信联系(非本文作者)