简易的负载均衡服务器——springsnail
简易的负载均衡服务器——springsnail
《linux高性能服务器编程》作者开源的一款简易负载均衡服务器,整个项目代码1400多行,短小精悍,适合初学者学习与模仿。该项目能从所有逻辑服务器中选取负荷最小的一台来处理新的客户连接,并且使用了进程池,有限状态机,高效数据结构和统一事件源等书中提及的思路优化其性能,同时还细致地封装了每个函数和模块,使之更像一个完整的实际服务器项目。
参考博客:
《Linux高性能服务器》附带项目springsnil源码解析
Linux高性能服务器编程springsnail源码解析(c++负载均衡)
项目搭建与使用
项目源码下载:
git clone https://github.com/liu-jianhao/springsnail.git
下载下来之后发现,整个项目源码如下:
解释一下各个文件的内容与作用:
-
config.xml:配置文件,指明服务器本身的地址及它所要连接的ip127.0.0.1:8080表明服务器的主机位置和端口(localhost),下面两个103.65.41.126和103.65.41.125分别指明服务器连接的ip。执行时使用命令./springsnail -f config.xml即可
-
fdwrapper.h与fdwrapper.cpp:操作文件描述符fd的各种函数,具体会在源码解析中放出。
-
log.h与log.cpp:日志函数,在程序运行过程中打印各种信息到文件和控制台中。
-
mgr.h与mgr.cpp:处理网络连接和负载均衡的框架
-
conn.h与conn.cpp:客户端类与函数
-
processcool.h:进程池,是整个项目的动力。
-
main.cpp:主函数,处理服务器的主要逻辑。
了解完项目源码分布之后,我们发现有Makefile文件,所以直接make即可生成可执行文件。可执行文件就是图中绿色的springsnail了。
有了可执行文件,下一步就是修改配置文件config.xml,将服务器连接到我们想连接的ip上去。
比如,我们想连接到网易云音乐,先nslookup一下域名的地址:
$ nslookup music.163.com
结果如下:
上面59.111.181.35,59.111.181.38,59.111.181.60就是域名的ip了,我们随便选两个添加到config.xml文件中去:
保存并退出,然后执行服务器程序:
$ ./springsnail -f config.xml
终端显示如下信息:
表明服务器已经成功与目标ip连接。
此时我们可以将这个服务器作为中转,向服务器发送数据。
首先另开终端,使用nc工具进行连接:
$ nc localhost 8080
/*nc(netcat)是一个功能强大的网络工具,如果并未安装请使用命令
$ yum install nc.x86_64
netcat不仅可以通过使用TCP或UDP协议的网络连接读写数据,同时还是一个功能强大的网络调试和探测工具,能够建立你需要的几乎所有类型的网络连接。*/
连接成功后服务端会显示:
这样的信息,此时在nc端模拟http报文,命令如下:
$ nc localhost 8080
GET /HTTP/1.1
发现nc端返回如下信息:
可以清晰的看出我们的访问被403 Forbidden了,说明网易并不允许这样的中转服务器的存在,服务端也有相应的反馈:
可以看到刚才我们的连接请求被中断了,服务端有"error"日志消息回应。
还可以使用这个服务器去访问其他网站,只需修改config.xml文件即可,会有许多不同的结果。
接下来将对整个项目的源码进行剖析,从框架到实现都会做上详细的注释。
推荐阅读
-
对应用服务器做了负载均衡之后如何保持session等记录用户登录状态的会话信息?
-
N年前Nginx 负载均衡在金山逍遥网中的应用
-
N年前Nginx负载均衡在新浪播客中的应用
-
Keepalived+HAProxy实现MySQL高可用负载均衡的配置
-
数据库水平切分的实现原理解析——分库,分表,主从,集群,负载均衡器 博客分类: 技术总结 数据库水平切分的实现原理分库分表主从集群
-
从零开始入门 | Kubernetes 中的服务发现与负载均衡 c阿里巴巴
-
四层和七层负载均衡的区别 博客分类: 架构研究
-
19个心得 明明白白说Linux下的负载均衡 博客分类: 网站架构 Linuxnginx应用服务器网络应用防火墙
-
Oracle 10g RAC的负载均衡配置 博客分类: database SQLLinuxOracleWindowsSQL Server
-
【六种常见的Web负载均衡原理与实现】 博客分类: 负载均衡 【六种常见的Web负载均衡原理与实现】