php方案 PHP实现负载均衡客户端
?php// 轮询挨个来classRoundRobin{privateint$i0;publicfunction__construct(privatearray$servers){}publicfunctionpick():string{return$this-servers[$this-i%count($this-servers)];}}// 加权轮询权重高的多接活classWeightedRoundRobin{privatearray$pool[];privateint$i0;publicfunction__construct(array$servers){// $servers [[host10.0.0.1, weight3], ...]foreach($serversas$s)for($j0;$j$s[weight];$j)$this-pool[]$s[host];}publicfunctionpick():string{return$this-pool[$this-i%count($this-pool)];}}// 随机functionrandom_pick(array$servers):string{return$servers[array_rand($servers)];}// 最少连接谁闲给谁classLeastConn{privatearray$conns;publicfunction__construct(privatearray$servers){$this-connsarray_fill_keys($servers,0);}publicfunctionpick():string{asort($this-conns);$sarray_key_first($this-conns);$this-conns[$s];return$s;}publicfunctiondone(string$s):void{$this-conns[$s]--;}}// IP Hash同一个客户端永远打到同一台会话保持functionip_hash(string$clientIp,array$servers):string{return$servers[crc32($clientIp)%count($servers)];}实际用起来$servers[10.0.0.1:8080,10.0.0.2:8080,10.0.0.3:8080];// 轮询$rrnewRoundRobin($servers);$httpnewGuzzleHttp\Client();$res$http-get(http://.$rr-pick()./api/data);// 加权第一台性能强多给它$wrrnewWeightedRoundRobin([[host10.0.0.1:8080,weight3],[host10.0.0.2:8080,weight1],[host10.0.0.3:8080,weight1],]);// 最少连接$lcnewLeastConn($servers);$server$lc-pick();$res$http-get(http://.$server./api/data);$lc-done($server);// 请求完了记得释放FPM多进程下的问题 上面的$i是进程内存每个FPMworker 各自计数轮询会乱。跨进程共享状态要用 Redis$redisnewRedis();$redis-connect(127.0.0.1);functionrr_redis(array$servers,Redis$redis):string{$i$redis-incr(lb:rr)-1;return$servers[$i%count($servers)];}---选哪个算法无状态服务用轮询机器性能不一样用加权有登录态用IPHash后端响应时间差异大用最少连接。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2425880.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!