大家好!

欢迎回到 gRPC 课程。在本次讲座中,我们将学习 gRPC 反射以及如何使用 Evans CLI 来使用它。

gRPC 反射是服务器的可选扩展,用于帮助客户端构建请求,而无需事先生成存根。这对于客户端在实际实施之前探索 gRPC API 非常有用。

这是 Youtube](https://www.youtube.com/playlist?list=PLy_6D98if3UJd5hxWNfAqKMr15HZqFnqf)上[完整 gRPC 课程播放列表的链接

Github 存储库:pcbook-go和pcbook-java

Gitlab 存储库:pcbook-go和pcbook-java

在服务器上启用gRPC反射

Golang

让我们首先将 gRPC 反射添加到 Golang 服务器。

reflectionreflection.Register

所以让我们去做吧!

func main() {
    ...

    grpcServer := grpc.NewServer()
    pb.RegisterLaptopServiceServer(grpcServer, laptopServer)
    reflection.Register(grpcServer)

    ...
}

进入全屏模式 退出全屏模式

server/main.goreflection.Register

而已!

爪哇

Java 怎么样?

ProtoReflectionService

让我们去 maven 存储库并搜索gRPC service。

[](https://res.cloudinary.com/practicaldev/image/fetch/s--EHumsjtc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/i/ot4ert2fw76slimzixys.png)

build.gradle
...

dependencies {
    ...

    // https://mvnrepository.com/artifact/io.grpc/grpc-services
    compile group: 'io.grpc', name: 'grpc-services', version: '1.28.0'
}

...

进入全屏模式 退出全屏模式

LaptopServer.javaProtoReflectionService
...

import io.grpc.protobuf.services.ProtoReflectionService;

public LaptopServer(
    ServerBuilder serverBuilder, 
    int port, 
    LaptopStore laptopStore, 
    ImageStore imageStore, 
    RatingStore ratingStore
) {
    this.port = port;
    LaptopService laptopService = new LaptopService(laptopStore, imageStore, ratingStore);
    server = serverBuilder.addService(laptopService)
            .addService(ProtoReflectionService.newInstance())
            .build();
}

...

进入全屏模式 退出全屏模式

瞧,服务器上启用了 gRPC 反射。

安装埃文斯客户端

下一步,我们将安装Evans CLI来玩弄服务器反射。

Evans 是一个超级酷的 gRPC 客户端,它允许您在交互式 shell 中构造并向 gRPC 服务器发送请求。

如其Github 页面中所述,有多种安装方法。

brew tapbrew install
brew tap ktr0731/evans
brew install evans

进入全屏模式 退出全屏模式

使用 Evans CLI 和 gRPC 反射

OK Evans 准备好了。现在让我们启动 Golang gRPC 服务器。

[](https://res.cloudinary.com/practicaldev/image/fetch/s--1yzXhVaP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/i/89ad4kcwyes4o56x2344.png)

--reflection

所以我们在终端运行这个命令,传入服务器的8080端口:

evans -r repl -p 8080

进入全屏模式 退出全屏模式

然后我们在 Evans 交互式 shell 中。

显示和描述命令

show packagepackage

[](https://res.cloudinary.com/practicaldev/image/fetch/s--4GfBpXl2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/i/1lc6ii2cjp29velrfeyc.png)

show serviceshow messagedesc

[](https://res.cloudinary.com/practicaldev/image/fetch/s--Za7hhg2X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/i/bnuruxsmbpivttwtjcif.png)

测试创建笔记本RPC

LaptopServiceCreateLaptop

Evans 将要求我们提供数据以构建请求。

  • 第一个字段是ID,我们可以留空

  • 然后是笔记本电脑品牌,比如说苹果

  • 笔记本电脑名称:Macbook Pro

  • CPU品牌:英特尔

  • CPU 名称:让我们使用 Core i9

  • 核心数为8

  • 线程数为16

  • 最小频率为 2.5 GHz

  • 最大频率为 4.5 GHz

[](https://res.cloudinary.com/practicaldev/image/fetch/s--uVUgiZ8m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/i/a2j1y77m4re4h595site.png)

  • 接下来是 RAM,比如说 32 GB。 Evans 允许我们从列表中选择枚举值。所以用起来很舒服。

[](https://res.cloudinary.com/practicaldev/image/fetch/s--sqJM9kUb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/i/dc6i5fs27us9ggux4s2i.png)

Control D

[](https://res.cloudinary.com/practicaldev/image/fetch/s--bbOYYxxY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/i/ycr1mkeb079kasmpco31.png)

  • 下一个字段是存储,也是一个重复字段。假设我们有一个 512 GB 的 SSD 和一个 1 TB 的 HDD。然后控制D停止。

[](https://res.cloudinary.com/practicaldev/image/fetch/s--mMMvC3k5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/i/9dfnxknrbpaadta8zvm6.png)

true

[](https://res.cloudinary.com/practicaldev/image/fetch/s--eg-PsXDo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/i/b2k6lvyiq9nmuozp53ie.png)

现在您可以看到请求已发送到服务器,我们会返回带有创建笔记本电脑 ID 的响应。

测试搜索笔记本RPC

让我们试试 Search Laptop API 看看我们是否可以在服务器上找到那台笔记本电脑。

[](https://res.cloudinary.com/practicaldev/image/fetch/s--KPK17ar4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/i/ap1yiolpsbb64va70znn.png)

  • 最高售价4000

  • 最小 CPU 核心数为 4

  • 最低CPU频率为2.0

  • 最小 RAM 为 8 GB。

[](https://res.cloudinary.com/practicaldev/image/fetch/s--j6uw_X76--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/i/wm17ncwd88ttfszvwpiq.png)

酷,笔记本电脑找到了!

所以 gRPC 反射在我们的 Golang 服务器上运行良好。 Java 服务器上的 gRPC 反射将是相同的。如果你愿意,你可以自己尝试。

感谢您的阅读,我们下一篇文章再见!


如果您喜欢这篇文章,请订阅我们的 Youtube 频道和在 Twitter 上关注我们以获取更多教程。


如果您想加入我目前在 Voodoo 的出色团队,请在此处查看我们的职位空缺。远程或现场在巴黎/阿姆斯特丹/伦敦/柏林/巴塞罗那有签证赞助。