Golang-grpc 加 gateway(二)运行(protoc ,gateway,swagger)

正为疯狂 · · 639 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

项目代码
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
看到

image.png

点开接口输入内容测试下


image.png

好了
结束
入门测试没问题了


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:正为疯狂

查看原文:Golang-grpc 加 gateway(二)运行(protoc ,gateway,swagger)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

639 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传