提到分发请求,相信大多数人首先会想到Nginx,Nginx做为一种多功能服务器,不只提供了反向代理隐藏主机ip的能力,还拥有简单的缓存加速功能。固然Nginx最强大的功能仍是分发请求,不只提供了哈希,一致性哈希,负载均衡等多种请求分发模式,还保证了本身服务的轻量和稳定。一台Nginx服务器常年工做在高并发请求的环境下,也极少宕机。python
在Nginx负载均衡模式下,请求会发送到压力最小的未宕机服务器上。今天咱们不考虑目标服务器的压力,用python实现最简单的负载均衡方法,即将请求发送到未宕机的服务器上。json
咱们想调用module_b模块中的接口,module_b服务在10.10.10.115服务器上的10081,10082,10083,10084这4个端口上。api
#!/usr/bin/python # -*- coding: utf-8 -*- import requests import random import os import sys import time import ConnectionError import Module_bException module_b = "10.10.10.115:10081,10.10.10.115:10082,10.10.10.115:10083,10.10.10.115:10084" class Module_b(): def __init__(self): self.url_prefix = [val.strip() for val in module_b.split(',')] def _request(self, short_uri, payload): res = None try_count = 1 url_prefixs = self.url_prefix[:] url_prefixs.sort(key=lambda f: random.randint(0, 100))
for curr_url_prefix in url_prefixs: url = os.path.join(curr_url_prefix, short_uri) try: res = requests.post(url, data=payload) break except ConnectionError as e: try_count += 1 sys.stderr.write('can not connect to Module_b, retry ...\n') time.sleep(1) if try_count == len(url_prefixs): raise e if res.status_code != 200: raise Module_bException('HTTP ERROR: %s' % res.text) result = res.json() if result['status'] != '0': raise Module_bException(result['errstr']) return result['result']
ConnecttionError和Module_bException为封装好的报错类无需在乎。缓存
整个负载均衡的实现也很简单,传入api和参数,而后从全部的module_b地址中随机选出一个,拼接成完整的requests请求,若是没法访问到module_b服务,那么将换到另外一个未访问过的module_b服务地址,直到访问过所有的module_b服务。服务器