mirror of
https://github.com/chai2010/advanced-go-programming-book.git
synced 2025-05-24 04:22:22 +00:00
ch4: 完善新加的内容
This commit is contained in:
parent
cfe7fda1e2
commit
c5535cafe3
@ -278,4 +278,5 @@ $ protoc -I. \
|
|||||||
|
|
||||||
## 4.6.3 Nginx
|
## 4.6.3 Nginx
|
||||||
|
|
||||||
最新的Nginx对GRPC提供了深度支持。我们可以通过Nginx将后端多个GRPC服务聚合到一个Nginx服务。同时Nginx也提供了为同一种GRPC服务注册多个后端的给你,这样可以轻松实现GRPC负载均衡的支持。Nginx的GRPC扩展是一个较大的主题,感兴趣的读者可以自行参考相关文档。
|
最新的Nginx对GRPC提供了深度支持。可以通过Nginx将后端多个GRPC服务聚合到一个Nginx服务。同时Nginx也提供了为同一种GRPC服务注册多个后端的功能,这样可以轻松实现GRPC负载均衡的支持。Nginx的GRPC扩展是一个较大的主题,感兴趣的读者可以自行参考相关文档。
|
||||||
|
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
|
|
||||||
# 4.8 grpcurl工具
|
# 4.8 grpcurl工具
|
||||||
|
|
||||||
grpc子包中还提供了一个名为reflection的反射包,用于为grpc服务提供查询。reflection包中只有一个Register函数,用于将grpc.Server注册到反射服务中。
|
Protobug本身具有反射功能,可以在运行时获取对象的Proto文件。grpc同样也还提供了一个名为reflection的反射包,用于为grpc服务提供查询。GRPC官方提供了一个C++实现的grpc_cli工具,可以用于查询GRPC列表或调用GRPC方法。但是C++版本的grpc_cli安装比较复杂,我们推荐用纯Go语言实现的grpcurl工具。本节将简要介绍grpcurl工具的用法。
|
||||||
|
|
||||||
## 4.8.1 服务列表
|
## 4.8.1 启动反射服务
|
||||||
|
|
||||||
reflection包文档给出了简单的使用方法:
|
reflection包中只有一个Register函数,用于将grpc.Server注册到反射服务中。reflection包文档给出了简单的使用方法:
|
||||||
|
|
||||||
```go
|
```go
|
||||||
import (
|
import (
|
||||||
@ -25,9 +25,42 @@ func main() {
|
|||||||
|
|
||||||
如果启动了gprc反射服务,那么就可以通过reflection包提供的反射服务查询GRPC服务或调用GRPC方法。
|
如果启动了gprc反射服务,那么就可以通过reflection包提供的反射服务查询GRPC服务或调用GRPC方法。
|
||||||
|
|
||||||
GRPC官方提供了一个C++实现的grpc_cli工具,可以用于查询GRPC列表或调用GRPC方法。不过我们推荐用纯Go语言实现的grpcurl工具,因为grpcurl工具的安装更加简单。
|
## 4.8.2 查看服务列表
|
||||||
|
|
||||||
比如程序4.4-2在本地启动了反射服务,就可以用grpcurl来查看GRPC服务信息:
|
grpcurl中最常使用的是list命令,用于获取服务或服务方法的列表。比如`grpcurl localhost:1234 list`命令将获取本地1234端口上的grpc服务的列表。在使用grpcurl时,需要通过`-cert`和`-key`参数设置公钥和私钥文件,链接启用了tls协议的服务。对于没有没用tls协议的grpc服务,通过`-plaintext`参数忽略tls证书的验证过程。
|
||||||
|
|
||||||
|
如果没有配置好公钥和私钥文件,也没有忽略证书的验证过程,那么将会遇到类似以下的错误:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ grpcurl localhost:1234 list
|
||||||
|
Failed to dial target host "localhost:1234": tls: first record does not look like a TLS handshake
|
||||||
|
```
|
||||||
|
|
||||||
|
如果grpc服务正常,但是服务没有启动reflection反射服务,将会遇到以下错误:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ grpcurl -plaintext localhost:1234 list
|
||||||
|
Failed to list services: server does not support the reflection API
|
||||||
|
```
|
||||||
|
|
||||||
|
假设grpc服务已经启动了reflection反射服务,定义如下:
|
||||||
|
|
||||||
|
```protobuf
|
||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package HelloService;
|
||||||
|
|
||||||
|
message String {
|
||||||
|
string value = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
service HelloService {
|
||||||
|
rpc Hello (String) returns (String);
|
||||||
|
rpc Channel (stream String) returns (stream String);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
grpcurl用list命令查看服务列表时将看到以下输出:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
$ grpcurl -plaintext localhost:1234 list
|
$ grpcurl -plaintext localhost:1234 list
|
||||||
@ -35,9 +68,9 @@ HelloService.HelloService
|
|||||||
grpc.reflection.v1alpha.ServerReflection
|
grpc.reflection.v1alpha.ServerReflection
|
||||||
```
|
```
|
||||||
|
|
||||||
其中`-plaintext`参数表示跳过TLS证书验证流程,list子命令表示列出所有的服务。从输出可以发现出了我们实现的HelloService服务外,还有一个ServerReflection服务。ServerReflection服务就是reflection包注册的反射服务。
|
其中HelloService.HelloService是在protobuf文件定义的服务。而ServerReflection服务则是reflection包注册的反射服务。通过ServerReflection服务可以查询包括本身在内的全部GRPC服务信息。
|
||||||
|
|
||||||
## 4.8.2 服务的方法列表
|
## 4.8.3 服务的方法列表
|
||||||
|
|
||||||
继续使用list子命令还可以查看HelloService服务的方法列表:
|
继续使用list子命令还可以查看HelloService服务的方法列表:
|
||||||
|
|
||||||
@ -47,7 +80,9 @@ Channel
|
|||||||
Hello
|
Hello
|
||||||
```
|
```
|
||||||
|
|
||||||
grpcurl还提供了describe子命令用于描述服务信息:
|
从输出可以看到HelloService服务提供了Channel和Hello两个方法,和Protobuf文件的定义是一致的。
|
||||||
|
|
||||||
|
如果还想了解方法的细节,可以使用grpcurl提供的describe子命令查看更详细的描述信息:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ grpcurl -plaintext localhost:1234 describe HelloService.HelloService
|
$ grpcurl -plaintext localhost:1234 describe HelloService.HelloService
|
||||||
@ -80,12 +115,12 @@ HelloService.HelloService is a service:
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
可以查看每个方法输入参数和返回值对应的类型。
|
输出列出了服务的每个方法,每个方法输入参数和返回值对应的类型。
|
||||||
|
|
||||||
|
|
||||||
## 4.8.3 类型信息
|
## 4.8.4 获取类型信息
|
||||||
|
|
||||||
describe子命令也可以查看参数HelloService.String类型的信息:
|
在获取到方法的参数和返回值类型之后,还可以继续查看类型的信息。下面是用describe命令查看参数HelloService.String类型的信息:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
$ grpcurl -plaintext localhost:1234 describe HelloService.String
|
$ grpcurl -plaintext localhost:1234 describe HelloService.String
|
||||||
@ -118,9 +153,13 @@ message String {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## 4.8.4 调用方法
|
输出的json数据只不过是Protobuf文件的另一种表示形式。
|
||||||
|
|
||||||
在获取GRPC服务的详细信息之后就可以json调用GRPC方法了:
|
## 4.8.5 调用方法
|
||||||
|
|
||||||
|
在获取GRPC服务的详细信息之后就可以json调用GRPC方法了。
|
||||||
|
|
||||||
|
下面命令通过`-d`参数传入一个json字符串作为输入参数,调用的是HelloService服务的Hello方法:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
$ grpcurl -plaintext -d '{"value": "gopher"}' \
|
$ grpcurl -plaintext -d '{"value": "gopher"}' \
|
||||||
@ -130,5 +169,6 @@ $ grpcurl -plaintext -d '{"value": "gopher"}' \
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
通过grpcurl工具,我们可以在没有服务端代码的环境下测试GRPC服务。
|
如果`-d`参数是`@`则表示从标准输入读取json输入参数,这一般用于比较输入复杂的json数据。
|
||||||
|
|
||||||
|
通过grpcurl工具,我们可以在没有服务端代码的环境下测试GRPC服务。
|
||||||
|
Loading…
x
Reference in New Issue
Block a user