基本信息
编辑推荐
实践是最好的成长 发表是最好的记忆。
分布式Java应用第一手经验的总结和分享。
分布式Java应用知识点的全景图。
内容简介
目录
第1章 分布式Java应用 1
1.1 基于消息方式实现系统间的通信 3
1.1.1 基于Java自身技术实现消息方式的系统间通信 3
1.1.2 基于开源框架实现消息方式的系统间通信 10
1.2 基于远程调用方式实现系统间的通信 14
1.2.1 基于Java自身技术实现远程调用方式的系统间通信 14
1.2.2 基于开源框架实现远程调用方式的系统间通信 17
第2章 大型分布式Java应用与SOA 23
2.1 基于SCA实现SOA平台 26
2.2 基于ESB实现SOA平台 29
2.3 基于Tuscany实现SOA平台 30
2.4 基于Mule实现SOA平台 34
第3章 深入理解JVM 39
3.1 Java代码的执行机制 40
3.1.1 Java源码编译机制 41
3.1.2 类加载机制 44
3.1.3 类执行机制 49
3.2 JVM内存管理 63
3.2.1 内存空间 63
前言
对于用户而言,除了功能以外,网站访问够不够快,网站能否持续提供服务,也是影响用户访问量的重要因素,因此如何保证网站的高性能,及高可用也是我们要关注的重点。
为了支撑巨大的访问量和数据量,通常需要海量的机器,例如现在的google已经拥有了百万台以上的机器,这些机器耗费了巨大的成本(硬件采购成本、机器的电力成本、网络带宽成本等)。网站规模越大,运维成本就越高,这意味着商业公司所能获得的利润越低,而通常这会导致商业公司必须从多种角度关注如何降低网站运维成本。
本书的目的是从以上几个问题出发,介绍搭建高性能、高可用以及可伸缩的分布式Java应用所需的关键技术。
目标读者
本书涵盖了编写高性能、高可用以及可伸缩的分布式Java应用所需的知识点,适合希望掌握这些知识点的读者。
在介绍各个知识点时,作者尽量结合自己的工作,分享经验与心得,希望能够对那些有相关工作经验的读者有所帮助。
内容导读
本书按照介绍的知识点分为五个部分:第一部分介绍基于Java实现系统间交互的相关知识,这些知识在第1章中进行介绍;第二部分为基于SOA构建大型分布式Java应用的知识点,这些在第2章中介绍;第三部分为高性能Java应用的相关知识,这些在第3、4、5章中介绍;第四部分介绍高可用Java应用的相关知识,这些在第6章中介绍;第五部分介绍可伸缩Java应用,这些在第7章介绍,读者也可根据自己的兴趣选择相应的章节进行阅读。
网站业务多元化的发展会带来多个系统之间的通信问题,因此如何基于Java实现系统间的通信是首先要掌握的知识点,在本书的第1章中介绍了如何基于Java实现TCP/IP(BIO、NIO)、UDP/IP(BIO、NIO)的系统间通信、以及如何基于RMI、Webservice实现系统间的调用,在基于这些技术实现系统间通信和系统间调用时,性能也是要考虑的重点因素,本章也讲解了如何实现高性能的网络通信。
在解决了系统之间的通信问题后,多元化的发展带来的另外一个问题是多个系统间出现了一些重复的业务逻辑,这就要将重复的业务逻辑抽象为一个系统。这样演变后,会出现多个系统,这些系统如何保持统一、标准的交互方式是要解决的问题,SOA无疑是首选的方式,在本书的第2章中介绍了如何基于SOA来实现统一、标准的交互方式。
高性能是本书关注的重点,Java程序均运行在JVM之上,因此理解JVM是理解高性能Java程序所必须的。本书的第3章以Sun Hotspot JVM为例讲述了JVM执行Java代码的机制、内存管理的机制,以及多线程支持的机制。执行代码的机制包含了Sun hotspot将Java代码编译为class文件,加载class文件到JVM中,以解释方式执行class,以及client模式和server模式编译为机器码方式执行class的实现方式;内存管理的机制包含了Sun hotspot内存分配以及回收的机制,内存分配涉及的主要为堆上分配、TLAB分配以及栈上分配。内存回收涉及的有常见的垃圾回收算法、Sun Hotspot JVM中新生代可用的GC、旧生代可用的GC及G1;多线程支持的机制包含了多线程时资源的同步机制,以及线程之间交互的机制。
除JVM外,在编写分布式Java应用时,通常要使用到一些Sun JDK的类库。如何合理地根据需求来选择使用哪些类,以及这些类是如何实现的,是编写高性能、高可用的Java应用必须掌握的。在本书的第4章中介绍了Sun JDK中常用的集合包的集合类、并发包中的常用类(例如ConcurrentHashMap、ThreadPoolExecutor)、序列化/反序列化的实现方式,同时对这些类进行了基准的性能测试和对比。
掌握JVM和使用到的类库是编写高性能Java应用的必备知识,但除了编写之外,通常还会面临对已有系统进行调优。调优是个非常复杂的过程,在本书的第5章中介绍了寻找系统性能瓶颈的一些方法以及针对这些瓶颈常用的一些调优方法。寻找性能瓶颈的方法主要是根据系统资源的消耗寻找对应问题代码的方法,常用的一些调优方法主要是降低锁竞争、降低内存消耗等。
除了高性能外,高可用也是大型Java应用要关注的重点,在本书的第6章中介绍了一些构建高可用系统常用的方法,例如负载均衡技术、构建可容错的系统、对资源使用有限制的系统等。
在面对不断访问的访问量和数据量时,最希望能做到的是仅升级硬件或增加机器就可支撑,但要达到这个效果,在软件上必须付出巨大的努力。本书的第7章介绍了构建可伸缩系统的一些常用方法,主要包括支持垂直伸缩时常用的降低锁竞争等方法;以及支持水平伸缩时常用的分布式缓存、分布式文件系统等方法。
关于本书的代码
书中大部分代码只列出了关键部分或伪代码,完整的代码请从http://bluedavy.com下载。
关于本书的反馈
每次重看书稿,都会觉得这个知识点尚须补充,那个知识点尚须完善,但书不可能一直写下去。在提交终稿的时候,我不特别兴奋,倒是有一点遗憾和担心,遗憾书里的知识点还没有足够讲开,担心自己对某些知识点理解不够,误导了大家。为此,我在自己的网站(http://bluedavy.com)上开辟了一个专区,用于维护勘误,并将不断地完善书中涉及的知识点,欢迎读者反馈和交流。
序言
分布式计算不是一门年轻的技术,早在上个世纪70年代末便已是计算机科学的一个独立分支了;它也不是一门冷僻的技术,从C/S模式到P2P模式,从集群计算到网格计算,乃至风靡当下的云计算,都是其表演的舞台。另一方面,Java作为一门应网络而生的语言,对分布式计算有着天然的友好性,同时也是当今最流行的编程语言。然而令人稍感意外的是,以“分布式Java应用”为专题的书籍并不多见,佳作则更少。至于国人所著者,请恕在下孤陋,尚未得见。不过细想之下,其实不足为奇。要开发一个高质量的分布式Java应用,以达到高性能、可伸缩、高可用、低延迟的要求,同时保证一致性、容错性、可恢复性和安全性,是何等的不易啊。它对程序开发的挑战在于:不仅需要对Java语言、类库、各种框架及相关工具极为熟悉,还需要对底层的JVM机制、各种网络协议有足够的了解;它对分析设计的挑战在于:不仅需要熟悉传统的应用架构模式,还需要掌握适用于分布式应用的架构模式和算法设计。此外,分布式应用对数据库管理员、测试分析人员等也提出了更高的要求。一本书若想涵盖这么多的内容,其难度可想而知。作者不仅需要具备起码的理论素养,更需要有丰富的实践经验。如果仅仅是纸上谈兵,对读者是无甚裨益的。
正因如此,半年多前收到林昊先生的部分书稿时,便窃感欣喜,认定这是一个很好的选题。作为淘宝网的系统架构师,他有着令人艳羡的得天独厚的实践机会。尤其难得的是,林昊亲身经历了淘宝网的快速成长和转型期,饱尝其间的成败甘苦,从中也获得了许多宝贵的第一手经验。如今,他选择将这些经验以书籍的形式与众共享,对有志于分布式应用开发的读者而言无疑是一大福音。
本书的基础部分介绍了分布式Java应用的基本实现方式、相关的JDK类库和第三方框架,并对JVM的基本机制进行了深入解析;实践部分则关注于性能调优、高可用和可伸缩系统的构建等。全书文风朴实,并附有大量的代码、数据和图表,比较符合大多数程序员的口味。如果用挑剔的眼光看,本书在深度、广度和高度上还有继续改进的余地,比如:对关键性的并发设计和算法设计可以介绍得更深入些;尚未涉及分布式应用中的安全问题;在性能调优一章中对Java源码级别的优化介绍似嫌不足;未能高屋建瓴地总结和提炼出分布式应用独有的编程和设计原则、架构和思维模式,等等。当然,对于这样一本上乏经典可参、下需躬身实践的书籍来说,以上多属苛求。事实上,本人在审稿过程中也是获益良多。
另值一提的是,林昊先生利用业余时间写作,已是经年有余,其间数易其稿,且从善如流,充分体现了技术人员的求道精神。本书的主题在明是分布,在暗则是分享——分享一段成长经历、分享一份宝贵经验,无论对作者还是读者,都是善莫大焉。
郑晖
http://blog.zhenghui.org/
《冒号课堂——编程范式与OOP思想》作者
2010年5月于广州
推荐序(二)
提起诸如“高性能”、“高可用性 ”、“大规模并发”、“可扩展性”这些词汇,我相信多数技术人的心情都是激动而稍有点复杂的,当然,也或许是不屑一顾。毕竟不是谁都有机会面对这些富有挑战的技术场景,也不是每个架构师在面对这些挑战之前都能做好技术上的准备。那些意外故障总是不期而至,疲于奔命地解决问题的场景回顾起来对架构师来说犹如一场噩梦。
本书阐述当一个面向数以亿计用户的网站经过几年高速发展,技术团队不得不面临大规模、高并发、高扩展性等挑战带来的技术困境的时候,一个出色的架构师经过多年一线实践后累积的经过时间考验的解决方案以及宝贵的实战经验。在这本书里,你会看到作者在解决一些关乎Web应用问题的指导原则、实践方法、多重工具的综合运用以及作者本人的感悟。要强调的是,本书讲述的内容是一个Web应用从小到大过程中遇到的棘手问题的解决之道,并非宏观解析,亦非屠龙之技。无论您面对的站点是大是小,皆会有参考作用,毕竟大站点会越来越复杂,而小站点总有一天也将变大。
如今到计算机书店里走一下,会发现Java架构相关的技术图书虽已不少,但仍有理由相信本书内容填补了在Java架构实战方面的空白。在互联网应用大行其道的今天,有些名义上主题为Java架构的图书,要么单从Java本身阐述,缺乏整体应用的大局观;要么是高屋建瓴,从编程思想的高度坐而论道,缺乏实践性;要么是闭门造车之作,缺乏验证性。本书作者林昊多年来致力于推动OSGi在国内的发展,不乏理论功底,而后加盟淘宝网(Taobao.com)的几年间奋战在架构一线,爬摸滚打积累了丰富的实践心得。所以,本书是一本不折不扣的“理论结合实践”之作。
考虑国内的技术图书出版环境以及必须尽力适应读者的预期,写书本身是一件十分耗费心力的事情,但能将知识传递给更多人无疑又是让人快乐的。现在,经过作者近两年的梳理与总结,这本书即将出版,相信读者在研读本书之后会有所收获并可运用到所面对的Web应用上,也期待将来有更多朋友能够分享架构实践经验,一展才华,不亦快哉!
冯大辉
http://dbanotes.net
2010年5月于杭州贝塔咖啡