正向代理和反向代理
Hertz 提供的正向代理和反向代理能力。
正向代理
正向代理是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。一些网关、路由器等网络设备具备网络代理功能。一般认为代理服务有利于保障网络终端的隐私或安全,防止攻击。
一个完整的代理请求过程为:客户端(Client)首先与代理服务器创建连接,接着根据代理服务器所使用的代理协议,请求对目标服务器创建连接、或者获得目标服务器的指定资源。
安装
hertz 内置了访问正向代理的功能
定义
示例
客户端默认不支持 TLS,如果要访问 https 地址,应该使用标准库
如果报证书错误还需要跳过证书验证
反向代理
反向代理在计算机网络中是代理服务器的一种。
服务器根据客户端的请求,从其关系的一组或多组后端服务器(如 Web 服务器)上获取资源,然后再将这些资源返回给客户端,客户端只会得知反向代理的 IP 地址,而不知道在代理服务器后面的服务器集群的存在。
安装
具体实现
NewSingleHostReverseProxy
方法如果没有设置config.ClientOption
将会使用默认的全局client.Client
实例, 如果设置了config.ClientOption
将会初始化一个client.Client
实例。 如果你需要共享一个client.Client
实例,可以使用ReverseProxy.SetClient
来设置。- 反向代理会重置响应头,如果在请求之前修改了响应头将不会生效。
我们提供了 SetXxx()
函数用于设置私有属性
方法 | 描述 |
---|---|
SetDirector |
用于指定 protocol.Request |
SetClient |
用于指定转发的客户端 |
SetModifyResponse |
用于指定响应修改方法 |
SetErrorHandler |
用于指定处理到达后台的错误或来自 modifyResponse 的错误 |
示例
FAQ
如何代理 HTTPS
Netpoll 不支持 TLS,Client 需要使用标准网络库.
代理 HTTPS 需要在额外做一些配置.
NewSingleHostReverseProxy
方法中使用WithDialer
传递standard.NewDialer()
指定标准网络库。- 使用
SetClient
设置一个使用标准网络库的 Hertz Client。
如何配合中间件使用
可以在 hertz handler 中也使用 ReverseProxy.ServeHTTP
来实现复杂的需求而不是直接将 ReverseProxy.ServeHTTP
注册到路由。
示例代码
反向代理 Websocket
Websocket 反向代理,受 fasthttp-reverse-proxy 启发。
示例
配置
配置 | 默认值 | 描述 |
---|---|---|
WithDirector |
nil |
自定义转发头 |
WithDialer |
gorillaws.DefaultDialer |
自定义 Dialer |
WithUpgrader |
hzws.HertzUpgrader |
自定义 Upgrader |
更多示例
用途 | 示例代码 |
---|---|
代理 tls | code |
使用服务发现 | code |
配合中间件使用 | code |
代理 websocket | code |
更多使用方法可参考如下 examples。
最后修改
December 2, 2023
: docs: add websocket reverse proxy (#876) (17626f3)