调试和问题排查是找到应用程序中发生问题的根本原因并解决问题的过程。为了对问题进行调试和排查,首先需要在等级较低的环境(开发环境或测试环境)中重现问题。因此,需要有一组工具来生成和生产环境相似的请求负载。
相对 HTTP 服务,gRPC 服务的这个过程更困难一些,因为这些工具需要支持基于服务定义的消息编码和解码,并且还要能够支持 HTTP/2。
用于测试 HTTP 服务的常见工具,如 curl 和 Postman,并不能用来测试gRPC 服务。
但是,有许多有趣的工具可用来调试和测试 gRPC 服务。在 awesomegRPC 仓库中,可以找到这些工具的列表。该仓库包含了 gRPC 可用资源的一个大集合。调试 gRPC 应用程序的一个通用方式就是使用额外日志(extra logging)。
启用额外日志
可以启用额外日志和跟踪功能来诊断 gRPC 应用程序的问题。在 gRPC Go 应用程序中,可以通过设置如下环境变量来启用额外日志:
GRPC_GO_LOG_VERBOSITY_LEVEL=99 ➊
GRPC_GO_LOG_SEVERITY_LEVEL=info ➋
- ❶ VERBOSITY 意味着每 5 分钟单条的 info 消息能打印多少次。在默认情况下,VERBOSITY 会被设置为 0。
- ❷ 设置日志的严重级别(SEVERITY)为 info。所有信息级别的消息都会打印出来。
在 gRPC Java 应用程序中,没有控制日志级别的环境变量。可以通过提供 logging.properties
文件来启用额外日志,该文件包含日志级别的变化。假设我们想在应用程序中排查传输级别的帧,那么可以在应用程序中创建一个 logging.properties
文件,并为特定的 Java 包(netty 传输包)设置较低的日志等级,如下所示:
handlers=java.util.logging.ConsoleHandler
io.grpc.netty.level=FINE
java.util.logging.ConsoleHandler.level=FINE
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
然后,使用 JVM 标记来启动 Java 二进制文件:
-Djava.util.logging.config.file=logging.properties
在为应用程序设置了较低的日志级别之后,等于或高于所配置日志级别的所有日志都会打印到控制台上或日志文件中。通过读取日志,就能获取应用程序内部状态的有价值的信息了。
到此为止,我们已经了解了在生产环境中运行 gRPC 应用程序的大部分知识了