阿里用了这些技术

        首先今天是母亲节,祝天下母亲快乐。        

        目前软件公司和互联网公司仍然是以JAVA为主要的开发语言,阿里巴巴、京东、百度、腾讯、美团、去哪儿、携程等公司否是以Java为主要的编程语言。即使是云计算领域Java 还是aws,Google app,微软azure云。

        不难发现在招聘网站和TIOBE的数据能看到Java是目前最广,需求最大的编程语言,



        如果你想要学习Java做开发,必须要了解的并掌握的体系,这样比较针对学习。    

        这图分为两个部分,左边的是包括缓存分布式、中间件、设计模式、数据结构和算法,右边的是web javaee框架和数据库,

        如果你以后做高级工程师和架构师,以上的内容是比必须要掌握的体系。

互联网的公司对这方法的要求比较高,业务架构需要低成本,安全和规模化、高性能、高并发、高可用、高拓展。

java本身包括的知识点,例如结构化编程、面向对象、方法、变量、数据类型、运算符等语言的基本特性是必须要掌握的内容。

下面说下在互联网中的位置。


        介绍下阿里巴巴从2003年到2012年时间这十年的技术发展,及时现在有过去了五年,我仍然会发现即使是现在,我们也能看到很多公司都有淘宝的影子,因为淘宝的核心技术架构使用的就是java语言。


        淘宝初始阶段,2003年4月马云在杭州成立了10个人的组织,一开始他们是以个人对个人的即C2C的的交易平台,并且需要求双方的信息保密,需要在最短时间弄这样的网站,需要维护成本低,容易扩展,轻量简单。当时符合条件的只有Linux +Apache+Mysql +php这样的技术架构,优点:无需编译、发布快速、而且php功能非常强大,能从页面一直渲染做到数据访问完成所有的事情,最重要的是技术开源免费。

        直到今天仍然很多公司使用这样数据存储的体系,还有很多中小型项目基本都会采用这样的存储架构。这里面使用到mysql,其中一个master主库,和两个slave从库,并使用了读写分离的技术,主库负责读写数据,从库负责付读数据,这么做的好处:1.备份数据库,slave从库负责备份数据,这样增加了安全性,2.读、写的效率得以提升,因为写比读更加消耗资源,分开以后就互不干预。这样的方法主要体现了存储可靠性上,保证系统发生故障的情况下保证不会丢失所有的数据。说到这里我们需要掌握和注意下数据库的技术的重要性,无论是使用PHP还是java还是其他语言,数据库都是必须要掌握的技术,因为软件的本质就是对数据的存储和数据处理,而且我们还需要知道数据库的优化,加锁,存储引擎等基本概念的应用场景。


        以上这是淘宝发行的第一版,在成立工作室到发布上线仅仅用了一个月的时间。那时的背景无意中促进了淘宝的发展,就是2003年sars,人们都不敢出门去商店购物,很多人就通过在网上购物,当时一下子的大量访问是淘宝出现了点小问题,当时使用的是第四版的mysql,在数据容量的数据安全有很多先天不足的地方,在2003年底淘宝引来第一次更新。


        上面是淘宝第二个版本的技术架构,这里很明显看到了Oracle代替了mysql,Oracle的特点是稳定,安全,容量大,性能高,并且Oracle还用链接池技术,解决高并发和高性能,连接池是我们需要掌握的一个技术,问题是PHP没有办法使用链接池,没办法直接用PHP来访问Oracle的链接池,所以当时淘宝使用了个开源的技术叫sql relay来链接Oracle,sql relay有个问题就是经常造成服务的死锁,解决的办法只有重写服务器,所以有只能考虑升级下个版本了,在那时候的技术已经没有突破口了,只能对网站脱胎换骨.



        因为数据库只能用Oracle,所以PHP就不能再使用了,所以只能更换开发语言,java在当时就已经是非常成熟的语言了,具有非常稳定的框架,世界最大规模的网站也普遍采用java开发,所以PHP只适合中小型网站的快速开发,如果是企业级大规模的系统一定要选择java的技术架构。上面的淘宝2.0版本已经把语言换成了java,由原来支持PHP的Apache服务器替换成Java的jboss服务器,当时主流的MVC框架是struts,当时struts的弱点多人协作和高并发,所以淘宝使用了自己开发的mvc框架,控制层使用了当时sun公司大力推广的EJB,持久层使用了mapping。为了缓解数据库压力,换成了IBM的Oracle小型机,内存换成了emmc。

        商品查询和店铺查询放在右下角搜索引擎中。

        随着时间的推移,数据访问量也在飞速增加,需要考虑如何对Oracle扩展,Oracle是个封闭的系统,想要扩展它最直接就是增副分表,Oracle的处理能力是有上限的,查询访问量上亿,需要突破这样的限制,最简单方式就是多用几个Oracle数据库,这就是分库分表,把数据库中特别大的表通过行或者列拆开分成多个表,这就是分库分表。



        从上面的架构图中发现阿里已经对Oracle数据库进行拆分,我们在学习过程中也需要掌握已有的业务对数据存储的分库分表,策略,原则,方法,分库分表后如何对跨表进行数据查询,也是在其中工作中需要解决的问题。

        在web层由EJB换成Spring,因为之前淘宝改造2.0版本的时候是找sun公司的人过来改造,sun公司是主张使用自家的EJB,事实证明EJB是非常臃肿的,在开发角度来看学习成本也很高,所以后开还成Spring,这样代码也精简了很多。

        如果学习Java的同学们,需要掌握企业级的框架Spring (mvc不流行)  web x是淘宝自己技术,所以掌握Spring MVC即可,持久层是mybatis ,另外还有安全的框架,还有一些日志框架,测试框架。

        到此为止淘宝为了缓解数据库的压力,提高搜索效率,淘宝引入搜索引擎,分库分表,2005年的时候淘宝商品数量有1663万个日均pv八千多万个,会员有一千三百万个,数据库的压力仍然很大,那么久加入了缓存。

缓存是图中左下角cache的内容,因为一些数据是被频繁范围,但有不需要频繁修改的,每次访问都需要去数据库中直接查询,这样会大大增加数据库的读取压力,那么就可以哪些不经常修改的数据放入缓存,每次访问直接从缓存读取,这样避免访问数据库从而减少数据库的压力。


        CDN是内容分发网络,因为天猫双11的访问量完全可以拖垮一个中小城市网络的带宽,显尔这些访问量不可以集中一起,所以就是用CDN了,图中的是使用CDN前后的网络配置对比图,使用CDN前是所有请求发送到中央节点,使用CDN后用户请求会被发送最快的CDN服务,淘宝在全国建立数百个CDN节点,这样全国各地的用户就可以通过这些节点访问,减少对中央节点的访问和提高用户的访问速度,那么前面的1.0是个比较稳定的版本了,使用了两年多的时间,随着业务的发展,淘宝网上的图片会以往年三倍的速度增长,2010年淘宝网后端系统就保存着286亿个图片文件,在淘宝网图片访问量会占到百分之九十以上,这给淘宝网带来巨大的挑战,在2007年之前淘宝网一直使用的是Nginx,即使是最高端的产品也无法满足淘宝的要求,淘宝网应当是已经是业内最强的了,它遇到的问题史前重来没人遇到过,意味着淘宝网必须要自己去解决问题,走向技术创新的道路,所以今天看见很多公司解决方案都基于阿里,后来淘宝基于Google file system 自己开发了T F S图片存储系统解决了图片存储问题。



        上图是TFS的结构图Storage使用了TFS服务器集群,Application是使用两百多台服务器用于缩略图的运算。图片前端服务器是一级缓存和二级缓存,最前面还有全局负载均衡的设置解决高并发下热点下访问图片的问题,这样访问到TFS的数量就会大大优化,这次升级涉及到缓存技术和负载均衡技术。


        为了增强缓存存储,淘宝再开发了开源的分布式的缓存系统,是key  value的缓存系统

        上图是淘宝开发TFS和分布式缓存之后的系统框架,左下角是分布式存储系统,

        以上分布式缓存是淘宝独有的,我们一般使用的分布式缓存有Memcached(较早的项目使用)和Redis(主流)。




        上面这个淘宝3.0的架构图了,与之前的对比,发现之前的系统很多功能耦合再一起的,加入某功能出现问题,其他地方也会出现问题,随着新业务越来越多,所以出现了这样的一个架构,淘宝的代码量出现了爆炸式的增长,新招聘的人员根本看不懂之前的代码,只能摸索性趣修改,代码越来越臃肿,系统耦合性越来越高,开发效率越来越低,系统出错的概率也逐步增长,经常是改了这里的A模块的代码B模块有出问题了,有段时间淘宝上线了淘宝旅行和淘宝彩票,这两个模块都和主站的业务不一样,淘宝旅行是按照航班信息展示信息,淘宝彩票是按照双色球、数字等展示信息,如果把这两个模块加入主站,就会有很多无关的代码,而且代码都耦合再一起,会为主站引入很多新的bug,如果是新建两个模块就会重复会员与评价等功能都需要重新写一遍,当时有这门一句搞笑的话,编译一段代码,运行一下,如果通过,一下子半个小时过去了,如果不通过,一下子半天过去了。  再这是应该解决的问题是系统之间的耦合性,维护,一直增加的访问流量和数据的存储等一系列的问题,所以淘宝需要再次迎来脱胎换骨的改造,分布式电子商务信息系统,这就是上图这架构产生的背景。等于在一家高速飞行的飞机换发动机。

        在淘宝新的业务中,把每个业务都放在独立的模块中,独立开发,独立编译,独立部署,独立运行,就是不同的店铺,分布在不同的服务器中,作为独立的服务,逐渐形成稳定的服务中心,前端的多变应用能迅速解决需求。这就是分布式服务架构,

        在分布式服务架构中,他们之间的关系图如下图,关系变得非常复杂,服务和服务之间的调用像个复杂的蜘蛛网,资源的评估和资源的浪费的问题逐渐显现出来,此时需要增加一个调度中心管理集群的容量,提高集群的利用率。



        在下面的中长图中加入了服务中间件,当时淘宝是自主要发的高性能服务框架HFS,这是真正的SOA面向服务的架构,下游的系统中会向服务中间件注册分布式缓存,数据管理。上游的系统会向服务中间件调用服务。


        那么目前淘宝也有这么一个开源的dubbo,也是扮演着服务中间件的功能,很多互联网企业在面向服务中都会用到这个开源的中间件。

        分布式系统当中还需要解决一个问题,及时系统之间的消息传输问题,例如买下一件商品够,在交易系统中付款完了之后,通知商品管理系统和旺旺系统发送,通知物流系统上门收件,用户的一个请求会引起数十个系统发起通知,这些消息都是发送给不同的业务系统的,而这些通知应该互不影响,即使一个通知发送失败不应该影响其他通知的发送,所以需要将这些通知做异步处理,因此消息中间件诞生了。



        上门的图片是加入消息中间件的系统架构图,ActiveMQ和 RabbitMq (是阿里开源的消息中间件)以及Kafka,我们可以选择一个主流的消息中间件学习。淘宝有了服务中间件和消息中间件之后每个模块都可以独立运行了,但是数据库的压力仍然在增加,2007年淘宝网日均PV就达到2.5亿个,商品数超过一亿个,全网成交额就达到四百多亿元,注册会员五千多万,之前提到的Oracle+IBM小型机+EMMC存储这样的组合非常昂贵,一套下来就是千万级别,数据存储的成本是难以控制的,因此在不影响正常业务发展的前提下,淘宝的解决方案是一部分才有MySQL 另一部分才有Oracle,那么目前淘宝团队研发了Oceanbase数据库,这是一个海量存储,高性能,分布式的数据库系统,它实现数千亿条记录,数百TB数据更新,高性能跨表读事物、跨表查询等一系列功能,另外为了优化用户体验,用到了一下用户行为追踪等技术,当我们访问一个html页面的时候,浏览器首先会向服务器请求这个页面,页面加载后就会加载页面用到的css样式文件,还有js动态脚本文件,图片文件等其他文件。但是在浏览器在同一个域名下,并发加载的资源是有限的,每个浏览器对这种限制都不一样,一般最多控制在六个以内,也就是打开淘宝首页,最多能加载6个资源文件,淘宝首页的还有脚本资源基友几百个之多,并发链接数那么小,肯定要加载很久才能完成,所以前端人员会将这些脚本文件分到多个域名下,这样就能变相绕过浏览器的限制了。

        所以以上涉及到内容分发CDN的知识了,所以还是需要掌握一些web前端的基础知识,包括简单的HTML,css,js,http和htps协议,这里说下Java本身的高级特性 面向对象,异常,泛型,内部类,反射,IO/NIO,集合,多线程,并发类容器,数据结构,算法,设计模式,JVM。互联网解决的问题就是高并发,高可用,高扩展架构,  NIO和IO提高磁盘读写性能,多线程设计到高并发编程提高应用程序的执行效率。

        总结以上的内容可分为5大部分 1.牢固的Java基础。2.Java进阶,高并发编程,Java虚拟机。3.Java应用开发的扩展,数据库编程,主流开源框架,分布式开发。4.Java安全方面的内容,安全问题和处理方法,5.Java性能方面的内容,需要掌握一些工具。



版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/pangzhaowen/article/details/80299631

猜你喜欢

转载自blog.csdn.net/pangzhaowen/article/details/80299631