0%

前面的章节实现的 gRPC 示例 Client/Server 之间的通信都是明文传输的,数据很容易被监听,甚至篡改。其实 gRPC 是鼓励开发者使用安全的通信的,只是在开始的章节中,客户端在创建连接时,使用 grpc.WithInsecure() 这个 Option 使 gRPC 以 Insecure 的方式连接。

本节主要介绍为 gRPC 添加 TLS 支持的过程,关于 TLS 的内容,请自行搜索相关资料。

gRPC 提供了 interceptor (拦截器) 功能,功能类似 middleware 。 拦截器可以用于处理一些公共的或者需要在业务开始前处理的工作。

gRPC 的 metadata (元信息) 类似于 HTTP 的 Header ,只是 gRPC 的 metadat 的 value 是一个数组。 HTTP 的 Header 生命周周期是一次 HTTP 请求;gRPC 的 metadata 的生命周期是一次 RPC 调用。

前文的示例是 gRPC 的 Unary RPC , 即客户端发起一次 Request、服务端响应一次 Response ,这种方式适合传输结构化数据很小的场景,当数据量大或者需要不断传输数据时候,应用应该使用流式RPC( Stream RPC ) ,它允许应用边传输数据边处理。

Linux shell 中截取字符串的方式有以下几种,可以跟据 shell 的场景自行使用。

Go 语言编译后的可执行程序中,一般包含源码的一些信息,当panic的时候,会暴露出编译时的源码路径,做为一个强迫症晚期患者,这是不可容忍的。Go语言编译器提供了选项 -trimpath 用于解决这个问题。

Go语言的 container/ring 包实现了环形链表的操作。

Golang是静态编译型语言,在编译时就将所有引用的库全部加载打包到最终的可执行程序中(CGO除外),在运行时不需要动态加载其他共享库。这样设计的好处很多,但是如果某些场景下需要实现功能的可插拔则非常不方便。 在Go 1.8更新中,Go语言提供了Go Plugin机制,可以在运行时动态加载外部功能。

在日常开发过程中,如果不小心将一个敏感文件,或者一个不必要的文件提交到git仓库时,可能会引起不良的后果。一般情况下可以使用 git rm 删除这个文件,但是 git 历史中依然保存了这个文件的历史版本。如果要彻底删除它,可以使用 命令来彻底删除。