• 主页
  • Java SE
  • J2ME
  • Web开发
  • Java EE
  • Eclipse

关于java实现简单Web负载均衡服务器的设计

Sirm23333 学生  2018-05-07 04:15:38
各位前辈,我一枚在校自学java的学生,没有比较专业的老师可以交流,最近遇到个瓶颈问题,希望得到指教。

最近参加了个比赛,题目就一句话,设计一个简单实现web负载均衡服务器,最好是七层负载均衡。在做之前我完全不懂,一顿查资料。从什么是负载均衡,到什么是七层,什么http重定向方式、反向代理方式等等。最终我对这个题目的理解是:用java的做这么一个小软件,通过配置,建立一个内部服务器集群,这个软件绑定某个端口。因为是七层(我理解的是http协议的层次上),这个小软件利用NIO读取io数据,把client的http请求处理后,根据配置及一些算法把请求转发到某个服务器上,再收到该服务器的http响应,再把这个响应转发给clinet(这是反向代理的意思吗??我是这么理解的)

最终实现的,对于客户端访问一个web项目(向这个小软件的ip+端口访问),我可以通过配置,根据client的ip或是http请求头里的内容进行分发,比如图片、html、action等等不同类型的请求分别发到不同的真实服务器上。

当时演示的时候也是配了几台本地的服务器模拟了整个流程。而评委问问题的时候,问我什么是七层负载均衡,我简单的说是:当一台服务不能满足大量请求的时候,考虑增加服务的数量,而七层的负载均衡是根据第七层(CS这种模式也就是http)中请求的内容,将客户端的请求通过某种分配算法转发给某台真实服务器,再将服务器的响应转发给客户端。当评委听到我说转发的时候,直接了当的说我根本不清楚什么是负载均衡(一脸蒙蔽...)。

完事我又单独去请教他,他告诉我七层是网络层的东西,四次是物理层(???更是一脸懵逼),而七层负载均衡是对http的重定向不是IO的读取(不处理IO怎么给client响应?),根据客户端的IP给客户端返回一个重定向的响应,让它直接去和某台真实服务器再连接(我想这样还更简单)。四层是物理链路层的,用软件很难实现,一般是路由偏硬件的方式。

即使负载均衡是什么我理解错了,但七层和四层是哪个层还是清楚的(明明是应用层http和传输层tcp嘛),毕竟人家是前辈,我也没顶嘴,客气了下就撤了。不过回来后真的好纠结呀,到底是我哪里理解错了,他的那种是http重定向方式,我的是类似反向代理的方式嘛,网上的文章都差不多翻了一遍也没啥结果。

没个人交流,就来论坛请教各位了,大家方便的话帮我解答一下,纠结死了

或者简单的说一下如果用java来做一个简单七层负载均衡(不是分配服务器的算法,网上都是种算法),是一个什么思路,要用到哪些技术,我也想学一下。(我用的是NIO读取SocketChannel中http请求响应,master+worker的一个线程配合模式实现异步非阻塞IO读取,简单处理了下并发)

大佬们感谢
...全文
640 点赞 收藏 3
写回复
3 条回复
oyljerry 2018年05月07日
所谓7层负载均衡,可以参考Nginx的方式来理解。也就是你的很多服务器都提供了Web Api的接口。你的负载均衡程序需要把用户的http请求等转发到不同的服务器的http接口,并返回他们对应的http response给客户端
回复 点赞
oO临时工Oo 2018年05月07日
引用 1 楼 trocp 的回复:
首先,七层模型中的第七层就是应用层(包括HTTP)、第四层就是网络层(包括TCP、UDP) http://img.my.csdn.net/uploads/201201/5/0_1325744597WM32.gif 其次,题目中的“最好是七层负载均衡”,我只能把它理解为第七层负载均衡,而不是从1-7层都做负载均衡(实际上网络层和数据链路层都可以做负载均衡)。 再者,猜测出此题的知识背景:应该是与当前流行的微服务理论,以及可实现微服的架构Spring Cloud、Dubbo等技术有关,这两个技术均涉及到RPC(远程过程调用),一般来说RPC协议归属于第七层。 因此,如果你用Java的RPC,以实现同一个业务对多个不同的远端进行调用,可能会更合出题人的心意。 最后,其实你做那个方案,理论上也可称为负载均衡。但实用性低了一些,相当于所有的请求还是会集到进行请求分配(或者你所谓的转发)那台服务器,这台服务器网络IO、QPS始终是最高的,而且所有请求均会进到应用服务器(例如Tomcat),试想所有有效无效请求进来,Tomcat中的Java都要new一个HttpServletRequest对象,而这些对象可能经常是无用的,而且New这些对象仅仅是为了完成代理工作,那么为何不可以让HTTP请求在进入Tomcat之前,就由Web服务器转给另一个Tomcat呢。 因此,你的方案达不到负载均衡的最终目的,而类似工作用一些支持集群的HTTP服务器通过配置就可以完成,例如Nginx。
补充一下:微服务首先应该是归属于分布式的理论,其次归属于集群(负载均衡)的理论。实践中,这两种方案往往是并存的,例如dubbo首先支持通过RPC协议(当然还有其它协议)分布式调用,又支持与zookeeper等集成,进行集群整合。 个人见解,供参考
回复 点赞
oO临时工Oo 2018年05月07日
首先,七层模型中的第七层就是应用层(包括HTTP)、第四层就是网络层(包括TCP、UDP) http://img.my.csdn.net/uploads/201201/5/0_1325744597WM32.gif 其次,题目中的“最好是七层负载均衡”,我只能把它理解为第七层负载均衡,而不是从1-7层都做负载均衡(实际上网络层和数据链路层都可以做负载均衡)。 再者,猜测出此题的知识背景:应该是与当前流行的微服务理论,以及可实现微服的架构Spring Cloud、Dubbo等技术有关,这两个技术均涉及到RPC(远程过程调用),一般来说RPC协议归属于第七层。 因此,如果你用Java的RPC,以实现同一个业务对多个不同的远端进行调用,可能会更合出题人的心意。 最后,其实你做那个方案,理论上也可称为负载均衡。但实用性低了一些,相当于所有的请求还是会集到进行请求分配(或者你所谓的转发)那台服务器,这台服务器网络IO、QPS始终是最高的,而且所有请求均会进到应用服务器(例如Tomcat),试想所有有效无效请求进来,Tomcat中的Java都要new一个HttpServletRequest对象,而这些对象可能经常是无用的,而且New这些对象仅仅是为了完成代理工作,那么为何不可以让HTTP请求在进入Tomcat之前,就由Web服务器转给另一个Tomcat呢。 因此,你的方案达不到负载均衡的最终目的,而类似工作用一些支持集群的HTTP服务器通过配置就可以完成,例如Nginx。
回复 点赞
发动态
发帖子
Java
创建于2007-09-28

1.8w+

社区成员

8.1w+

社区内容

Java相关技术讨论
社区公告
暂无公告