在golang grpc中如何使用拦截器

在我认识的人当中大多数对中间件都有深刻的认知,但是对拦截器却知之甚少。接下来让我们剖析一下拦截器,来学习下怎么写和使用拦截器,并且为什么要这么做。
gRPC是一项伟大的技术,我把之前写的许多API替换成了这种方式。我发现开发gRPC接口比基于HTTP的接口要更加容易。我还是建议大家花点时间去学习下这项技术。
这里已经是这个系列的第2部分了,但是你并不需要一些预习的知识,甚至不需要去看第1部分和1.1部分.
- 1
- 1.1
- 2(我们在这里)
- 3 gRPC的数据流
在普通的HTTP服务中,我们会在服务端来用中间件来处理请求。中间件可以在真正处理请求之前,用来做任何事情,比如认证、记录日志等。
gRPC则有所不同,它允许拦截器用在客户端和服务端。这点非常好,因为他允许用户或者API接口的使用者添加任何想要的拦截器,就像记录日志。
在我们深入了解拦截器之前,我们必须理解gRPC服务器的核心概念。
gRPC核心概念:
在gRPC服务中有两个词我们必须理解。
**Unary** 是我们大多数人在使用的。你发送一个请求然后收到一个返回。
**Stream** 是当你发送或者接收原始消息的数据管道。
这意味着gRPC服务返回一个数据流,消费端可以在这个数据流中获得多个响应。数据流可以通过关键字steam被注意到,足够简单吧?
简而言之,gRPC允许4种不同的远程调用:
**Unary RPC**
当以后客户端发送一个请求,然后收到一个返回。
**Server Streaming RPC**
服务数据流远程调用是当客户端发送一个一元请求,但是返回了一个数据流。
**Client Streaming RPC**
客户端数据流远程调用是客户端发送一个数据流请求,但是返回一元响应。当所有的
消息被消费后,服务端才会返回响应。
**Bidirectional Streaming RPC**
双向数据流rpc意味着客户端发送一个数据流请求,服务端返回一个数据流响应。

那我们如何知道这些调用看起来是什么呢?

这里有一些虚拟用户的RPC服务的例子。
现在我们理解了gRPC支持的消息格式后会帮助我们更加容易的学习拦截器。
让我们从理解什么是拦截器和认识现存的不同种类的拦截器开始。
一个拦截器就像它听起来一样,在它API请求真正执行之前进行拦截。它可以用来做日志记录,认证或者任何别的你想在请求真正执行之前处理的事情。使用http接口在golang中很容易,你可用使用中间件包装http请求。使用gRPC你需要更多的知识,所以我们之前解释了一元和数据流。

有两种类型的拦截器和两方面的通讯方式。
**两种类型的拦截器**
一元拦截器:
用在单一请求并且单一返回的api接口中。
数据流拦截器:
用在那种客户端发送单一请求并且服务端返回数据流的接口中,允许服务端随着时间的推移返回不同的内容。实际上,因为gRPC是双向的,所以这也可以被客户端用作发送数据。
**两方的拦截器**
客户端-拦截器可以在客户端触发
服务端-拦截器也可以在服务端触发

还记得我说过gRPC拦截器会比http的中间键更加难以掌握吗?

那是因为,实际上我们必须知道我们想要拦截哪种类型的gRPC调用。

2+2=4

因为gRPC允许拦截器在客户端和服务端,一元或者数据流调用,所以我们有4种类型的拦截器。

如果我们去go-grpc库去看他们怎么处理这个,我们就会看到这4种不同的用例。
所有的拦截器类型都可用于客户端和服务端。

- StreamClientInterceptor 这些拦截器在客户端的数据流被创建时触发
- StreamServerInterceptor 这些拦截器在数据流被服务端执行前触发
- UnaryClientInterceptor  客户端的一元gRPC调用
- UnaryServerInterceptor  服务端的一元gRPC调用

猜你喜欢

转载自blog.csdn.net/coffiasd/article/details/115488406
今日推荐