Java进阶

1.Java Web发展

1)web的技术内涵
聊起web,首先从它的内涵说谈起,最早期的web技术是指浏览器渲染html代码的技术,其中伴随而生的css和js技术也只是为了加强浏览器对html代码的渲染效果。接下来分析web技术的工作流程:用户在浏览器上输入网页地址(URL),此时浏览器得到这个网页地址之后,会通过socket向服务器发送HTTP请求并把URL的参数传给服务器,随后服务器接收到浏览器的HTTP请求和参数,之后服务器根据HTTP请求参数定位到html文件资源,随之服务器通过socket连接把html文件的html代码写回给浏览器,最后浏览器根据网页地址拿到了目标html代码并对其进行解析和渲染成页面。上述是一个很纯粹的web技术流程的描述,没有其他技术的参杂,这也是最初web的雏形,没有动态渲染技术,没有数据库,页面上的数据都是写死的数据。
2)web的4个阶段
web领域从诞生到至今,随着用户体验的越发注重和技术复杂性的提升,页面效果一直在变化,技术也一直在迭代,在这个过程我个人划分为四个阶段:
(1)原生时代
页面元素很纯粹,只有html代码和css样式,浏览器对其都是静态渲染,渲染完成之后,页面除了跳转就不会有动态变化,其中动态变化是指js动态修改html的代码以及动态向服务器请求数据。从上所述,这是一个浏览器到服务器简单请求html代码的过程,服务器对html文件的内容只是简单的写回给浏览器,没有做特殊处理。
(2)模板时代
模板,其实是指一个组合,模板语法和html语法通过结合的方式,完成静态元素和动态数据拼装页面的过程。在Java领域,体现模板这个概念的技术就是jsp了,jsp以特定语法镶嵌在html代码里,但是这个jsp语法在浏览器上是不能解析渲染的,所以服务器在返回html给浏览器之前需要自己把jsp的代码翻译成html代码。当然jsp的规则主要目的是为了渲染动态数据,这个动态数据是指从数据库查到的数据。另外这里提一点,这个时期还有一个重要的角色是js,js是浏览器可执行的脚本,可以镶嵌在html代码中,并在运行中能修改页面中的静态元素(例如html的各个标签)。
(3)单机时代
模板时代已经做到html静态元素和动态数据实时变化的页面需求了,但是为何被时代抛弃尼?这个得从项目的复杂度说起,随着用户对系统依赖的提升,功能需求的业务也变得越加复杂,此时html里面代码的复杂度也会跟着提升,html文件上不仅有复杂的静态元素代码(css样式代码,js实时修改静态元素的代码,html标签代码),而且还有复杂的模板语言代码(例如jsp),如果项目复杂度小,用模板时代的技术解决方案完全没问题,并且还很方便,但是项目随着时代的发展,复杂度提升到另一个维度,所有的代码都写在一个html文件中,会导致代码结构混乱不堪,完全不便书写和维护,这就让Java走到了另一个servlet时代。当然servlet概念是比jsp先出生,但是在某一段时期却为何遭受冷落呢?这还是项目复杂度谈起,jsp技术目标追求的小巧而五脏俱全,既与html代码揉合,又能处理业务逻辑,同时又能操作数据库,在互联网的某个发展早期阶段,这种项目开发模式得到追捧,以至于servlet在某个时期是被人遗忘的。但是随着项目规模变大,开发人员为了项目的维护性,开始重新思考架构模式,动静分离(动:动态数据和业务逻辑,静:html,css,js代码)又变成迫切需求,servlet理念被重新拾回,单机的架构模式正式到来:用户在浏览器上输入URL,浏览器凭URL从服务器获取到html代码,不过浏览器渲染html代码之前,浏览器会解析出其中的js代码并执行之,js执行的逻辑一般是让浏览器再发一次请求向服务器获取动态数据,并把数据填入到之前获取的html代码中,在这之后,浏览器才会渲染页面呈现给用户。这时候的web架构模型比较经典,如下所述,针对这个模型,除了service模块,其他模块都演化出了各个框架,静态资源前端框架有bootstrap,jquery等;servlet框架有springMVC,struct2等;dao框架有hibernate,mybatis等。
浏览器,可以输入URL,可以执行JS,可以渲染html代码。
浏览器,静态资源,例如html,css,js文件代码。
服务器,servlet专门接收处理浏览器发送的请求,并写回信息给浏览器。
服务器,service向servlet提供信息,以供servlet返回信息,service目的是为了加工信息数据。
服务器,dao操作数据库,因而dao能得到基础数据,service未加工前的数据就来源dao。
(4)高并发时代
随着互联网的发展,科技产品流入千家万户,整个行业进入繁荣的阶段,同时也进入了流量时代,一台服务器提供的应用服务已经无法支撑起千万级数量的请求,多台服务器共同完成一个应用服务已经成为各家巨头的共识。为何一台服务器无法处理千万级别的请求呢?对于web应用来说,千万请求就是指千万个用户从不同的浏览器向同一个服务器索要信息资源(包含html代码和动态数据)的过程,对于一个服务器来说,一个浏览器请求意味着服务器写回一份信息资源给浏览器,而服务器写回信息资源的过程是消耗计算机资源的(服务器写回的操作首先会开一个线程处理sokect连接,然后线程会从硬盘中读取html代码和数据到内存,最后线程从内存中写回数据到sokect中,这些数据最终会通过网络连接返回到浏览器中),这里的资源消耗主要是指cpu和内存,cpu需要为每一个sokect连接开辟一个线程,并处理线程内的任务,包括内存分配,数据处理,数据返回。所以一台服务器短时间内同时处理千万级别的请求是不现实的,因为一台计算机的资源是有限的,cpu处理能力有限和内存容量有限,一台计算机如果超出能力大小时,对于新的请求,要不阻塞等待其他线程处理完成,要不因为计算机超负荷工作触发硬件保护程序而引起宕机。对于上述这两种情况,都会导致用户不能正常访问使用系统,所以单台服务器无法支撑起千万级别的应用程序,多台服务器协同完成应用程序成为共识。

2.多服务器协同架构

1)单机架构的瓶颈
回顾历史,单机时代的架构问题其实是单台计算机性能问题,由于cpu和内存资源的限制,计算机无法处理同时到来的海量请求,无法处理主要是指三方面:
第一,单台服务器同时创建sokect连接数量有限(65536),意味着不能处理超过65536的请求;
第二,服务器维持每个sokect连接任务都会消耗计算机资源,每个sokect任务从创建线程到处理任务逻辑都会占用cpu和内存空间,计算机通过切换线程来执行各个socket任务,意味着cpu处理能力和内存容量有上限的情况下,socket连接越多,会导致服务器响应浏览器socket的速度越慢;
第三,单台计算机IO速度的制约,服务器响应浏览器socket的数据最终都是源于硬盘,服务器响应的数据都必须内存,所以都会有这个过程(服务器硬盘-》服务器内存-》响应浏览器socket),而硬盘IO数据到内存是很慢的,特别是海量请求的场景下,单台服务器无法短时间内给每个socket及时IO出特定的磁盘数据。
2)时代给出的答案
在实践开发中,唯一的目标是追求可用的系统,但是在高并发场景下,单台计算机因为性能原因,导致基本不可用,所以多服务器协同架构走上开发潮流,而多服务器之间如何联合解决性能问题呢?这个问题的答案如果要追究细节很长,我个人认为核心主要有两点,一个是在于如何联合服务器,一个在于充分利用单点服务器的性能。
(1)联合服务器
第一,高并发场景下,系统需要一个中间服务器,这个服务器既能暴露给用户访问,也能突破sokect连接数量的限制,这个中间服务器只做单纯的转发功能,这个功能也称为负载均衡,目得是为了拆分海量请求,然后把请求转发到不同的服务器,最后完成单点高压转成多点低压。
在这里插入图片描述
第二,高并发场景下,上述提到的一个动作(负载均衡把请求转发到多台服务器),里面的关键字多台服务器也称为集群,其中集群下的每个服务器部署了相同的业务功能,这样做的目的主要有两个:一个是突破单机性能限制,为拆分海量请求提供多个服务器支撑;一个是实现高可用,某个服务器宕机了,不影响到用户使用业务功能。
第三,高并发场景下,有一个重要的数据库IO问题(事务锁和海量请求都会导致其他的请求不能及时操作数据库),集群只是处理了海量请求和计算机资源(cpu和内存)问题,但是集群下的服务器操作的还是同一个数据库,操作同一个库就会存在事务锁和海量并发问题,这就导致数据库服务器不能及时响应每个数据库请求,所以数据库IO问题不能从集群角度寻求解决方案,只能从另一个分布式角度去考虑,
(2)提升单点性能的技巧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值