web分布式程序中常用的“武器”可以按照接入层、逻辑层、缓存层、存储层这样的结构去罗列出来。
服务接入层:反向代理 Nginx;
业务逻辑层:web容器Tomcat;应用框架spring;orm框架mybatis;
数据缓存层:redis;消息中间件kafka;
数据存储层:MySQL;文件存储hdfs;搜索存储elasticsearch;
可不要轻视了对这些内容的深层次了解,其中的每一层都要支持水平扩展和高可用,这两点正是我们在应用程序架构中不可忽视也永远绕不过的两点。
大多数人只是会用这些“武器”,用它们来开发应用程序,让应用跑在服务器上面。
但是,却对它们的原理性内容知之甚少。而阅读这些框架和中间件的源码可以帮助我们对框架和中间件有更深刻的理解。
能理解什么呢?
分布式系统最重要的两个关注点,一个是通信,一个是协调。
只要你能够理解了分布式通信、分布式协调,基本就掌握了分布式系统的基座。当然,其它还有分布式事务、分布式锁等等,不过有了前面两种内容作为代入,其余的分布式知识内容会较为容易理解。
通信方面比较著名的开源组件有netty,分布式协调方面的组件有zookeeper,其它的许多开源中间件内部很多也都用到了这两个基础组件。
TIP:zookeeper的网络通信模块也是通过netty来实现的。
有时候即使你阅读了大量原理性的文档,但如果不看源码,可能仍然会觉得还没有理解透。另外如果你能深入源码,招聘者从侧面也能感觉到你的学习热情和探索精神。
在这个学习源码的过程中,你会接连发现其它很多的宝贝,而且这些宝贝也都是作为一个java web程序员所必备的基础技能,恰恰是这些技能够让你和其他人拉开差距。
比如:网络编程、多线程、反射、类加载技术等等,这些内容作为通用的技术会在很多框框和中间件中被用到。而你,通过学习并积累了这些通用的技术,你的能力一定会比不具备这些通用技术的人强得多。
拥有这些技能的人,当然会被招聘者会喜欢了。另外你深入的学习过这些框架和中间件的源码,招聘者也刚好能从侧面感受到你的学习热情和探索精神。
另外,再谈一下学习这些开源的框架和中间件源码的方法。
那就是“骨架学习法”。
比如我们学习作为web容器的Tomcat的时候,我们弄清楚了Tomcat的核心功能是http连接和servlet容器的处理,那么我们就沿着请求处理这条线去一步一步摸。
然后,再会发现Tomcat的骨架类,从Server开始到Service,然后处理连接的类,接着容器类。
附一张图就更能够理解这个“骨架学习法”的概念了。
图自https://time.geekbang.org/column/article/99770
这个过程中你可能会接连发现更多的“挠痒痒”的知识,比如Tomcat是如何启动和停止的,类加载器是如何设计的等等。这些知识正是一般程序员所不具备的,在弄清楚这些知识点的过程中,你可能已经树立了攻克技术知识难关的信心。
这样的勇于探索,乐于钻研,热爱学习的程序员,哪一个招聘者不爱呢。
学习参考资料:
https://time.geekbang.org/column/article/99770
----END----
这里记录,我每周碰到的,或想到的,引起触动,或感动的,事物的思考及笔记。不见得都对,但开始思考记录总是好的。