我们知道proxy protocol是haproxy提出的一个代理协议,通过这个协议,所有实现这个协议的proxy或者LBS,都可以附带真实客户端的IP地址和端口号,这使得proxy protocol在实际应用中非常有用。
这么优秀的协议,没有理由netty不支持。本文将会谈一下netty中对proxy protoco代理协议的支持。
proxy protocol协议其实很简单,就是在请求前面带了proxy header信息。
在netty中这个header信息叫做HAProxyMessage:
public final class HAProxyMessage extends AbstractReferenceCounted {
HAProxyMessage是一个ReferenceCounted,这一点和ByteBuf很类似,说明HAProxyMessage保留着和ByteBuf很类似的特性。
根据proxy protocol协议,该协议可以分为两个版本,分别是v1和v2,其中v1版本是文本协议,而v2版本支持二进制的格式。
显然从代码编写和调试的角度来看v1更加友好,但是从程序的角度来看,v2可能性能更高。
HAProxyMessage中有个专门的HAProxyProtocolVersion类,来表示proxy protocol的版本信息:
public enum HAProxyProtocolVersion { V1(VERSION_ONE_BYTE), V2(VERSION_TWO_BYTE);
HAProxyProtocolVersion是一个枚举类,在它里面定义了和proxy协议相对应的两个版本号。
在版本号之后是command,在netty中用HAProxyCommand来表示:
public enum HAProxyCommand { LOCAL(HAProxyConstants.COMMAND_LOCAL_BYTE), PROXY(HAProxyConstants.COMMAND_PROXY_BYTE);
HAProxyCommand也是一个枚举类,里面定义了两个command的值,分别是local和proxy。
其中local表示该请求是代理服务器主动发起的,而不是客户端发起的,比如监控检测等请求。
proxy表示该请求是一个代理请求。
接下来是AddressFamily和TransportProtocol,这两个字段用同一个byte来表示,所以这两个类都是HAProxyProxiedProtocol的内部类。
先看下AddressFamily的定义:
public enum AddressFamily { AF_UNSPEC(AF_UNSPEC_BYTE), AF_IPv4(AF_IPV4_BYTE), AF_IPv6(AF_IPV6_BYTE), AF_UNIX(AF_UNIX_BYTE);
AddressFamily中定义了4个address family类型,分别是unspec,ipv4,ipv6和unix。分别对应未知family,ipv4,ipv6和unix domain socket。
再看下TransportProtocol的定义:
public enum TransportProtocol { UNSPEC(TRANSPORT_UNSPEC_BYTE), STREAM(TRANSPORT_STREAM_BYTE), DGRAM(TRANSPORT_DGRAM_BYTE);
TransportProtocol有3个值,分别是unspec,stream和dgram。分别对应未知协议,http/https协议,udp/tcp协议。
因为AddressFamily和TransportProtocol实际上是同一个byte,所以经过组合之后可以得到下面的几个枚举值:
UNKNOWN(TPAF_UNKNOWN_BYTE, AddressFamily.AF_UNSPEC, TransportProtocol.UNSPEC), TCP4(TPAF_TCP4_BYTE, AddressFamily.AF_IPv4, TransportProtocol.STREAM), TCP6(TPAF_TCP6_BYTE, AddressFamily.AF_IPv6, TransportProtocol.STREAM), UDP4(TPAF_UDP4_BYTE, AddressFamily.AF_IPv4, TransportProtocol.DGRAM), UDP6(TPAF_UDP6_BYTE, AddressFamily.AF_IPv6, TransportProtocol.DGRAM), UNIX_STREAM(TPAF_UNIX_STREAM_BYTE, AddressFamily.AF_UNIX, TransportProtocol.STREAM), UNIX_DGRAM(TPAF_UNIX_DGRAM_BYTE, AddressFamily.AF_UNIX, TransportProtocol.DGRAM);
以上的枚举值也是HAProxyProxiedProtocol中定义的值。
接下就是源ip地址,目标地ip地址,源端口和目标端口这几个值,定义为属性表示如下:
private final String sourceAddress; private final String destinationAddress; private final int sourcePort; private final int destinationPort;
最后,proxy protocol中还可以包含额外的字段tlv,tlv在netty中也是一种byteBuf,使用HAProxyTLV表示:
public class HAProxyTLV extends DefaultByteBufHolder
因为tlv是key value结构,所以看下HAProxyTLV的构造函数:
public HAProxyTLV(Type type, ByteBuf content) { this(type, Type.byteValueForType(type), content); }
HAProxyTLV接受一个type和byteBuf的value。
标签:netty,系列,proxy protocol,IP地址,服务器,value结构 来源:
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。