资讯:IT行业激荡30年->技术与架构演进(强哥畅聊)
作者:强官涛   类型:学院动态    类别:资讯   日期:2020-04-03    阅读:2208 次   消耗积分:0 分




大家好,我是强哥,我是一名程序员。我始终相信“技术改变生活,研发构建未来”。


今天是“IT行业激荡30年”系列文章的第四篇(前三篇文章请猛戳这里“IT行业激荡30年->编程语言变迁史”,“IT行业激荡30年->改变世界的程序员们”,“IT行业激荡30年->技术改变生活”)。今天这篇文章,我试图用一种相对容易理解的方式来聊一聊这30年来IT软件和互联网应用开发的技术和架构。毕竟涉及到的是比较技术性的话题,但是我还是尽最大努力写得通俗易懂一些。


90年代,IT行业正式在国内生根发芽,互联网也是90年代后期慢慢进入大众视线,中国如此,美国也差不多,略早小几年而已。所以,90年代的软件开发,通常不是以互联网应用为主,而是单机程序单机应用。单机应用怎么开发呢?其实比较简单,就是用一门编程语言,直接绘制一个界面,通过调用操作系统底层的接口来实现一些功能就可以了。比如音乐视频播放器,杀毒软件,输入法,办公软件(如Office或WPS等),单机游戏。所以这类软件其实不存在什么架构可言,主要是功能驱动型软件,如果非得要画张图来展示这类软件的工作机制的话,也比较简单。


20200403_143437_248.jpg


这类单机软件时至今天,依然存在,比如很多操作系统内置的软件,也都是属于这类单机软件。这个时候的程序员,在开发软件时主要学习的技术只有两个:一是操作系统底层类库(比如Windows操作系统的MFC,或者Linux操作系统的QT,或者针对图形图像处理的DirectX和OpenGL等),这类库主要解决了对操作系统底层能力的封装,使开发过程更加快捷,事实上,即使软件开发技术发展到今天,依然无法超越操作系统,所以底层库的调用一直存在且必须。只是很多新的编程语言或编程框架将这类库进行了再封装,使编程过程变得比较简单而已。还需要学习的一门技术当然就是编程语言本身了,除了编程语言本身的特性(如控制结构,面向对象,函数库,扩展库)等,还需要了解如何绘制界面,如何操作按钮,文本框,如何打开对话框,如何播放音乐视频,如何美化窗口样式等。这两个问题解决了,就具备足够的能力开发一个单机应用了。单机应用开发人员,对架构方面不需要有什么心得体会,无非就是把界面弄得漂亮一点,把功能做得丰富一点,优化一下CPU和内存消耗就差不多了。


95年左右,互联网开始萌芽,三个技术的标准化让互联网应用变成可能,一是HTTP协议(也就是今天在应用最为广泛的应用层通信协议,其地位可与TCP/IP层协议媲美,无论是Web应用,还是网络应用或者是App,一定优先使用或者全部使用HTTP或HTTPS协议进行应用间通信)。二是HTML(也就是在浏览器内可以解析的一堆指令集合,让浏览器可以通过解析HTML来渲染出一个网页界面),三就是浏览器(最开始主要是网景公司推出的Netscape浏览器,后来微软加入竞争,此处先不表细节)。一个互联网应用能够真正产生价值,这三者缺一不可。而在互联网领域,由于是多用户访问,所以形成了早期标准的B/S架构(Browser-Server),用图表示如下。


20200403_143503_322.jpg


注意,所有的通信过程都是双向通信,通过B/S架构慢慢地让程序员开始思考架构层面的东西,架构设计开始萌芽。既然有B/S架构,当然也有C/S架构,既然有服务器的支持,需要使用网络协议,为什么只能使用HTTP协议呢?


其他使用哪种协议通信完全是程序员们讨论的结果,并不能指责谁好谁坏。比如一些之前的单机应用,加上一个服务器端的通信处理,是不是也可以变成多终端应用了呢?当然可以啊,比如咱们玩的端游,就是一个典型的C/S架构的应用。可以多人组队在线一起玩,互相之间就需要依赖于服务器进行数据同步和中转。但是端游需要借助于操作系统的显卡和其他硬件的能力,所以需要直接调用操作系统底层接口,显然浏览器是不具备这种能力的(因为浏览器出于安全考虑,都运行于浏览器沙箱环境,与操作系统进行完全的隔离,不允许浏览器操作操作系统,否则大家可以想象一下,你访问的网页可能全是病毒)。所以对于端游这类C/S应用,无法借助于浏览器进行处理,那么就自己开发客户端,再与服务器通信即可。而自己开发客户端的过程,与开发一个单机应用的过程本质上是没有任何区别的。比如Foxmai,Outlook,QQ等这类应用,也是属于C/S架构的应用。


20200403_143529_950.jpg


那么C/S架构的C端与服务器如何进行通信呢?使用什么协议比较好呢?其实这就完全根据自己的系统的需求来定了,比如直接使用TCP或UDP进行通信,也可以使用HTTP协议通信(跟浏览器一样的通信方式在C/S中也是可以的),再比如自定义一个应用层协议(如QQ的应用层协议叫OICQ),或者使用特定的通信协议完成特定的功能(比如Foxmail,Outlook这类软件则主要基于SMTP,POP3等这类邮箱通信协议)。所以B/S架构的通信协议必然是HTTP(或衍生协议),而在C/S架构中,则可以选择任意协议进行通信,但是在互联网上无论哪种协议,通常我们指的都是应用层协议,其底层协议都是TCP/IP协议模型,殊途同归。


现在我们所熟知的B/S架构,大量应用于手机App和Web应用中,也成为了应用系统开发的首选模型,因为基于HTML和HTTP两个标准的规范支撑,具备多方面的优势。


  1. 直接编写HTML界面,用CSS进行美化和排版处理,剩下的工作,交给浏览器来处理即可。可以大大提高开发效率,因为浏览器是标准化的产品。

  2. 正因为浏览器是满足W3C委员会制定的标准化产品,所以Web系统的兼容性天生很好,无论运行于Windows,Linux或者Mac上,或者是手机端,只要是通过浏览器来渲染和处理,那么无论哪个平台上的浏览器都是标准化的,都是可以正常渲染出页面来的。

  3. 更新方便,基于浏览器的应用,如果有版本更新只需要更新服务器端即可,不需要通知用户去更新客户端,因为客户端本身就是浏览器。而如果是C/S架构的话,则客户端需要做同步更新才行。比如说今天我们在手机上安装的很多App,是不是经常通知我们更新,是不是感觉很烦?但是你用浏览器去访问一个页面,从来没有通知你说要去更新一个网站,对吧。

  4. 但是B/S架构并不都是好处,对于一些轻量级的应用是没有任何问题的,但是对于重型应用,由于受限于浏览器的沙箱环境,与操作系统完全隔离,所以我们没有办法在浏览器里面运行一些大型应用(比如大型游戏就不可能在浏览器中运行),或者是一些底层软件(比如杀毒软件等),在一个网页中是不可能运行起来的。为了提升浏览器的运行能力,业界也想了很多办法,比如微软的ActiveX,或者Adobe公司的Flash/Flex等(两个技术在业界者有点臭名远播,无论安全性还是兼容性,都存在很多)。所以这类技术目前已经基本被抛弃。


对于能够直接操作操作系统的应用程序,我们通常称之为“原生应用”,Native App,今天,我们在手机上经常看到这一名词,其实这本身并不是手机端的发明,在PC端的单机应用,C/S应用,均可以称之为原生应用,手机端只是移植了一下这个技术体系而已。那么与之对应的,在浏览器中运行的应用,称之为“Web应用”,Web App,同样,PC端和手机端都存在这种应用体系,而且所有的软件开发技术,都是在PC端上先行应用起来了。


既然B/S和C/S都存在各种不足,而Flash和ActiveX这类试图把B/S变成具备B/S特性又具备C/S处理能力的技术又广受差评,那么有没有别的解决方案了呢?当然是有的,IT领域这帮聪明的程序员们,又想出来一个新的办法,那就把Web应用嵌入到C/S原生应用里面,通过把一个通常称之为Webview的控件放到一个原生应用里面,这样既可以通过Webview来访问一个网站的内容,又可以在需要的时候利用C/S架构的C端来直接操作操作系统。这类应用我们称之为“混合应用”,Hybrid App。比如我在2006年的时候用Delphi开发一个桌面小程序,就是一个标准的混合应用。在一个C/S应用程序上加入对网站的访问能力。


20200403_143543_839.jpg


当时我为了方便平时进行各种搜索,所以开发一个小工具给自己用。直接启动这个应用,想搜索什么内容直接输入,选择从哪个搜索引擎进行搜索即可。这个应用界面的上半部分就是原生应用,而下面展开后的界面,就是在这个原生应用里面内嵌了一个浏览器控件访问当时我开发一个网站(现在大家看到画面中已经无法成功访问了,因为域名和网站早就没有再维护了)。


这就是混合应用,无论是PC端,还是手机端,混合应用都是比较流行的一种应用开发方式,可以兼具B/S和C/S架构的所有功能。今天我们看到的QQ,微信电脑端,或者微信小程序等,本身都是一个标准的混合应用。


而光有单纯的B/S和C/S,根本无法支撑一些网站和企业级应用,为什么呢?没有数据库啊,怎么存数据呢?用户要访问,要使用系统,必须会产生很多数据,数据得有个地方存起来啊。所以,严格意义上的B/S或者C/S,其实在架构中还少了一个环节,数据存储。改进后的三层架构如下。


20200403_143558_006.jpg


来说一说数据库,数据库本质上就是指一个可以永久保存数据的地方,所以并不特指关系型数据库,而是只要能保存数据就行。比如早期使用一个文本文件来保存数据,或者使用XML文件或者Excel文件或者Access文件数据库来保存数据都是可以的。只是后来大家发现通过文件来保存数据操作的过程并不是特别方便,而且性能堪忧,所以后来使用关系型数据库来保存数据,关系型数据库可以更好的描述数据结构,数据之间的关系,并且通过标准的SQL查询语句也可以进行高效的查询,性能也很不错。事实上,今天的关系型数据库已经很难承受高并发处理能力,还需要在架构上进行优化,后面一点我再细说。


引入了关系型数据库后,基本上算是给各类应用系统插上了飞翔的翅膀,上述的三层架构基本上伴随着这30年来所有网络应用系统的发展,后续的更多的架构衍生和优化,也都是基于上述三层架构进行修补而已,本质上没有任意变化。三层架构的广泛应用,让所有的IT系统都得以解决实际生活和工作中的几乎所有场景,也因此,让企业级应用,电子商务,各类网络应用等所有今天看到的应用系统类型得以真正产生实用价值。比如金融行业各类系统,企业ERP系统,CRM系统,电子商务,在线支持,物流系统,制造业MES系统,网络游戏,或者最近的小区健康二维码等等,其核心都是数据资产的合理管理。包括最近微盟被运维人员删库这些事情,足以见得数据所产生的价值。也正因为如此,Oracle这家生产数据库起家的公司这些年才能赚得盆满钵满,才能这么嚣张,有恃无恐。


哎,说到这里,又不得不说一说自己的国家,在这些方面的薄弱和无力。数据库至今被美国几家公司垄断,一家是Oracle,扔有MySQL和Oracle两条数据库产品线,一家是IBM,拥有Infomix和DB2两条数据库产品线,还有一家是微软,拥有Acces和SQL Server两条产品线。不过好在MySQL有开源版本,才能让这么中小企业可以不受这几家大公司的威胁。


关于MySQL,Java与Oralce和IBM甚至微软等这几家牛逼的软件公司之间的故事,那完全可以写成一本小说,各中纠葛,分分合合,有兴趣的朋友不妨去查一查,还挺有故事性的。


所以,这几年看到国内的数据库在慢慢起步,我是感到由衷的高兴,比如大多用于军方系统的达梦数据库,阿里云和华为发布的自研数据库等,都让我们从业者能够感受到中国科技行业的进步。


希望这样的企业能够多一点,再多一点。当然,国内的科技公司但凡做出点成绩,网上总很多喷子舔狗要去嘲笑一番,然后再跪舔一下美国老爹,哎,帝国主义亡我之心不死啊。比如什么你自己开发的数据库,是关系型数据库吗?有本事别用关系型的啊,别用SQL啊,那是美国人的发明,又来骗补贴的。或者是哟,自己做芯片了,是用的ARM架构吗,有本事别用啊,不是原创啊,还好意思说自主研发?又或者是操作系统,哟,底层还是Linux啊,那你好意思说是自主研发?有本事从0开始搞一个操作系统啊?这类言语就是纯粹的没文化的体现了,没有IT文化,大抵都是这么考虑问题的。当然,国内有些企业也真是犯贱,纯粹骗国家补贴的也真不少,妈的,不想说他们了,民族败类。


咱们继续,三层架构加上数据库后,让2000年到2010年这段时间的信息化建设如火如荼,基础架构问题解决了,编程语言,浏览器,服务器应用(比如Apache,PHP,Tomcat,Nginx,Weblogic,Apusic等等),数据库等问题都变得成熟起来。那么企业信息化和网站开发就不需要关注这些基础技术了,只需要解决业务问题即可。这一时期,程序员从业人员越来越多,除了技术人员外,软件企业里面另外一个角色也变得越不可或缺,那就是需求分析师。得懂业务啊,比如你开发一个银行系统,你得知道银行原来是怎么运转的啊,流程是什么。


你开发一个供应链SCM系统,你得知道供应链管理是怎么回事啊。程序员哪懂这个,所以需要配合需求分析师,就是懂产品业务逻辑的人。这类人大抵都成长为后来的项目经理或产品经理,他们可以不懂技术,但是必须要懂业务。说到产品经理,吐槽一下有些培训机构,号称能培养产品经理,之前我也有学生跑来找我说我不想学技术,我想做产品经理。我说你懂哪个行业的产品呢?他说产品经理不就是画画流程图,找人聊聊天,顺便吹吹牛逼就可以了吗?


我想说的是,产品经理比技术更难,但是很多时候又很难体现出产品经理的价值,大家不妨去看看,那些牛逼的产品经理,最开始都是从什么领域成长起来的。没有个几年对某个行业手深刻理解,做什么产品经理呢?那叫产品助理,给产品经理打打杂是可以的。


产品经理,必须经过行业的洗礼,不是一个培训机构或者一个应届毕业生可以做成的。产品经理的培训,有一段时间还挺火的,无非就是培养一下互联网思维,讲一讲怎么画个原型等,实在没有任何技术含量可言。很多应届毕业生,小白一个,信誓旦旦要做产品经理,那都是瞎扯,有没有成长起来的,当然有,但是是极少数。


大多数就是一个打杂的,画个原型图就能成长为产品经理,你觉得可能吗?我就是公司目前在线教育平台和内部运营管理系统的产品经理,那是我在教育培训这个行业深耕了11年的结果,要不然,我不可能知道我们需要开发什么东西,用系统来解决什么问题,设计什么样的产品出来。


说到这儿了,顺便提醒一下各位想去做产品经理的朋友,先好好在一个行业里面深耕几年,从技术做起(能够更快地找到自己的位置和价值),然后慢慢地根据企业发展需要,做一个技术型的产品经理,既懂技术,又懂行业,这才是正道,这样的产品经理,才有根。千万不要被一些人给带偏了,最后吃亏的只会是自己。


行,言归正传,继续说一说架构的演进。有了三层架构做基础以后,企业、政府、事业单位、金融、医疗、制造、电商等等,各行各业的信息化建设加快了速度,好一顿投入,让2000年后的IT行业在中国高速发展,造就了IT行业繁荣的20年至今。但是当一个企业的信息系统越来越多以后,尤其是一些大型企业,什么ERP,SCM,MES,eHR,OA,Potal,官网、业务系统等等,系统特别多。于是乎出现了一些问题,导致企业和用户特别难受。


  1. 系统与系统之间,数据是独立的,如何共享数据,很麻烦,还得搞个数据中转系统,来让多系统之间能够共享数据。

  2. 一个员工要使用企业内部的各个系统,每一个系统都要先登录一次,特别麻烦。

  3. 企业的系统可能找的是不同的软件公司来开发的,有用Java开发的,有用C#开发的,也有PHP开发的,甚至还有一些其他什么技术开发的,都有。要把这些系统整合起来,特别麻烦,也不太现实。


那么怎么解决这些问题呢,当然,通过单点登录(SSO)技术,可以解决不同系统之间多次登录的问题,但是这只是一个很小的问题。其他问题怎么办呢?异构系统之间的通信如何解决,多业务系统如何打通?这才是大问题。于是,基于WebService技术,业界提出了SOA架构(Service-Oriented Architecture,面向服务架构),它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和协议联系起来。接口是采用中立的方式进行定义的,它是独立于实现服务的硬件平台、操作系统和编程语言的。这使得构件在各种各样的系统中的服务可以以一种统一和通用的方式进行交互。听起来是不是很美好,网上找了张图,将就着看一下。


20200403_143620_986.jpg


SOA架构的核心就是把一个应用系统搞成一个服务,通过企业总线来根据应用请求统一调度服务系统。应用系统不用关心后台服务是怎么回事,把企业内部的各个应用子系统全部整合起来,统一对外提供接口调用。同时,这种架构方式,使得应用系统之间相互独立又互相关联,在进行业务变更时可以不用动整个应用系统。SOA确实不太好解析,我百度了一个案例,给大家说明一下这种架构的优势就行了。


一个服装零售组织拥有 500 家国际连锁店,它们常常需要更改设计来赶上时尚的潮流。这可能意味着不仅需要更改样式和颜色,甚至还可能需要更换布料、制造商和可交付的产品。如果零售商和制造商之间的系统不兼容,那么从一个供应商到另一个供应商的更换可能就是一个非常复杂的软件流程。通过利用WebService 接口在操作方面的灵活性,每个公司都可以将它们的现有系统保持现状,而仅仅匹配WebService接口并制订新的服务级协定,这样就不必完全重构它们的软件系统了。这是业务的水平改变,也就是说,它们改变的是合作伙伴,而所有的业务操作基本上都保持不变。这里,业务接口可以作少许改变,而内部操作却不需要改变。


没怎么看懂是吧,没关系,现在已经2020年了,SOA架构也有点落伍了,现在我们基于SOA这种架构又进行了优化,现在叫“微服务架构”,也没听说过,正常,你不搞IT当然可以没听说过。但是只要你搞IT行业,一定听说过这个架构,也是目前企业尤其是大型企业系统的主要架构。我从蜗牛学院的教材里面找了两张图,给大家做个对比,你们感受一下。


第一张图是传统的三层架构的样子,这里面使用集群技术对服务器进行了水平扩展,就是服务器由多台电脑一起提供服务,来解决服务器端性能的问题。


20200403_143653_604.jpg


再来看看,对于微服务架构,又是怎么来解决问题的。


20200403_143705_674.jpg


微服务架构已将传统单体架构中的订单服务、商品服务、用户服务拆分为了独立的服务,其中的每一服务都是一个独立的应用,可以访问自己的数据库,这些服务对外提供公共的API,并且服务之间可以相互调用。


本文不讨论过深的技术架构,就是有一个感性认知,我简单说一个微服务的好处就行了,就是当系统负载比较大的时候,可能服务器扛不住压力,跨了。那么,在微服务架构模式下,如果夜间服务跨了,这并不影响商品服务和用户服务,系统一样可以继续提供服务,网站一样可以访问。


当然,针对不同的微服务,咱们也可以对微服务再进行集群,让每一个微服务都不会跨,即使跨了也有备份的服务器继续提供服务。这样就可以保证系统高性能的同时,还能提供高可靠性和高可用性。想想是不是很带劲,没错,确实是这样的。只是微服务架构的运维成本相对比较高,所以为了解决这些问题,咱们又提出了DevOps,持续集成,自动化运维等这些理念和技术,来解决运维的效率问题。


再往后一点,SaaS(Software as a Service,软件即服务),你看,又来一个服务,面向服务架构中的服务,微服务架构中的服务,软件即服务中的服务,看来这软件架构跟服务分不开了啊。确实是这样的,那么什么叫SaaS呢,其实这是比较简单好理解的,就是我给你开发一个软件,你不需要购买软件授权,也不需要在你的服务器上安装和部署,你直接租用我的软件就可以了。


比如你在淘宝上开个店,淘宝为你开发了一套卖东西的软件,你直接去淘宝注册成卖家,然后把商品一上架就可以开卖了,卖东西,租个电子门面,你给我淘宝一点钱就行了,是不是很方便。这其实就是Saas,我把我的软件部署好,你直接来用就行了,免去了你的安装部署调试的成本,而且你也不需要再去租用服务器,注册域名等,这些事情,交给我就好了,你只管用我的软件就行。其实像什么钉钉,京东,或者我们云商铺看到的一些收银系统等,基本上者是SaaS这种存在形式。道理很简单啊,你不能让一个卖饺子的小两口,还得云搞套服务器环境整个域名来转行搞IT吧,那合着我卖个饺子还要招个IT运维?


Saas本身并不是什么新鲜玩意儿,也没有技术上的改进和变化,还是一个软件而已,只不过就是说这个软件可以支持多个客户独立使用,客户与客户之间的数据是不能共享的。与Saas相对应的理念,在云计算时代,大家又提出了PaaS(平台即服务)和IaaS(基础设施即服务),说白了,就是你啥都不用管,你直接租我的就好了。我们可以租软件,当然也可以租服务器,租数据库,租硬盘等。


再比如,现在咱们很多系统都支持短信通知,那要用程序发短信,我们必须要在移动运营商那里申请授权才行。这玩意儿实在太麻烦了,所以咱们可以去租用别人的短信平台嘛,给钱就行了。我给短信平台钱,短信平台给我开发一个接口,我在程序里面调用这个接口就可以发短信了,我管短信平台是怎么跟移动运营商合作的呢,我不关心。


20200403_143720_377.jpg


蜗牛学院的在线教育平台里面,目前只是针对个人用户学习用,提供点播和直播功能。那么今年我们还有两个研发计划,一个就是面向企业用户的企业内训,企业可以在蜗牛网校注册一个账户,然后在这个平台上安排自己员工的内训计划等。还有一个叫企业招聘,企业也可以通过蜗牛网校来招聘我们的学生,同样的,企业只需要注册一个账户就行了。这种,其实也是典型的SaaS应用。


除了上述这些基础架构外,今天我再简单中大家聊一聊架构的性能优化的问题,其实系统架构并没有那么难理解。很多程序员的梦想就是成长为一名架构师,这是好事,但是也不要把架构师想得太遥远,你只要稍加努力,再用点心去思考总结,慢慢地你就成长起来了。关于架构师的问题,后面我再找时间细说,先聊一聊系统优化的问题,这个问题很多工程师都有点概念模糊,搞得不是特别清楚。包括很多性能测试工程师,一提起系统优化,就感觉头皮发麻,不知道怎么办了。其实思路挺简单的。


上面的单体架构中,提到了集群环境,这是系统性能优化的第一步,什么意思呢?就是当一台服务器不够用了,那我就给你多加几台服务器,大家一起通过集群对外提供服务。你想嘛,一台电脑假设能支撑1000个用户访问,那么10台电脑合一起,不就可以支撑10000个用户访问了吗?我们把这种方式叫做负载均衡(Load-Balance),而且这种集群环境,还有一个什么优势呢,那就是故障转移(Fail-Over),你看啊,10台服务器在提供服务,不可能10台一起跨吧,如果其中有2台服务器来不起了,崩了。没关系啊,另外8台服务器继续接过来这2台的处理任务接着处理就行了嘛。这就叫故障转移,通过这种手段,可以非常方便地实现一个高可用(High-Availability)的服务器环境。即使有后台服务器跨了,用户在使用的时候也感觉不到的。


下面这批图,也是我从蜗牛学院的测试开发专业的教材里面抠出来的,有个图给大家看要容易理解一些。


20200403_143729_532.jpg


除了通过集群来优化性能外,还有很多手段,这些手段我就简单总结一下就行了,就不细说了。一个不小心,又是连着第四篇万字长文了,看我专栏的朋友,你们如果能看到这里,说明对IT行业是真爱,好好把握吧。你看看图,看看文字,基本能懂。


  1. 多使用内存来减少硬盘的频繁访问,由于硬盘通常比较慢,即使是固态硬盘,比起内存的读写速度来说,那也是几十上百倍的差距。所以想个办法来有效利用内存,减少对硬盘的访问次数, 可以显著提高硬盘速度。使用缓存服务器就是一个很好的解决方案,看图。


20200403_143737_950.jpg


  1. 读写分离:即使使用了缓存,也不可能完全不读写硬盘啊,尤其是数据库的读写操作,完全依赖于硬盘,这是不可避免的。因为内存虽然快,但是不能永久保存啊,一旦断电或程序停止,内存的数据全者没了。所以硬盘必须得用,那么就想个办法,把硬盘用好。


20200403_143748_501.jpg


  1. 页面静态化:其实很多网站的页面都是差不多的内容,每一个用户来访问的时候看到的内容大致都是差不多的,这种情况下,那就没必要每次访问都要从数据库或缓存中取一次数据了,直接把页面变成一个静态的HTML页面,保存在服务器硬盘里面或者加载到内存里,这样可以大量地减少硬盘读写操作和数据库查询操作。同时,通过静态化处理还能显著降低CPU的运算,减少CPU使用率。经验表明,CPU很容易成为一个系统的瓶颈,那咱们就想办法少用CPU嘛。

  2. 后台架构大量使用集群,来解决高可用,高并发的问题。无论怎么优化,一台服务器的处理能够始终是有限的,那就全部集群嘛。数据库可以集群,缓存服务器可以集群,微服务架构可以集群,文件服务器可以集群,能用多台服务器解决的问题,咱就不要搞到一台服务器上嘛,现在买个服务器又不贵,实在买不起还可以租嘛。

  3. CDN网络:当用户越来越多以后,服务器通过各种架构和技术手段解决了性能问题,但是网络带宽的问题始终是不好解决的,这玩意儿,死贵死贵的。所以通过CDN来解决问题嘛,CDN叫内容分发网络,什么意思呢?你把你的网站的内容,通过购买CDN,将内容缓存到CDN服务商那里,比如我现在在成都访问一个北京的网站,而北京这个网站购买了CDN,把它的内容缓存到了成都或者四川的一个CDN服务商那里,这个时候我去访问的时候其实是访问的CDN的内容,请求根本没有通过北京,北京那边都不知道我在访问。

  4. 当然,除了这些宏观层面的各类优化手段外,还有一种方式就是调整服务器端的参数,比如调整数据库的内核参数,调整Java,PHP,Apache,Nginx,Tomcat,Weblogic等等这类服务器的内核参数,还有就是优化一下代码的算法,优化一下SQL语句的查询效率等,这些手段,都可以从微观上减少系统的负载。这部分内容,每一个都可以写成一个长篇大论,而且要求就是对各类服务器和编程语言本身有比较深的理解才行。其实,一个牛逼的程序员,和一个普通程序员,从表面上很难看出他们差距在哪里,反正都会写代码,都能实现程序的功能不是吗?往往,差别就体现在这些细微之处,你写程序的时候有没有质量意识,有没有效率意识,有没有优化意识,是否理解这些底层的原理,这些东西,表面是看不出来的。同样是技术出身的CEO,人马化腾做的是几千亿的生意,我他妈就能做几千万的生意,你说我们差哪儿呢?可能他比我帅吧。


最后,来张猛图,当做今天的结尾,感谢蜗牛学院西安校区高级讲师杨波老师供图。


20200403_143808_051.jpg


大家好,我是强哥,我是一名程序员。我始终相信“技术改变生活,研发构建未来”。其实技术,远比你想象的,有意思的多;程序员,远比你想象的,要牛逼的多的多。否则,他可能只是一个伪程序员。



为了答谢大家对蜗牛学院的支持,蜗牛学院将会定期对大家免费发放干货,敬请关注蜗牛学院的官方微信。


20190320_095757_834.jpg





版权所有,转载本站文章请注明出处:蜗牛学院在线课堂, http://www.woniuxy.com/note/479
上一篇: 资讯:IT行业激荡30年->技术改变生活(强哥畅聊)
下一篇: 资讯:IT行业的35岁,一道难以逾越的坎?(强哥畅聊)
提示:登录后添加有效评论可享受积分哦!