中间件拦截器

在 gRPC 中,中间件就是拦截器。它位于开发者注册的代码与实际 gRPC 框架之间。当 gRPC 从网络接收到数据时,它会首先通过中间件进行处理,只有当数据被允许通过后,才会传递给实际的端点处理程序。

这些中间件通常用于保护端点免受恶意攻击或强制执行某些先决条件。一个保护 API 的例子是对客户端进行速率限制。这意味着客户端在给定的时间段内能够发起的请求次数有限,这对于防止很多攻击非常重要,比如暴力破解攻击、拒绝服务(DoS)和分布式拒绝服务(DDoS)攻击以及网页抓取(Web scraping)。此外,强制执行某些先决条件的一个例子是,客户端必须先进行认证才能调用某个端点。

在介绍一些社区提供的中间件之前,我想提醒一下,我们已经在 第 7 章 中创建了中间件。只不过当时我们没有把它们称为中间件。事实上,我们创建了两个中间件,它们如下:

opts := []grpc.ServerOption{
    // ...
    grpc.ChainUnaryInterceptor(unaryAuthInterceptor, unaryLogInterceptor),
    grpc.ChainStreamInterceptor(streamAuthInterceptor, streamLogInterceptor),
}

如果你还记得,这些中间件会首先检查是否存在名为 auth_token 的头信息,并且它的值必须是 authd。如果是这样,它会记录 API 调用到终端,然后继续执行我们为 API 端点编写的代码。

总结一下,中间件就是拦截器,它可以根据某些条件提前终止执行,并且用于保护 API 端点。