Web应用系统通常可以经过哪些层面的优化

当一个Web应用的用户量增大以至于单个节点无法承担访问压力时,我们首先需要对代码进行优化,查看代码中是否有内存泄漏,是否有资源没有关闭,是否有算法可以优化等等,另外我们需要优化数据库,是否是查询性能低,可以建立索引等。当代码层面的问题我们都处理过之后,下面就需要考虑系统架构了。

我们首先要做的就是数据库与Web应用分离。数据库服务器用户提供数据库服务,而Web服务器仅仅对外提供Web服务。这个时候,如果Web服务器的访问压力依然很大,我们可以使用Nginx来进行动静分离,静态资源直接走Nginx,动态接口再转发给Tomcat来进行处理。这样可以大大提高Tomcat的吞吐量。如果依然压力过大,就需要考虑Web服务的集群问题,也就是Tomcat的集群问题。

    Tomcat集群就是由多个服务器中部署Tomcat应用(一台服务器可以部署一个或多个Tomcat),多个Tomcat上部署同一个Web应用。用户就可以尝试访问多个Tomcat来缓解压力。当然,让用户选择服务器的方式毕竟是不好的,第一是用户选择具有不确定性,可能很多人都选择第一个服务器,这样就会造成第一个服务器的压力过大,而集群中其他的服务器浪费,第二用户的体验度不好。那么不让用户选择,又能均匀的分摊到每台服务器,我们该怎么办呢?这个时候负载均衡就出现了。

    所谓的负载均衡就是在众多的Tomcat前面再加一台服务器,这个服务器不做具体的业务操作,仅仅是接收用户的请求,然后将用户请求均匀的分摊到对外提供服务的Tomcat中。Web服务的集群第一层负载均衡我们一般使用Nginx,Nginx提供了强大的路径匹配规则。当用户访问我们的网站时,首先到达的是Nginx,然后由Nginx根据相应的负载均衡算法选择指定的Tomcat,然后由Nginx来访问Tomcat并由Nginx来给用户响应结果。但这种方式是有一定的问题的。

    第一个是所有的访问都会走Nginx,会造成Nginx节点的访问压力大。对于这个问题,虽然看上去压力会比较大,但实际上处理的信息并不多,因此不会很大。如果确实压力比较大怎么办呢,我们可以使用lvs或者硬件设备F5来做负载均衡。lvs的dr模式可以非常轻松的解决这个问题。具体的dr模式这里不过多的解释,就是请求来的时候走lvs节点,数据返回的时候直接由真实提供服务的机器来返回数据,不走lvs节点。这样就大大降低了负载均衡节点的压力。

    第二个是如果一旦Nginx节点宕机,那么整个服务都不能对外提供服务。这个问题涉及到了Ha(High available),可以通过keepalived进行心跳探测,一旦服务器宕机立马切换为备用节点。

    第三个是session同步问题,我们知道http是无状态的,为了表示一次会话,引入了session,在这里不深入session的原理,我们知道,每次会话都会产生一个session存储到服务端,我们也就是根据session来做一些验证,比如用户登录等等。如果使用了多台服务器集群,比如我们第一次请求了第一个机器,做了登录,第二次负载均衡设备给我们路由到了第二台机器,那么session是存到了第一台机器上,第二台机器依然不认为登录,这就造成了问题。解决这个问题的关键就在于需要将集群中的多个tomcat看成一个,然后提供一个公共的场所来保存session。这就是共享session。如何来做到共享session呢?我们可以把session存到数据库中,然后来请求就到数据库中去检索。这样是比较耗费性能的,另外session不用一段时间需要销毁,使用数据库来处理需要来使用定时任务,依然不是很方便。这个时候我们可以使用内存数据库Redis,它可以为我们提供方便的读写。

    Redis是一个内存数据库,存储的是键值对的形式。这样就把session从tomcat维护放到了有Redis来维护了。Redis本身具有键过期的功能,因此可以通过设置键过期时间来解决session超时的问题。另外大家都觉得使用Redis来管理Tomcat的Session比较好,因此早已有大牛把功能都实现,因此,我们只需要下载响应的包,放到Tomcat中,并进行简单的配置,Tomcat的Session就可以放到Redis中了。

    这样对于一个Nginx + Tomcat + Redis架构也就完成了。
---------------------
作者:jhappyfly
来源:CSDN
原文:https://blog.csdn.net/king_kgh/article/details/76114306
版权声明:本文为博主原创文章,转载请附上博文链接!
---------------------
作者:jhappyfly
来源:CSDN
原文:https://blog.csdn.net/king_kgh/article/details/76114306
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/lhc-hhh/p/10284430.html