在讲完一些有的没的(?)之后,我们继续回到 Pingora
的主线。这一篇我们来看一看 Peer
,也就是 pingora-core::upstreams
中的一些结构与实现。
ToC
从 Example 继续
回到 Getting Started 开头的 Example
。这次我们的注意力放在 HttpPeer
上:
可以看到,在实现 ProxyHttp
的过程中,我们需要返回一个 HttpPeer
用于连接。HttpPeer
,以及它实现了的 trait Peer
,都是定义在 pingora-core
中的结构。让我们深入看看。
trait Peer
Peer
是 Connector
在连接时用于承载连接参数的结构。它的 Trait
定义如下:
为了节省篇幅,这里将大量拥有默认实现的 trait Method
折叠了。有需要可以自行展开观看。从最核心的角度出发,Peer
必须实现的,也就是连接的过程中必须告知 Connector
的属性有:
方法 | 简介 |
---|---|
address() | 连接的地址。 |
tls() | 是否要以 TLS 连接。 |
sni() | 当使用 TLS 时的 SNI 。 |
reuse_hash() | 是否应该复用连接。当这个值相等时,则可以复用。 |
初次之外,还有一些有用的属性,包括:
get_proxy()
: 是否使用代理连接verify_cert()
: 是否检查证书verify_hostname
: 是否检查Hostname
connection_timeout()
: 通过connect
建立连接时的超时时间total_connection_timeout()
: 连接的总超时时间matches_fd()
: 判断某一FD
是否和该连接匹配get_tracer()
: 获取该连接对应的Tracer
Tracing 与 Tracer
在 trait Peer
中,定义了一种 Tracer
类型。这也是 Peer
用于追踪的手段。Tracer
需要实现 trace Tracing
,负责在连接成功或失败时被调用。定义如下:
BasicPeer
在了解完 trait Peer
的定义后,我们来看一个简单的 Peer
实现:BasicPeer
。Pingora
在一些简单的场景中会用到 BasicPeer
,比如 TcpHealthCheck
和单元测试。这个实现也比较粗糙,目前只支持建立到 address
的非 TLS
连接。源码非常简单,基本就是把 field
填了一下。如下所示:
HttpPeer
看完了比较简单的,再来看看相对复杂一些的。HttpPeer
,也就是我们在 Example
中用到的结构。相比 BasicPeer
,它额外支持了 https
、SNI
、代理、客户端证书,还有诸如 UDS
(Unix Domain Socket
) 的使用。
HttpPeer
支持三种构造形式:
[1]
:new()
,可以建立到某个SocketAddr
的连接。[2]
:new_uds()
,可以通过Unix Domain Socket
的路径建立连接。[3]
:new_proxy()
,则可以以一个http proxy
作为跳板继续建立连接。
Proxy
HttpProxy
中使用的 Proxy
支持连接任意 host:port
或 UDS
路径,并可以指定额外的 HTTP Header
,定义如下: