gRPC之grpcurl

1、grpcurl

grpcurl项目地址 :https://github.com/fullstorydev/grpcurl

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

BloomRPC (https://appimage.github.io/BloomRPC/)这样的 GUI 客户端。

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

行发起请求呢?答案肯定是有的,就是本文要介绍的 grpcurl

grpcurl是一个命令行工具,使用它可以在命令行中访问gRPC服务,就像使用curl访问http服务一样。

下面通过一个案例来展示grpcurl的使用。

1.1 在gRPC服务中注册reflection服务

gRPC服务是使用Protobuf(PB)协议的,而PB提供了在运行时获取Proto定义信息的反射功能。

grpc-go https://github.com/grpc/grpc-go中的google.golang.org/grpc/reflection

http://google.golang.org/grpc/reflection包就对这个反射功能提供了支持。

1.2 编写proto

hello.proto文件的内容:

syntax = "proto3";package proto;option go_package = "./proto;proto";// The greeting service definition.
service Greeter {// Sends a greetingrpc 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;
}

1.3 编译proto

$ protoc -I . --go_out=plugins=grpc:. ./hello.proto

1.4 服务端

server.go内容如下:

package mainimport ("context""fmt""demo/proto""google.golang.org/grpc""google.golang.org/grpc/reflection""log""net"
)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
}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)}
}

main.go中使用reflection.Register(server)注册了reflection服务。

运行服务:

[root@zsx demo]# go run server.go
grpc server start ...
# 项目结构
$ tree demo/
demo/
├── go.mod
├── go.sum
├── hello.proto
├── proto
│   └── hello.pb.go
├── request.json
└── server.go1 directory, 6 files

1.5 grpcurl 安装

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

# $ go install github.com/fullstorydev/grpcurl/cmd/grpcurl
$ go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest
$ grpcurl -version
grpcurl dev build <no version set>

1.6 grpcurl 使用

在使用 grpcurl 时,需要通过 -cert-key 参数设置公钥和私钥文件,表示链接启用了TLS协议的服务。

对于没有启用TLS协议的 gRPC 服务,通过 -plaintext 参数忽略 TLS 证书的验证过程。

如果是 Unix Socket 协议,则需要指定 -unix 参数。

1.6.1 查看服务列表
$ grpcurl -plaintext 127.0.0.1:50051 list

输出:

[root@zsx demo]# grpcurl -plaintext 127.0.0.1:50051 list
grpc.reflection.v1alpha.ServerReflection
proto.Greeter
1.6.2 查看某个服务的方法列表
$ grpcurl -plaintext 127.0.0.1:50051 list proto.Greeter

输出:

[root@zsx demo]# grpcurl -plaintext 127.0.0.1:50051 list proto.Greeter
proto.Greeter.SayHello
1.6.3 查看方法定义
$ grpcurl -plaintext 127.0.0.1:50051 describe proto.Greeter.SayHello

输出:

[root@zsx demo]# grpcurl -plaintext 127.0.0.1:50051 describe proto.Greeter.SayHello
proto.Greeter.SayHello is a method:
rpc SayHello ( .proto.HelloRequest ) returns ( .proto.HelloReply );
1.6.4 查看请求参数
$ grpcurl -plaintext 127.0.0.1:50051 describe proto.HelloRequest

输出:

[root@zsx demo]# grpcurl -plaintext 127.0.0.1:50051 describe proto.HelloRequest
proto.HelloRequest is a message:
message HelloRequest {string name = 1;
}
1.6.5 请求服务
$ grpcurl -plaintext -d "{\"name\":\"rao\"}" 127.0.0.1:50051 proto.Greeter/SayHello

输出:

[root@zsx demo]# grpcurl -plaintext -d "{\"name\":\"rao\"}" 127.0.0.1:50051 proto.Greeter/SayHello
{"message": "hello"
}

-d 参数后面也可以跟 @,表示从标准输入读取 json 参数,一般用于输入比较复杂的 json 数据,也可以用于测试

流方法。

$ cat request.json | grpcurl -d @ -plaintext 127.0.0.1:50051 proto.Greeter.SayHello

输出:

[root@zsx demo]# cat request.json | grpcurl -d @ -plaintext 127.0.0.1:50051 proto.Greeter.SayHello
{"message": "hello"
}

1.7 可能遇到的错误

可能会遇到四个报错:

1.7.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,参考上面的命令。

1.7.2 服务没有启动 reflection 反射服务

报错信息:

Failed to list services: server does not support the reflection API

解决:

这行代码是关键,一定要包含:

// 注册grpcurl所需的reflection服务
reflection.Register(server)
1.7.3 参数格式错误

报错信息:

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

解决:

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

1.7.4 参数太多
Too many arguments.
Try 'grpcurl -help' for more details.

解决:

grpcurl -plaintext -d "{\"name\":\"rao\"}" 127.0.0.1:50051 proto.Greeter/SayHello

1.8 总结

grpcurl这个工具从使用上十分简单,查看服务信息基本上类似展示的proto文件的内容,调用服务这个功能还是很

实用的,可以整合到k8s的Pod镜像中,用于在k8s集群内部简单测试gRPC服务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369860.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法初步——two pointers

什么是 two pointers   以一个例子引入&#xff1a;给定一个递增的正整数序列和一个正整数 M&#xff0c;求序列中的两个不同位置的数 a 和 b&#xff0c;使得它们的和恰好为 M&#xff0c;输出所有满足条件的方案。 本题的一个最直观的想法是&#xff0c;使用二重循环枚举序…

H5 _拖放使用

1 <!DOCTYPE html>2 <html lang"en">3 <head>4 <meta charset"UTF-8">5 <title>拖放API</title>6 <style>7 [iddragme]{8 width: 100px;9 height: 100px; 10 …

从XaaS到Java EE – 2012年哪一种该死的云最适合我?

您是否曾经想过要让Java EE在某个地方启动和运行需要什么&#xff1f; 是的 多年。 从托管我自己的主机开始&#xff0c;转到一些托管产品 &#xff0c;最后偶然发现了PaaS运动。 老实说&#xff0c;我并没有太认真。 我只是想把我的东西放到某个地方&#xff0c;而不在乎解决…

正方体最快最简单画_素描新手入门第一幅画可不只是“正方体”

很多素描教程都把正方体作为入门第一幅画学习内容。这种现象也成了约定俗成的规矩但是&#xff0c;学过画画的人大概都知道有很多人画了多年石膏几何形、静物、人头像甚至半身像全身像。到最后落得只会画这些学过的东西。这就说明学习出了问题。绘画练习一定要弄清楚每个物体练…

重写Alert和confirm方法去除地址显示

//重写alert方法&#xff0c;去掉地址显示window.alertfunction(name){var iframedocument.createElement("IFRAME");iframe.style.display"none";iframe.setAttribute("src",data:text/plain,); document.documentElement.appendChild(iframe);…

VS2015配置内核WDK7600环境,32位下.

VS2015配置内核WDK7600环境,32位下. 学习内核驱动的编写,就要会配置环境.不然总是用记事本编写.比较不方便. 环境配置如下. 1.首先下载WDK7600, 课堂资料代码中已经上传.链接&#xff1a;https://pan.baidu.com/s/1o9PjpUU 密码&#xff1a;k5sp 2.VS2015下载. 这个网络上有很多…

Camel 2.11 –具有URL重写功能的HTTP代理路由

在即将发布的Apache Camel 2.11版本中&#xff0c;我最近添加了对将自定义url重写实现插入基于HTTP的路由&#xff08;http&#xff0c;http4&#xff0c;jetty&#xff09;的支持。 当您使用骆驼代理/桥接HTTP路由时&#xff0c;这使人们可以控制url映射。 例如&#xff0c;假…

我的改进版2048(1)

&#xff08;假设有谁想要这个软件的话&#xff0c;在评论中留一个邮箱吧。&#xff09; 前几天好几次看到有朋友晒出玩2048刷高分的截图。我就想我能不能也做一个2048呢&#xff1f;细致想了想2048游戏的规律&#xff0c;发现事实上逻辑上非常easy&#xff0c;也不用研究什么算…

什么是 HTML5?

HTML5 是下一代的 HTML。 什么是 HTML5&#xff1f; HTML5 将成为 HTML、XHTML 以及 HTML DOM 的新标准。 HTML 的上一个版本诞生于 1999 年。自从那以后&#xff0c;Web 世界已经经历了巨变。 HTML5 仍处于完善之中。然而&#xff0c;大部分现代浏览器已经具备了某些 HTML5 支…

涉及CDI和JSF的过期对话的定制错误页面

自上次写博客以来已经有一段时间了。 我一直在考虑写一些技术博客&#xff0c;但最终却忙于其他事情。 上周&#xff0c;在Coderanch论坛上进行了非常有趣的讨论。 甚至更有趣&#xff0c;因为它涉及JBoss。 熟悉Java EE Web应用程序的开发人员会知道&#xff0c;Web应用程序部…

2020年市场最缺什么_2020年聚合氯化铝市场评述

2020年聚合氯化铝市场评述一、行情概述&#xff1a;今年聚合氯化铝价格整体呈下滑趋势&#xff0c;接近年底价格才有小幅反弹。但不同时期价格有小幅起伏&#xff0c;主要受疫情影响&#xff0c;在下游需求不佳的影响下价格出现下滑。1月受疫情影响&#xff0c;前期停产企业短期…

通过反射来将一个类的内容转换到另外一个类里

主函数&#xff1a; import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.serializer.ValueFilter;import com.google.common.base.Preconditions; import java.lang.reflect.Field;import java.lang.reflect.Modifier; public class leijun {public static void ma…

sql语句中left join和inner join中的on与where的区别分析

sql语句中left join和inner join中的on与where的区别分析 原文:sql语句中left join和inner join中的on与where的区别分析关于SQL SERVER的表联接查询INNER JOIN 、LEFT JOIN和RIGHT JOIN&#xff0c;经常会用到ON和WHERE的条件查询&#xff0c;以前用的时候有时是凭感觉的&…

开发辅助 | 阿里图标库iconfont入门使用

目前大多数的互联网公司&#xff0c;前端开发和UI设计师配合中&#xff0c;针对设计师给图的效果图&#xff0c;前端开发工程师不再像往常一样对于细小图标进行切图&#xff0c;取而代之的是引用阿里图标库&#xff08;http://iconfont.cn/&#xff09;&#xff1b;简单的临时开…

使用Spring Security对RESTful服务进行身份验证

1.概述 本文重点介绍如何针对提供安全服务的安全REST API进行身份验证 -主要是RESTful用户帐户和身份验证服务。 2.目标 首先&#xff0c;让我们看一下参与者-典型的启用了Spring Security的应用程序需要针对某些事物进行身份验证-该事物可以是数据库&#xff0c;LDAP或可以是…

可拖动的弹窗

pc端&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>可拖动的弹窗</title> <style type"text/css"> a{text-decoration: …

向量外积_解析几何 -向量

目录1.向量2.内积3.外积4.混合积5.双重外积6.关系式正文1.向量vector 引入vector O规定O没有确切的方向&#xff0c;即与任何向量不仅平行&#xff0c;而且垂直。申明&#xff1a;本文章的向量为自由向量&#xff0c;即始点不固定的向量&#xff0c;它可以任意的平行移动&#…

HTML5 参数传递

页面显示效果&#xff0c;如下图&#xff1a; 主页面代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><br><br><a href"jssendValue.html?i…

双向@OneToOne主键关联

现在该继续有关Hibernate的文章了。 最后一个致力于单向OneToOne关联 。 因此&#xff0c;今天我将向您展示如何获取双向OneTonOne主键关联 。 本教程中基于前一篇文章的示例。 让我们开始吧。 我将使用以前创建的相同表。 为了建立双向一对一关联&#xff0c;我需要更新两个P…

计量经济学建模_一分钟看完计量经济学

建模是计量的灵魂&#xff0c;所以就从建模开始。一、建模步骤建模步骤&#xff1a;A&#xff0c;理论模型的设计: a&#xff0c;选择变量b&#xff0c;确定变量关系c&#xff0c;拟定参数范围B&#xff0c;样本数据的收集: a&#xff0c;数据的类型b&#xff0c;数据的质量C&a…