/httpproxy

反向代理与负载均衡

Primary LanguageJava

http-proxy

反向代理与负载均衡(Java)

  • 启动方式 - java -jar httpproxy-xxx.jar
  • 配置方式 - 在application.properties里可以配置本地的启动端口 - 如:server.port=9082,启动本地的9082端口 - 在loadbalance.properties里可以配置算法类型及需要负载的机器IP,端口及权重,可以支持类型有hash,random,roundRobin,weightHash,weightRandom,weightRoundRobin - 如:两台机器,多台同理
loadbalance.type=hash
loadbalance.servers[0]=192.168.1.100
loadbalance.ports[0]=8080
loadbalance.weights[0]=4
loadbalance.servers[1]=192.168.1.101
loadbalance.ports[1]=8080
loadbalance.weights[1]=1
  • 类型说明
- hash(源地址哈希法)

  - 源地址哈希的**是根据获取客户端的IP地址,通过哈希函数计算得到的一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。
  
  - 源地址哈希法是通过客户端的ip也就是remoteIp,取得它的Hash值,对服务器列表的大小取模,结果便是选用的服务器在服务器列表中的索引值。
  
  - 源地址哈希法的优点在于保证了相同客户端IP地址将会被哈希到同一台后端服务器,直到后端服务器列表变更。根据此特性可以在服务消费者与服务提供者之间建立有状态的session会话。
  
  - 源地址哈希算法的缺点在于除非集群中服务器的非常稳定,基本不会上下线,否则一旦有服务器上线、下线,那么通过源地址哈希算法路由到的服务器是服务器上线、下线前路由到的服务器的概率非常低,如果是session则取不到session,如果是缓存则可能引发"雪崩"。
  
- random(随机法 )
  
  - 通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。由概率统计理论可以得知,随着客户端调用服务端的次数增多,其实平均分配调用量到后端的每一台服务器,也就是轮询的结果。
  
  - 整体代码思路是在选取server的时候,通过Random的nextInt方法取0~keyList.size()区间的一个随机值,从而从服务器列表中随机获取到一台服务器地址进行返回。基于概率统计的理论,吞吐量越大,随机算法的效果越接近于轮询算法的效果。
  
- roundRobin(轮询法)
    
    - 轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服务器,从第一台内部服务器开始,直到N(内部服务器个数),然后重新开始循环。算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。
  
  - 对于当前轮询的位置变量pos,为了保证服务器选择的顺序性,需要在操作时对其加锁,使得同一时刻只能有一个线程可以修改pos的值,否则当pos变量被并发修改,则无法保证服务器选择的顺序性,甚至有可能导致keyList数组越界。
  
  - 轮询法的优点在于试图做到请求转移的绝对均衡。
  
  - 轮询法的缺点在于为了做到请求转移的绝对均衡,必须付出相当大的代价,因为为了保证pos变量修改的互斥性,需要引入重量级的悲观锁synchronized,这将会导致该段轮询代码的并发吞吐量发生明显的下降。
  
- weightHash(加权源地址哈希法)

  - 不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请求;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权源地址哈希法能很好地处理这一问题,按照权重及客户地址请求后端服务器。其它特性参照“hash(源地址哈希法)”。
  
- weightRandom(加权随机法 )

  - 不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权随机法能很好地处理这一问题,按照权重随机请求后端服务器。其它特性参照“random(随机法 )”。
  
- weightRoundRobin(加权轮询法 )

  - 不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序按照权重分配到后端。其它特性参照“roundRobin(轮询法)”。