最近因为有Java分布式应用的需求,因此,我搞到了林昊的《分布式Java应用基础与实践》(以下简称F)这本书。我决定花2个月时间,把这本书仔细研读一下,好好学习,多多实践。另外,我会把自己的读书心得、实践体会分享出来,毕竟“发表是最好的记忆”。不管是以什么形式发表,写这个blog就是对自己2015年最好的记忆。
下面便是我的读书和实践的笔记。
总的来讲,F介绍了如下几点:
1.基于Java实现网络通信、RPC;
2.基于SOA实现大型分布式Java应用;
3.编写高性能Java应用;
4.构建高可用、可伸缩的系统
由于林昊林大侠是在淘宝网工作的架构师,因此,他的书应该深度、广度都足够了。其实,书里有很多最基本的知识和技术、技巧。这也是为什么JAVA基础,或者说编程基础对于每一个程序员都至关重要。
(分布式计算类别很多,或者说概念很庞杂,如C/S模式、P2P、集群计算、网格计算、云计算都属于这个范畴,由于Java是一门网络编程语言,因此,比较适合分布式计算,另外还有相当庞大的类库作为支撑)
从我的角度来看,开发好的分布式应用的确很难,开发一个高性能、可伸缩、高可用、低延迟、确保一致性、容错性、可恢复性和安全性的分布式系统更是难上加难。它要求我们要深刻的理解Java语言、类库、各种框架和相关工具,还要对底层的JVM机制、各种网络协议有足够多的了解,它对于分析设计的挑战在于不仅需要熟悉传统的应用框架模式,还需要掌握适用于分布式应用的架构模式和算法设计,还要带上好的数据库管理员和测试人员。
下边来说一下,为什么我要写这个blog。首先,书中的一句话-----“实践是最好的成长,发表是最好的记忆。(后半句是胡适的话)”----对我的触动非常大。我自认为文笔不错,平时也喜欢写点、做点什么东西。因此,写这个blog,是满足自己的兴趣爱好。其次,我需要这样的一个继续性文档,我需要通过这个文档与自己对话,或者说与昨天的自己,今天的自己,明天的自己对话。我会看到自己的成长,我会发现自己的不足,我会改正他。还有,我其实是有一个问题的,“做一个分布式的应用,我们到底要学习什么呢?”。我想,从这本书入手,一点一点的找到问题的解答。
这本书,我今天将正文以外的部分文章,都通读了一遍,收获还是蛮丰富的。比如,“实现基于TCP/IP(NIO、BIO)、UDP/IP(NIO、BIO)系统之间的通信,基于RMI、WebServices之间的系统间调用。”其实,这些技术我都用过,但是,在技术的理论方面,我总是很模糊,关于通信和调用,我也总是搞的模棱两可。今天,就以读到这里的程度,我便解决了这问题,也算是一个可喜可贺的事情了,一个迷雾打破了,我期待着冲散下一团迷雾。
这本书的目录我也通读了一遍,我有点破不接待的想翻到某个章节去畅快的阅读。我构建一套分布式系统的基础知识或者说理论知识就在那里。这些知识,有的我可能学过,有的我可能实践过,但是,从来没有这样的系统的梳理过,细细品读过,我希望结合着本次的读书,把自己的知识,永远铭记在心里。
(作者告诉我们,不管是写书也好,还是写blog也好,每天写一点,哪怕是一点点,那也是极好的。因此,以后,每天都写一点吧,我们有早上的时间,中午的时间,晚上的时间等等)
书中的一个编辑周老师也提醒了一下,他的意思大概是,写书也好,写博客也好,有很多好处:
1. 写作犹如教书,你想把道理写给别人,讲给别人,教给别人,那么你自己要完全的懂得理解这个道理。
2. 写作,梳理了自己的知识点,让自己重新审视自己的已有的知识,让自己站的更加高远,望的更远。
3. 这个是一个自我传播的过程,毕竟现在是一个自媒体时代了,写下来的东西都是自己的宝藏。
下面,我们来看看目录。我将会结合着目录构建一个我自己的文件管理体系。
1 分布式Java应用
1.1 基于消息方式实现系统间的通信
1.1.1基于Java自身技术实现消息方式的系统间通信
1.1.2基于开源框架实现消息方式的系统间通信
1.2 基于远程调用方式实现系统间的通信
1.2.1基于Java自身技术实现远程调用方式的系统间通信
1.2.2基于开源框架实现远程调用方式的系统间通信
2 大型分布式Java应用与SOA
2.1 基于SCA实现SOA平台
2.2 基于ESB实现SOA平台
2.3 基于Tuscany实现SOA平台
2.4 基于Mule实现SOA平台
3 深入理解JVM
3.1 Java代码的执行机制
3.1.1Java源码编译机制
3.1.2类加载机制
3.1.3类执行机制
3.2 JVM内存管理
3.2.1内存空间
3.2.2内存分配
3.2.3内存回收
3.2.4JVM内存状况查看方法和分析工具
3.3 JVM线程资源同步及交互机制
3.3.1线程资源同步机制
3.3.2线程交互机制
3.3.3线程状态及分析
4 分布式Java应用与Sun JDK类库
4.1 集合包
4.1.1ArrayList
4.1.2LinkedList
4.1.3Vector
4.1.4Stack
4.1.5HashSet
4.1.6TreeSet
4.1.7HashMap
4.1.8TreeMap
4.1.9性能测试
4.1.10 小结
4.2 并发包(java.util.concurrent)
4.2.1ConcurrentHashMap
4.2.2CopyOnWriteArrayList
4.2.3CopyOnWriteArraySet
4.2.4ArrayBlockingQueue
4.2.5AtomicInteger
4.2.6ThreadPoolExecutor
4.2.7Executors
4.2.8FutureTask
4.2.9Semaphore
4.2.10 CountDownLatch
4.2.11 CyclicBarrier
4.2.12 ReentrantLock
4.2.13 Condition
4.2.14 ReentrantReadWriteLock
4.3 序列化/反序列化
4.3.1序列化
4.3.2反序列化
5 性能调优
5.1 寻找性能瓶颈
5.1.1CPU消耗分析
5.1.2文件IO消耗分析
5.1.3网络IO消耗分析
5.1.4内存消耗分析
5.1.5程序执行慢原因分析
5.2 调优
5.2.1JVM调优
5.2.2程序调优
5.2.3对于资源消耗不多,但程序执行慢的情况
6 构建高可用的系统
6.1 避免系统中出现单点
6.1.1负载均衡技术
6.1.2热备
6.2 提高应用自身的可用性
6.2.1尽可能地避免故障
6.2.2及时发现故障
6.2.3及时处理故障
6.2.4访问量及数据量不断上涨的应对策略
7 构建可伸缩的系统
7.1 垂直伸缩
7.1.1支撑高访问量
7.1.2支撑大数据量
7.1.3提升计算能力
7.2 水平伸缩
7.2.1支撑高访问量
7.2.2支撑大数据量
7.2.3提升计算能力
下面是大段的从书中抄录的内容,我先在这里抄下来,然后慢慢改。
软件系统得到用户认可后,访问量通常会产生爆发性的增长,比如网站,像淘宝呀、豆瓣呀之类的。
这个是一个挑战
对于用户来说,处理功能外,一个好的界面,快的速度也是用户关注的,和影响访问量的重要因素。
这本书的写作是由浅入深的,首先,从一个网站出发,网站业务多元化的发展会带来多个系统之间的通信问题,因此,如何基于java实现系统间的通信是首先要掌握的知识点,因此,本书先介绍了java实现TCP/IP(BIO,NIO)、Udp/ip(BIO\NIO)的系统间通信,以及如何基于RMI、webservice实现系统间的调用,在基于这些技术实现系统间通信和系统间调用时,性能也是要考虑的重点因素,本章也讲解了如何实现高性能的网络通信。
在解决了系统之间的通信问题后,多元化的发展带来的另外一个问题,是多个系统间出现了一些重复的业务逻辑,这就要将重复的业务逻辑抽象为一个系统,这样演变后会出现多个系统,这些系统如何保持统一、标准的交互方式是要解决的问题,SOA无疑是首选方式,本书介绍了基于SOA来实现统一、标准的交互方式。
高性能是本书关注的重点,JAVA程序均运行在JVM之上,因此,理解JVM是理解高性能java程序所必须的,本书以Sun Hotspot jvm为例讲述了jvm执行java代码的机制、内存管理机制,以及多线程支持的机制,执行代码的机制包含了sunhotspot将jAVA代码编译为class文件,加载class文件到jvm中,以解释方式执行class,以及client模式和server模式编译为机器码方式执行class的实现方式,内存管理的机制包含了sun hotspot内存分配以及回收机制,内存分配涉及的主要为堆上分配、TLAB分配以及栈上分配。内存回收涉及的有常见的垃圾回收算法、sun hotspot jvm中新生代可用的gc、旧生代可用的GC及Gl,多线程支持的机制包含了多线程时资源的同步机制,以及线程之间的交互机制。
除jvm外,编写分布式java应用时,通常要使用到一些sun jdk的类库,如何合理的使用类库,以及这些类是如何实现的,是编写高性能、高可用的java应用必须掌握的。本书介绍了sun jdk中常用的集合包的集合类、并发包中的常用类、序列化和反序列化的实现方式,同时对这些类进行了基准的性能测试和对比。
掌握jvm和使用到的类库是编写高性能java应用的必备知识,但除了编写之外,通常还会面临对已有系统进行调优,调优是一个非常复杂的过程,本书会针对寻找系统性能瓶颈的一些方法以及针对这些瓶颈常用的一些调优方法。寻找性能瓶颈的方法主要是根据系统资源的消耗寻找对应问题代码的方法,常用的一些条有方法主要是降低锁竞争、降低内存消耗等。
除了高性能外,高可用也是大型java应用要关注的重点,本书介绍了构建高可用系统的方法,例如负载均衡技术、构建可容错的系统,对资源使用有限制的系统等
在面对不断提高的访问量和数据量是,最希望做到的是提升硬件和机器的硬升级,但要达到这个效果,在软件上必须付出巨大的努力,本书,介绍了支持垂直伸缩时的常用的降低锁竞争等方法,以及支持水平伸缩时常用的分布式缓存、分布式文件系统等方法。
小问题1:What is getarchitecture done?
小问题2:啥是OSGi?