

grpc的反射机制
source link: http://vearne.cc/archives/39510
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

grpc的反射机制
版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | http://vearne.cc
读者们可能使用过 fullstorydev/grpcurl 来对grpc服务进行调用调试。
假定有一个简单的grpc的服务
main.go
package main
import (
"context"
"log"
"net"
"google.golang.org/grpc"
pb "google.golang.org/grpc/examples/helloworld/helloworld"
"google.golang.org/grpc/reflection"
)
const (
port = ":50051"
)
// server is used to implement helloworld.GreeterServer.
type server struct {
pb.UnimplementedGreeterServer
}
// SayHello implements helloworld.GreeterServer
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
log.Printf("Received: %v", in.GetName())
return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil
}
func main() {
lis, err := net.Listen("tcp", port)
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
helloService := &server{}
pb.RegisterGreeterServer(s, helloService)
// 注册反射服务
// Register reflection service on gRPC server.
reflection.Register(s)
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
使用grpcurl来请求grpc服务
grpcurl --plaintext -d '{"name":"vearne"}' 127.0.0.1:50051 helloworld.Greeter/SayHello|jq
output:
{
"message": "Hello vearne"
}
jq
命令用于解析JSON字符串
读者可能会好奇,grpc服务GreeterServer明明使用的protobuf进行编码。而我们却能用JSON格式与它进行交互?
2. 解决疑惑
事实是,grpc协议提供了反射机制使得grpcurl
可以知道GreeterServer的service
定义,包含方法定义、请求参数、返回响应等等
2.1 输出方法定义
grpcurl --plaintext 127.0.0.1:50051 describe helloworld.Greeter.SayHello
output:
helloworld.Greeter.SayHello is a method:
rpc SayHello ( .helloworld.HelloRequest ) returns ( .helloworld.HelloReply );
2.2 获得方法的Request定义
grpcurl --plaintext 127.0.0.1:50051 describe .helloworld.HelloRequest
output:
helloworld.HelloRequest is a message:
message HelloRequest {
string name = 1;
}
2.3 获得方法的Response定义
grpcurl --plaintext 127.0.0.1:50051 describe .helloworld.HelloReply
output:
helloworld.HelloReply is a message:
message HelloReply {
string message = 1;
}
如果读者有心的话,可能会发现
grpcurl --plaintext 127.0.0.1:50051 list
output:
grpc.reflection.v1alpha.ServerReflection // 反射服务
helloworld.Greeter // 正常的业务服务
没错,其实在监听在50051端口的有2个grpc服务。
进一步
grpcurl --plaintext 127.0.0.1:50051 describe grpc.reflection.v1alpha.ServerReflection
output:
grpc.reflection.v1alpha.ServerReflection is a service:
service ServerReflection {
rpc ServerReflectionInfo ( stream .grpc.reflection.v1alpha.ServerReflectionRequest ) returns ( stream .grpc.reflection.v1alpha.ServerReflectionResponse );
}
ServerReflection服务可以供client查询其它grpc服务的定义。
这个服务的proto定义在参考资料2中,可以留意到它是双向流。具体可以参见参考资料2
Recommend
-
64
java中反射是在运行中动态的加载进入。有个很大的好处就是可以节省很多资源。为什么这么说呢,首先我们来说一下jvm,jvm是java的虚拟机,java之所以支持跨平台就是因为java虚拟机的存在。程序你有如下语句Objecto=newObject();运行起来的时候,java的虚拟机会首先...
-
53
1.概要 本文描述一个通过C++可变参数模板实现C++反射机制的方法。该方法非常实用,在Nebula高性能网络框架中大量应用,实现了非常强大的动态加载动态创建功能。Nebula框架在coding.net的仓库地址。 C++11的新特性--可变模版参数(variadictemplates)是C++11新增...
-
61
绝不咕咕咕,第二篇聊一下java下一个比较独特的东西 反射机制 ,这东西以前为了理解,可是搞了好久呢。 0x02 反射机制 一、何为反射 反射 (Reflection) 是 Java 的特征之一,它允许...
-
49
反射机制Reflection 简单的理解就是对class类的运用
-
59
1. 概述 Java 反射机制与动态代理我们平时写代码可能用得比较少,但在各种常见的框架(Spring、MyBatis 等)中却屡见不鲜。有句话叫“无反射,不框架;无代理,不框架”。 由于以后打算阅读和学习框架的源码,这里先...
-
31
在上篇Java 反射机制(一) 介绍了一些 Java 反射相关的常用 API ,在知道了如何去使用反射之后,作为一个合格的工程师,下一步肯定是要去了解它的如何实现的,我们今天就来看看在 JDK 源码中是如何去实现反...
-
8
用继承和反射机制实现业务扩展 主页 关于 时间
-
6
前言反序列化漏洞作为java中最常见和最好用的漏洞之一,是检验一个安...
-
2
PHP反射API官方文档:http://php.net/manual/zh/class.reflection.php PHP版本要求 PHP5以上 一、反射获取PHP扩展相关信息 1.1、核心API:
-
6
Java 反射机制(1) 2016年12月7日 | 字数 2757 |
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK