项目代码
https://github.com/hao1990/test_grpc代码基本是来自官方的演示代码
开始吧 继续上一篇的 "hello.proto"
Golang-grpc 加 gateway(一)(protoc ,gateway,swagger)
下面代码, 和github中有略微不同,这里只留下一些必要的代码,配置相关的都暂时去掉
在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的代码也很少的
看官方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
看到
image.png
点开接口输入内容测试下
image.png
好了
结束
入门测试没问题了