python负载均衡的简单实现方法


Posted in Python onFebruary 04, 2018

提到分发请求,相信大多数人首先会想到Nginx,Nginx作为一种多功能服务器,不仅提供了反向代理隐藏主机ip的能力,还拥有简单的缓存加速功能。当然Nginx最强大的功能还是分发请求,不仅提供了哈希,一致性哈希,负载均衡等多种请求分发模式,还保证了自己服务的轻量和稳定。一台Nginx服务器常年工作在高并发请求的环境下,也极少宕机。

在Nginx负载均衡模式下,请求会发送到压力最小的未宕机服务器上。今天我们不考虑目标服务器的压力,用python实现最简单的负载均衡方法,即将请求发送到未宕机的服务器上。

我们想调用module_b模块中的接口,module_b服务在10.10.10.115服务器上的10081,10082,10083,10084这4个端口上。

#!/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服务。

总结

以上所述是小编给大家介绍的python负载均衡的简单实现方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Python 相关文章推荐
Python程序中使用SQLAlchemy时出现乱码的解决方案
Apr 24 Python
Python语法快速入门指南
Oct 12 Python
Python matplotlib绘图可视化知识点整理(小结)
Mar 16 Python
python高级特性和高阶函数及使用详解
Oct 17 Python
详解Python解决抓取内容乱码问题(decode和encode解码)
Mar 29 Python
django 自定义过滤器(filter)处理较为复杂的变量方法
Aug 12 Python
pygame库实现移动底座弹球小游戏
Apr 14 Python
Python3打包exe代码2种方法实例解析
Feb 17 Python
Selenium及python实现滚动操作多种方法
Jul 21 Python
pycharm如何使用anaconda中的各种包(操作步骤)
Jul 31 Python
Pytorch生成随机数Tensor的方法汇总
Sep 09 Python
python opencv旋转图片的使用方法
Jun 04 Python
python爬虫爬取某站上海租房图片
Feb 04 #Python
Python爬虫实现百度图片自动下载
Feb 04 #Python
Python中的defaultdict与__missing__()使用介绍
Feb 03 #Python
Python网络爬虫神器PyQuery的基本使用教程
Feb 03 #Python
numpy.random.seed()的使用实例解析
Feb 03 #Python
Python网络爬虫中的同步与异步示例详解
Feb 03 #Python
Python模块文件结构代码详解
Feb 03 #Python
You might like
一些 PHP 管理系统程序中的后门
2009/08/05 PHP
PHP中创建空文件的代码[file_put_contents vs touch]
2012/01/20 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
2017/07/26 PHP
PHP实现的防止跨站和xss攻击代码【来自阿里云】
2018/01/29 PHP
PHP数组去重的更快实现方式分析
2018/05/09 PHP
PHP实现单例模式建立数据库连接的方法分析
2020/02/11 PHP
使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇
2010/05/07 Javascript
Javascript创建自定义对象 创建Object实例添加属性和方法
2012/06/04 Javascript
js跨浏览器实现将字符串转化为xml对象的方法
2013/09/25 Javascript
二叉树先序遍历的非递归算法具体实现
2014/01/09 Javascript
判断window.onload是否多次使用的方法
2014/09/21 Javascript
Jquery效果大全之制作电脑健康体检得分特效附源码下载
2015/11/02 Javascript
用JS实现图片轮播效果代码(一)
2016/06/26 Javascript
微信小程序 开发经验整理
2017/02/15 Javascript
Jil,高效的json序列化和反序列化库
2017/02/15 Javascript
jQuery查找dom的几种方法效率详解
2017/05/17 jQuery
jQuery remove()过滤被删除的元素(推荐)
2017/07/18 jQuery
详解VueJs中的V-bind指令
2018/05/03 Javascript
layui点击导航栏刷新tab页的示例代码
2018/08/14 Javascript
对vue2.0中.vue文件页面跳转之.$router.push的用法详解
2018/08/24 Javascript
Vue.js组件间通信方式总结【推荐】
2018/11/23 Javascript
vue学习笔记五:在vue项目里面使用引入公共方法详解
2019/04/04 Javascript
js尾调用优化的实现
2019/05/23 Javascript
vue使用exif获取图片经纬度的示例代码
2020/12/11 Vue.js
在JavaScript中查找字符串中最长单词的三种方法(推荐)
2021/01/18 Javascript
[42:56]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Django应用程序中如何发送电子邮件详解
2017/02/04 Python
python解析基于xml格式的日志文件
2017/02/25 Python
python实现Floyd算法
2018/01/03 Python
关于django 数据库迁移(migrate)应该知道的一些事
2018/05/27 Python
python调用百度语音识别api
2018/08/30 Python
PyQt5创建一个新窗口的实例
2019/06/20 Python
python交易记录整合交易类详解
2019/07/03 Python
关于赌博的检讨书
2014/01/24 职场文书
运动会开幕式新闻稿
2015/07/17 职场文书
Mysql 如何实现多张无关联表查询数据并分页
2021/06/05 MySQL