为什么要写这篇文章,技术也是同理,对于Java领域的应用,传统行业和互联网的技术行业都来自J2SE和J2EE的生态系统,但是两个行业的侧重点不同,传统行业注重规范严格、流程复杂、功能丰富,所以或多或少会用到J2EE规范定义的技术。Appserver是J2EE规范的完整实现。因此,传统行业的企业级软件开发基本都部署在Appserver上,可以复用Appserver提供的通用功能,节省了开发实施的工作量,而后者更注重互联网产品的非功能性质量需求,通常包括:高可用、高性能、安全性、可扩展性、扩展性等,在互联网中***有一句话是:天线武功只“快”而不破,充分看出了程序性能在互联网中的重要性公司。为了获得更好的性能,高度抽象的J2EE技术??已经不能满足需求,因此互联网技术更倾向于在简单的J2SE上开发具有互联网特性的技术栈,重新定义互联网级的开发工具、平台和技术栈。由于笔者从传统外企转型互联网三年,这两年采访了很多传统行业的同行。stack跟网上的不一样,不知道从哪里开始准备和改进。虽然他们有很强的学习和提升的欲望,但这篇文章对于那些想从传统行业进入互联网的人来说,是一篇指导性的文章。帮助读者了解互联网的技术栈,了解互联网的重点,了解互联网的核心技术,给出如何基于传统行业的技术栈快速掌握互联网的核心技术。其实只有一堵破墙破窗纸,一切豁然开朗。这里需要再次说明一下。我不认为互联网行业的技术比传统技术高深多少。这些技术都逃不出J2SE和J2EE的生态圈,但是高度抽象的J2EE技术??却因为性能的限制而被互联网所抛弃。仅此而已,但我不得不承认的是,这两个行业的侧重点不同。传统行业讲究规范、流程、功能的复杂性和正确性,而互联网则更讲究“快”。这里的“快”有两个方面。就是说一是产品运行效率要高,响应速度要快,二是开发效率要快,对市场需求的响应要快。从另一个角度看,传统行业普遍关注复杂系统的完善和丰富性,而互联网公司更关注简单垂直业务的非功能性质量,比如:高性能、可用??性、高并发、可扩展性、可扩展性、安全等,那么,从传统行业到互联网行业,作为从业者,你要走多远?您从哪里开始使用互联网?经过两年的采访,我看到了一个普遍的现象。来自传统行业的技术人员,大多掌握SSH的技能,稍微高级的工程师了解J2EE规范,他们还在使用J2EE规范EJB、JPA、JMS、JCA、JAAS等技术,数据库基本使用Oracle、DB2,Sqlserver等。传统行业的开发者基本实现的是“模块包体系”,这得益于J2EE规范的完整性,Appserver基本上提供了架构所需要的所有功能。开发者只需要将各种业务模块填入J2EE,Appserver提供给你所以传统的开发者会包揽一个模块从前台到后台的所有工作,包括:HTML,JS,CSS,EJB,JPA、SQL、PLSQL等。这些技术没用吗?当然不是,但它们非常有价值。有了这些技术,我们是不是可以一步跨入互联网呢?不,我们需要以这些技术为基础,进一步拓展我们的技术视野。广度和深度不够。下面我们就来了解一下传统行业的技术人员积累了哪些技术,下一步如何补充自己的知识,成为能够胜任互联网行业的优秀技术人员?消息队列属于传统行业。JMS相信你一定用过,作为J2EE标准的一部分,所有的Aappservers(Weblogic、Websphere、Jboss等)都有JMS的实现,那么你一定知道JMS包括两个Subject,Queue和Topic,而你也知道Send/Receive和Publish/Subscribe这两种发送和接收模式。为什么不用这些?主要有两个原因。一是商业应用服务器是收费的。但是,互联网提供的产品是免费的,互联网上使用的大部分产品也是免费的。另一个原因是这些Appservers的实现。性能很差。一些评估显示ActiveMQ比JbossMQ快10倍。在某些应用场景下,ZeroMQ的速度要高出一个数量级,可以达到细微的延迟。有兴趣的可以参考ZeroMQ的性能测试页面。另外,一些开源的MQ实现除了Queue和Topic之外,还提供了对互联网服务的支持,以及partition、group、broker等更复杂的消息模型。详情请参考卡夫卡。Kafka的设计易于使用且功能强大。丰富、高性能等优势,不仅天生具备持久化、分片、复制等功能,而且在使用中为开发者和运维带来良好的体验。Kafka的中间件设计可以参考我的博文《一个简单易用的消息队列框架的设计与实现》。所以如果你掌握了传统行业JMS规范定义的消息队列技术,只需要更进一步,请学习开源的Kafka、RockitMQ、ActiveMQ、RabbitMQ、MemcacheQ、Redis、ZeroMQ、MSQ等。深入。在传统行业,相信大家都用过Oscache和Ehcache。前者主要用于网页缓存,后者主要用于数据库数据缓存。通常可以作为Hibernate的二级缓存使用。相信也有人用过JbossCache。这是一个可以实时复制的分布式企业级Cache。也有人在项目中自己写缓存,甚至有的项目中直接使用Hashtable作为缓存。事实上,这些缓存在特定场景下加速了数据访问。成功起到了至关重要的作用。然而,互联网行业从另一个角度来使用缓存。主要有两个应用场景:***,大量数据需要集中存储,缓存中的任何数据都可以在服务的任意节点上访问,即需要数据存储的中心,也满足快速查询需求;第二,数据库读取性能有瓶颈。单机Mysql读操作在廉价硬件机器上的吞吐量在1000/s左右,大量的读查询会使数据库不堪重负。这就需要使用缓存来抵抗读流量,通常用在数据比较热的场景。从这两个应用场景来看,互联网行业更关注分布式缓存,那么数据是如何分布的呢?很简单,Hash或者consistentHash,那么,能不能先把Oscache和Ehcache放在一边,研究Redis。Memcache或淘宝的Tair怎么样?最简单的方法就是从Redis和Memcache的区别说起?除了学习分布式缓存,比如Redis和Memcache本身的功能和技术点,最重要的是要有缓存分片的思想,网上的热点数据大多缓存在缓存服务中,需要大量的缓存服务器,单机无法满足需求,所以缓存分片是一个很大的话题,缓存分片的实现一般有以下三种:通过代理层实现,比如Codis,数据的路由是在代理层实现的,对应用层是透明的。客户端分片可以参考我的开源项目redic,实现简单,使用方便,支持sharding,replication,failover等功能。缓存服务器支持的高可用模式,如:Redis3.x、Sentinel等服务框架传统行业相信大家都用EJB和Webservice来提供服务导出和导入。一些传统行业不使用APP服务器,只使用JDKRMI来导出和导入服务。但是为什么互联网不喜欢这些技术呢?Webservice用的是重量级的SOAP协议,臃肿的XML满天飞。性能不好吗?互联网呢?Internet使用轻量级RPC框架和RESTful服务。前者使用轻量级的序列化框架,如:Google的ProtoBuffer,以及Hessian、Burlap等序列化协议,后者使用简单的HTTP协议,前者适合内网高性能服务调用,后者适合对于异构平台的服务调用,例如:跨语言、跨防火??墙、前后台之间等。RPC远程调用可以参考阿里的Dubbo框架和推特的Finagle框架。Rest框架可以参考SpringWebMVC、SpringBoot、Jersey、ApacheCXF等。在互联网世界,几乎所有公司都实现了服务化。服务化带来的问题是一致性。高并发系统的一致性如何解决?使用两阶段提交协议,三阶段提交协议,TCC?还是遵循ACID原则、CAP原则、BASE原则?如果我们保证最终的一致性模型,我们有什么模式可以应用。最近,微服务越来越流行。微服务其实是面向服务的延续,更细化的面向服务的架构。微服务的服务框架代表是SpringCloud,它与Netflix集成,提供有限流、熔断、仓墙隔离、故障转移等高级特性,在服务中不可或缺。可以去官网文档了解更多SpringCloud相关技术。数据库在传统行业中,大多数开发人员使用Oracle、DB2和Sqlserver数据库。其实从功能和性能上来说,它们都不亚于Mysql,甚至优于Mysql,但是Mysql是免费的,这让Mysql得到了互联网行业的青睐。那么我们来分析一下,传统行业在数据库中缺的人才有哪些?一、Oracle和Mysql都使用B+树索引,原理是一样的,使用方法也是一样的;Oracle支持行级锁,MysqlInnodb也支持行级锁;OracleDataguard支持数据复制,Mysql也支持数据复制,但Mysql的复制模式更灵活,支持master-master配置。以上都是类似的,如果你了解相应的Oracle技术,你可以在很短的时间内掌握Mysql相关的技术。但不同的是,Oracle虽然支持集群,可以通过增加服务节点来提升服务性能,但是集群中的节点数量有限,而且数据存储是共享的,所以扩容基本采用垂直的方式,而使用Mysql采用水平方式。扩容意味着需要手动分区和分表,分治数据,以满足日益增长的读写和数据存储压力。所以,想要转行到互联网,一定要学好Mysql。推荐阅读《高性能Mysql》。部分。在互联网行业,对性能的追求已经达到了顶峰,因此要求开发人员了解数据库原理,其中最重要的部分就是索引。刚刚说到负载均衡,高并发系统,压力大了怎么办?分而治之的思想只有一种。因此,负载均衡非常重要。传统行业以销售产品为盈利模式。所以大部分项目在需要负载均衡的时候都会使用F5硬件负载均衡。其实传统J2EE规范的EJB也可以采用分布式的方式发布。通过JNDI的集成,也可以进行一定程度的负载均衡,但是这种负载均衡过于繁重,使用起来很不方便,效率也很低。与APP服务器绑定。互联网呢?经常使用软负载平衡。LVS、nginx、Apache、Varnish、Haproxy等七层、三层、四层负载均衡的原理和产品一定要了解。JVM另外,在互联网行业做Java开发,必须对JVM有所了解,并进行深入研究,比如:GC、类加载、Hotspot编译器、多线程、并发与锁、IO与NIO等。推荐看一连串深入JVM的相关资料《深入理解Java虚拟机++JVM高级特性与***实践》、《深入理解Java7》、《Java Concurrency In Practice》、《Pro Java 7 NIO.2》、《Java Performance》等,终于可以看完二龙书了《The Java® Language Specification》和《The Java® Virtual Machine Specification》。大数据与云计算作为IT从业者,必须紧跟技术潮流。云计算、大数据、CAP、BASE、选主算法等概念要了解,要研究热点技术,如:Hadoop、Hbase、Zookeeper、Openstack、Dooker、Kafka、Storm等。性能评估与容量预估如果你决定要来互联网一展身手,就必须学习性能评估与容量预估,其中包括对前端机器、缓存、消息队列、数据库等各种性能指标的预估,如:throughput、responseTime、memory、CPU、IO、networkIO等。关于性能和容量评估的方法论和典型案例,请参考《互联网性能和容量评估方法论和典型案例》一文。为了保证架构设计的合理性,在架构设计的前期就完成了性能和容量评估,以证明架构方案的可行性。目标推荐完成,我会在后续文章中向读者介绍性能测试的方法论和设计流程。互联网架构方法论在互联网行业中,处理大规模高并发用户请求的核心思想只有一个,那就是“分而治之”。因此,业务通常被拆分成多个服务,职责单一。在单个服务中,业务逻辑并不复杂,但对非功能性的质量要求要求很高,通常表现在性能、易用性等方面。因此,互联网的架构设计首先考虑的是非功能性的。功能质量,不同于传统行业注重功能和业务流程。情况不同了。互联网行业的架构设计案例,可以参考Vesta的设计与实现。思路。技术研究和在线应急响应在互联网公司中,大部分产品都是针对用户端的。用户端产品的特点是用户量大,产品必须能够处理大量用户产生的大规模、高并发的用户请求。产品的可用性相对敏感。在这种环境下,技术研究和在线应急响应就显得尤为重要。比如:线上线程卡死怎么解决,OOM问题怎么解决,服务超时怎么解决等等,可以参考下面两篇文章:Java服务系统线上应急与技术研究,你必须掌握Linux命令和Java服务系统在线应急和技术研究,你必须掌握那些应用层脚本和Java虚拟机命令。看到这里,你会豁然开朗。希望本文能帮助更多传统行业的从业者向互联网转型,在互联网的大舞台上展现自己的才华。《Java技能图谱》面试和甄别人才,可以根据里面的思维导图深入学习各种知识点,每个知识点都需要系统学习,或者看书或者查询相关资料,记得积累知识广度同仁也需要有一定的深度。点击《Java领域从传统行业向互联网转型你必须知道的那些事儿》阅读Java秘籍原图。【本文为专栏作家“李彦鹏”原创稿件。转载可通过作者简书号(李彦鹏)或专栏取得联系】点此查看该作者更多好文
