在看了肥朝以前Dubbo源码解析系列的粉丝.出去面试通常都是上来一波操做猛如虎的源码分析,技惊四座
!固然也有一些喜欢打我脸
的粉丝作了以下反馈:前端
言归正传,在面试"造火箭"的过程当中,最常问的又最有区分度的一些问题面试
你对XXX源码这么熟悉,那有没有遇到过什么坑?面试官问我,使用Dubbo有没有遇到一些坑?我笑了。json
你看了这么多源码,那请问学到了什么?网络
坦白说,在面试官稍微一深刻原理就喊疼,只能被迫换个姿式继续深刻其余话题的状况下,通常是不太可能遇到这两个问题的.可是若是你认真看过以前的源码解析和真实
场景源码实战系列,被问到这个两个问题时又如何作到和肥朝同样坐怀不乱
?app
本文并不是要作出所谓的标准答案,毕竟每一个人看问题角度不一样,学到的天然不懂,本文主要但愿经过抛砖引玉的方式,让你在看源码时通过深度思考
,而不是只是为了面试装装逼.若是只是为了装装逼,那和天天喊着减肥,却只是为了吓一吓身上的肉
同样,毫无心义!框架
咱们先来看一下SpringMVC中HttpMessageConverter
的分层结构设计,规范的命名让咱们很容易从单词中就很容易猜出,这个类的做用是,将数据作相应转化并响应回去.大白话就是,把你controller的实体类,转换成相应的数据给前端.那咱们来看一下,这个类,SpringMVC是怎么对这个需求进行代码分层结构设计的异步
仔细分析咱们不难发现,最外层的是响应格式
工具
MappingJackson2HttpMessageConverter (json)源码分析
MappingJackson2XmlHttpMessageConverter (xml)单元测试
再往里,就是序列化工具选择
AbstractJackson2HttpMessageConverter (jackson)
ResourceRegionHttpMessageConverter
GsonHttpMessageConverter (gson)
再接着,就是公共的抽象类.
那么关键问题来了,它为何这么设计,以及这么设计,会有什么好处?
那我问你,假如你须要增长一种序列化方式,好比fastjson,你会怎么作?
很明显,照葫芦画瓢,你参考jackson
和gson
的作法都知道,是须要继承AbstractGenericHttpMessageConverter
,而后新建一个FastJsonHttpMessageConverter
的类作额外的特殊处理啦.这就是大佬们常说的好的代码会说话
.
另外他这么分层,还有一个好处.你想一下,像这种把实体类转换成相应数据的功能,若是要拓展,咱们会拓展哪几个方面?肥朝认为,无非是两个方面,一个是响应的格式
,好比JSON
、XML
、String
.另外一个是,序列化的工具
,好比fastjson
、jackson
、gson
.你再看一下这个分层,不管是改响应的格式
和序列化工具
都很轻松,维护性好不少.而且拓展后,单元测试也能细粒度测试拓展的功能,不至于出现代码深不可"测"
可见,在代码分层时,咱们实际上是能够从后续可能拓展性
的这个角度来作分层
肥朝公众号的粉丝大部分是看过Dubbo源码解析系列的,所以咱们有必要来看看Dubbo里面又是怎么作的呢?
内容太多,咱们能够拿Remoting(远程通信)模块
来看看.他主要分Exchange(信息交换层)
、Transport(网络传输层)
、Serialize(数据序列化层)
这么几层.
Exchange(信息交换层): 封装请求响应模式.
Transport(网络传输层): 网络传输方式的统一接口
Serialize(数据序列化层): 数据的序列化
从刚才的源码经验来看,咱们想一想,对于远程通信(Remoting)
,他为何要这么分层?
对于远程通信这个需求,咱们可能会有哪几个方面的拓展需求?
请求响应模式(同步、异步)
好比网络框架的选择(Netty,Mina,JDK API)
好比序列化方式(Kryo,JSON,JDK序列化等)
可见,Dubbo在作代码分层时,和SpringMVC同样,也是从后续可能拓展性
的这个角度来作分层。
固然很多同窗遇到面试造出了火箭
,顺利入职后却发现作的是拧螺丝的活!此时手中的大刀摁都摁不住!
可是其实技术是要服务于业务开发的,在业务开发中,需求频繁改动是屡见不鲜.除了向肥朝借读如下书籍以外
咱们也能够把业务代码,按照咱们从源码中学来的方式进行编码,这样才是真正码出高效,天天早点下班,不至于出现公司没给够你泡妞的钱,还剥夺你泡妞的时间,最后搞坏了你泡妞的身体!
肥朝 是一个专一于 原理、源码、开发技巧的技术公众号,号内原创专题式源码解析、真实场景源码原理实战(重点)。扫描下面二维码关注肥朝,让本该造火箭的你,再也不拧螺丝!