目录
  • 前言
  • gRPC Server
    • helloworld.proto
    • main.go
  • grpcurl 安装
    • Mac
    • Docker
    • go tool
    • grpcurl 使用
  • 可能遇到的错误
    • 总结

      前言

      一般情况下测试 gRPC 服务,都是通过客户端来直接请求服务端。如果客户端还没准备好的话,也可以使用 BloomRPC 这样的 GUI 客户端。

      如果环境不支持安装这种 GUI 客户端的话,那么有没有一种工具,类似于 curl 这样的,直接通过终端,在命令行发起请求呢?

      答案肯定是有的,就是本文要介绍的 grpcurl

      gRPC Server

      首先来写一个简单的 gRPC Server:

      helloworld.proto

      syntax = "proto3";
      package proto;
      // 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;
      }
      

      main.go

      package main
      import (
          "context"
          "fmt"
          "grpc-hello/proto"
          "log"
          "net"
          "google.golang.org/grpc"
          "google.golang.org/grpc/reflection"
      )
      func main() {
          lis, err := net.Listen("tcp", ":50051")
          if err != nil {
              log.Fatalf("failed to listen: %v", err)
          }
          server := grpc.NewServer()
          // 注册 grpcurl 所需的 reflection 服务
          reflection.Register(server)
          // 注册业务服务
          proto.RegisterGreeterServer(server, &greeter{})
          fmt.Println("grpc server start ...")
          if err := server.Serve(lis); err != nil {
              log.Fatalf("failed to serve: %v", err)
          }
      }
      type greeter struct {
      }
      func (*greeter) SayHello(ctx context.Context, req *proto.HelloRequest) (*proto.HelloReply, error) {
          fmt.Println(req)
          reply := &proto.HelloReply{Message: "hello"}
          return reply, nil
      }
      

      运行服务:

      go run main.go
      server start ...
      

      grpcurl 安装

      这里我介绍三种方式:

      Mac

      brew install grpcurl
      

      Docker

      # Download image
      docker pull fullstorydev/grpcurl:latest
      # Run the tool
      docker run fullstorydev/grpcurl api.grpc.me:443 list
      

      go tool

      如果有 Go 环境的话,可以通过 go tool 来安装:

      go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest
      

      grpcurl 使用

      查看服务列表:

      grpcurl -plaintext 127.0.0.1:50051 list
      

      输出:

      grpc.reflection.v1alpha.ServerReflection
      proto.Greeter

      查看某个服务的方法列表:

      grpcurl -plaintext 127.0.0.1:50051 list proto.Greeter
      

      输出:

      proto.Greeter.SayHello

      查看方法定义:

      grpcurl -plaintext 127.0.0.1:50051 describe proto.Greeter.SayHello
      

      输出:

      proto.Greeter.SayHello is a method:
      rpc SayHello ( .proto.HelloRequest ) returns ( .proto.HelloReply );

      查看请求参数:

      grpcurl -plaintext 127.0.0.1:50051 describe proto.HelloRequest
      

      输出:

      proto.HelloRequest is a message:
      message HelloRequest {
        string name = 1;
      }

      请求服务:

      grpcurl -d '{"name": "zhangsan"}' -plaintext 127.0.0.1:50051 proto.Greeter.SayHello
      

      输出:

      {
        "message": "hello"
      }

      可能遇到的错误

      可能会遇到两个报错:

      1、gRPC Server 未启用 TLS:

      报错信息:

      Failed to dial target host "127.0.0.1:50051": tls: first record does not look like a TLS handshake
      

      解决:

      请求时增加参数:-plaintext,参考上面的命令。

      2、参数格式错误:

      报错信息:

      Error invoking method "greet.Greeter/SayHello": error getting request data: invalid character 'n' looking for beginning of object key string
      

      解决:

      -d 后面参数为 json 格式,并且需要使用 '' 包裹起来。

      总结

      用这个工具做一些简单的测试还是相当方便的,上手也简单。只要掌握文中提到的几条命令,基本可以涵盖大部分的测试需求了

      扩展阅读:

      https://appimage.github.io/BloomRPC/

      https://github.com/fullstorydev/grpcurl

      源码下载地址:https://github.com/yongxinz/gopher/tree/main/blog

      以上就是grpcurl通过命令行访问gRPC服务的详细内容,更多关于grpcurl命令行访问gRPC服务的资料请关注其它相关文章!

      声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。