Java程序部署到服务器上后,要被外部用户访问到,还需要一系列的东西组成,这些东西也是需要了解的。
外部用户要访问,通常来说都会给个域名,有域名就意味着需要DNS,一般来说域名注册商都会提供域名解析服务,当然,也有外部的一些域名解析提供商,例如著名的dnspod。
域名需要解析为一个公网的ip,互联网公司会借助这个机会来根据用户访问的ip来解析为一个更靠近用户的公网ip(这个通常需要采用商用的GSLB设备来实现),从而提升用户的访问速度,也就是很多人都听说过的CDN,不过这主要用于静态资源,例如图片、js、css文件等,这一层的技术难点是如何选择一个对用户而言访问速度最快的节点(例如最近距离的一个挂了,最近的节点负载高等),在中国的网络环境下就更复杂了。
对于动态类的资源的访问,通常就会访问到某个或某几个机房,这些通常就是在DNS上绑定多个公网ip,而访问公网ip要能最后落到实际的服务器上,通常会需要经过LB(load balance)设备,这个可以是硬件的,也可以是软件的,软件的目前来说实现和维护的成本还是比较高的,硬件的话则是本身价格比较昂贵,所以可以根据公司发展的阶段来选择,LB设备上的每个VIP下可以挂载一堆的服务器,由LB设备来负责选址以及failover的处理。
经过上面的过程,用户的请求才能落到实际的服务器上,而对于Java应用来说,各种应用服务器例如jboss、tomcat等直接暴露对外的话,支撑连接的能力会不够(主要原因是这些应用服务器之前都是bio的模式),另外也是这些应用服务器在实现的时候对于诸如慢连接等的防攻击能力很弱,所以通常来说在应用服务器前面还会搭一层nginx/apache等,所以通常这个时候会先落到nginx/apache上,然后由nginx/apache再转发到相应的服务器。
经过上面的阶段,用户的请求才终于进入到了Java程序中处理了。
从上面整个过程可以看到,要确定Java应用能够支撑的量,需要全盘了解,DNS部分的解析能力、LB设备的支撑能力、CDN的流量、Nginx/Apache的支撑能力,同样,稳定性也需要全盘了解。
整个Java程序员也应该知道的系统知识系列到此就结束了,讲的并不深入,感兴趣的同学可以根据涉及的点进一步的去了解更深入的内容,更多的是希望大家能通过这个系列的文章来知道对于一个生产环境中运行的Java程序,要做好稳定性保障、性能优化等,仅仅是知道Java代码本身是不够的。