文章目录

大概是从12月初期,就开始酝酿18年的总结了,但是一直没动笔,想着在今年的最后一天写,或许会有更多的仪式感。

此刻,18年12月31号21时01分,我敲下这几行文字,努力把思绪萦绕在18年的始末,想到的就是题目中的两个词语,“精诚,进取”。

其实一开始想到了踏实,18年确实是踏实的一年,一年的时间,总觉得过的很快,踏实,忙碌。

忙碌的工作生活中,我感觉到了自己的进步是目力可见的,忙碌中,却更加的感觉到内心的沉稳,于是我确定了18年年度总结的关键词。

先说说技术相关吧,毕竟一年里,技术始终是生活的主旋律。

参加了很多的线下的活动:比如Dubbo北京沙龙、RocketMQ北京沙龙、SpringCloud线下沙龙、Spring开发者大会等等,主要还是集中在分布式相关的领域,参加这些会议本身对技术的提高是微乎其微的,重要的,是能够让你开阔眼界,知道同行在干什么,或许某个主题解决的问题能够让困扰了许久的你豁然开朗。

说起来还是蛮开心的,从一开始的一个人参加活动,到后来带动周围的同事一起,一群小伙伴互相交流彼此的心得,参与各种线下活动的过程中增加了同事之间的交流频率,在技术上也形成了一种良好的分享氛围。这是我当初没有想到的。

博客一直在更新,明显感觉文章本身的质量有所提高,产出了一些自己感觉不错的系列文章,比如: 《我说分布式之分布式事务系列》《自己写分布式组件系列》等。投稿了开发者头条、掘金技术社区,收获了很多关注者。

写文章,持续的输出,这是我认为的一个比较有效的学习方式,我也推荐给你们。我在博客刚建立的时候,也不知道该写什么,在把博客主要定位在技术向之后,一开始的阶段主要是把自己学习的笔记总结并输出,现在回头看也是蛮稚嫩的。但是坚持一件事,一定会看到变化。

对匠心的追求不停,对技术的更新不惧,对博客的更新也就不会停止。

过程不是一帆风顺的,上半年有一段时间,我手里负责的业务出现一些变化,迭代速度变慢,需求也收缩很多,具体情况放下不表。那段时间,有些焦躁。

是的,不是彷徨,不是迷茫,是焦躁,没有需求做、想要找事情做的焦躁。

可能是对自己的定位已经较为明确了吧,也就没有失去方向,我静下心来想想,知道自己在技术上欠缺的还有很多,知道的越多,不知道的也就越多。于是我整理了一下暂时需要恶补或者说提高的专题知识,比如:多线程高并发相关、Spring原理相关、Springboot进阶相关、主流分布式中间件的原理相关以及分布式领域常见解决方案的知识。

看到满满的知识点,没有恐慌,反而是有些安心了,因为知道自己又有事情可以做了,于是定了一个学习计划就开始搞了。

主要是上班时候的工作间隙(这个需要自己把握尺度)、下班以后的一小时左右的时间(时间久了学习效率会下降),在五六月份两个月里,买了几本书几套视频,为了避免有广告的嫌疑我把相关的课程放到最后。主要把SpringBoot的原理相关的知识、Java JUC相关的多线程知识以及Dubbo框架做了进一步的学习巩固,罗列的学习计划只完成了一半,不过做了就是有效果的。

你可能会疑问为什么只专项学习了两个多月,因为下半年就开始忙碌了。

其实刚到下半年还不是很忙,那会儿我一直想搞点东西,因为两个多月的时间只是在学习,有点心虚,我就从学习资料提到的以及工作中一直存疑的一些知识点中提取出一个“手写分布式组件”计划,具体的内容我简单列一下:

1. 手写实现分布式配置中心的单机、集群版本
2. 手写实现分布式锁的各种实现,至少实现Redis版本,支持注解,支持springboot
3. 手写实现分布式链路追踪组件,至少支持Http方式透传
4. 手写实现分布式限流组件,基于Redis
5. 手写实现可靠消息分布式事务组件,基于RabbitMQ

很猖狂,当时真的没看出这些东西的难度。

然后就是开始搞了,先从配置中心开始弄。我一开始选择了使用Dubbo框架实现分布式模式的配置中心,当时写着就遇到了一个主要的问题,采用何种方式进行配置更新。

当时查阅了很多开源实现的思路,他们主要是用的推、拉模式。很多都是基于Zookeeper实现的配置的自动更新,我权衡了一下,把自己写的版本定位在以实现完整功能,理解设计思路为主要目的。

最终我决定采用观察者模式去做配置的自动更新。也就是,客户端主动轮询配置项,发现服务端配置与本地配置不同,就更新本地的配置。核心思路是对配置项做MD5编码,只要MD5不同就认为配置更新了,并最终实现了自己手写版本的配置服务。

为什么不说它是个分布式配置中心,主要是在实现的过程中发现涉及到服务端/客户端的交互模式有很多问题要解决,一个最主要的问题便是网络异常如何处理的问题。如果发生网络问题,配置如何选择,更新策略是怎样的,C/S端之间的交互是否要保证强一致,这些都是问题。最后我实现的是一款基于MySQL、通过观察者模式实现配置更新的单机模式的配置模块,完成之后我用到了线上的一个新需求,在项目运行的过程中,这个模块始终没有出过问题,这个主要是因为经过了较为完备的测试。

下面是本项目的github地址以及项目总结,感兴趣的可以去看看~

Sheild-conf-single配置服务github地址

自己写分布式配置中心[上篇]-单机模式

这个组件写完之后,我对实现上面那个手写分布式组件的计划有了信心。陆续实现了更多的组件,具体的过程我也不再重复说明了,我就贴一下github的地址和总结文章。

总结 github地址
自己写分布式锁–基于redission redis-distributed-lock
自己写分布式限流组件-基于Redis的RateLimter shield-ratelimter
自己写分布式链路追踪框架 lite-tracer

在写的过程中,我越发体会到一个成熟的可用于生产的开源组件的开发的不容易,真的不是像我这样心血来潮式的单打独斗所能比拟的。

这里就引出一个问题,难道个人开发者就不需要写自己的组件吗?

我想答案是需要,这里又涉及到一个是否需要重复造轮子的问题。

我的理解是,尽量不去参与网路上无畏的阵营之争,一旦决定要写一个东西,就去做。当然做本身也是需要步骤的。

我的思路是

  1. 先定好自己要实现的功能;
  2. 按照重要程度划分功能点;
  3. 制定开发计划,如:时间周期、涉及的模块;
  4. 搭建开发框架,进行编码;
  5. 功能测试,测试用例的书写;
  6. 文档编写,demo的编写;
  7. 项目的复盘工作。

对我而言,自己实现这些已经存在的技术方案或者实现自己版本的组件给我带来的收获,除了开发本身带来的愉悦,更多的它能让我深入框架内部的实现思路和细节,去站在框架设计者的角度思考问题。

如何能够让使用者更轻松的使用我的框架,如何优雅的把各种不需要使用关心的问题控制在框架的内部。重要的,它让我能够在使用开源框架的时候,不仅仅停留在调用API本身,我会好奇这个巧妙的特性内部是如何实现的,它促使我更深入探究代码内部细节并努力应用到自己的项目中。

同样,这种学习方式对于编码能力的提高也是很客观的。它会促使更好的设计自己代码的模块划分,框架的搭建。多做这类练习,对自己的架构能力和编码能力都有积极的意义。

毕竟代码从你设计完成的那一刻就已经存在了,你要做的只是搜索柔肠,把代码逻辑复刻进磁盘中。想法比编码本身更重要,思路限制你的代码实现。好的代码都是经过慎重的设计和思考优化才造就的。

时间到了九月,我进入了新的项目组,前期的目标是在一个多月时间内开发并上线一个TPS要求在6000(目前的容量已经是12000TPS)的分布式应用。

我参与了项目的设计、编码、迭代、测试的各个环节,并且很幸运的成为了账户模块的owner(即主要开发者)。

可能非技术工作的读者对账户的认知并不多,简单的说,就如同银行转账一样,我要处理好用户账户的入账、账户扣减、充值失败的回退、每个月的账户的清零重置等阶段,保证用户的账户始终处于准确的状态。

一个月的时间,二十多个不眠之夜,八千行代码,十多个接口及主要流程,多个主要功能难点,我和小伙伴们一起并肩作战并将问题攻克,最终让项目得以如期上线。

项目是和业内的一个BAT级别的大佬公司合作的,我们承受的压力也是之前所未有的,当项目上线之后流量涌入,系统平稳运行的时刻。每个人的内心都是喜悦的。

我也是其中的一个。

在项目中,我把之前了解的技术点真正的进行了代码实现,和他人交流的时候也更加自信了,比如:我用乐观锁解决了并发环境下对同一个账户的更新问题;使用RocketMQ的事务消息解决了跨库跨子系统的分布式事务问题;使用某成熟的配置中心解决了配置的变更问题(这种规模的应用还是不要用个人实现了,出了问题是难以想象的,当然,技术选型就过不了);基于Dubbo和某分库分表框架解决了分布式通信及数据库的横向扩容的问题等。

这个项目目前还在进行中,从这个项目中收获的成长是无与伦比的,让我更加切实的体会到了“学习金字塔” 本身的意义。实践中收获到的比单纯的阅读要多得多,有些坑,别人和你说了,并不一定有用,自己趟过的坑,才能真正的转化为经验,并让你一直受用。

在这个过程中,我总结了“我说分布式事务”系列的文章,下面是系列的汇总链接。这个系列我之前就有想过,却一直不敢动笔,因为毕竟没有搞过,写的有问题会被行家笑话的。

我说分布式之分布式事务系列

经过这个项目,我们采用柔性事务方案中的“事务消息”方式,解决了跨库分布式事务的一致性的问题。也在实际运行中,经受住了实践的考验。

已经习惯了赶工期时候的通宵工作,四五点钟的北京也不再陌生。

不过我还是想对我,对你们说,身体始终是第一位的。

久坐带来的肥胖问题,熬夜带来的白天精神不振,长期高压力工作的神经衰弱都是健康的大敌。我只能说出我对未来的祝愿和对自我的要求:

尽量不要久坐,工作久了就起来转转。

多步行,能走着去地铁站就不要打车。

该减减肥了,再这么胖,女朋友该有意见了。自己也看不下去了2333

再平和一些,毕竟人生而不同。

写了这么多,发现写的多是技术相关的,确实这一年把精力主要都放到技术上了,在技术领域确切的感觉到了自己的提高,不过这远远不够,来年希望把挖的坑能够填上,先把flag立好吧。

19年努力实现以下这些方面的组件,继续完善“我写分布式组件”系列。

  1. 手写实现分布式调度相关组件,基于线程池、消息队列。
  2. 手写实现消息一致性分布式事务组件。
  3. 手写实现乞丐版的RPC组件。

其它的课题还在酝酿,有想法会继续付诸行动的。

工作相关的就说到这里吧,接着说说其他的方面。

心态上,感觉更加沉稳了吧,对技术有着明确的方向和目标,如果不做一定不会有结果,持续的付出和总结,我想我会离目标越来越近。

未来想要体验更多的生活的精彩,两点一线的生活总是过于平淡了,但这个过程不会是一个人,会和女朋友一起。

三年零八个月,一千三百多天,我的生活里多了个牵挂,就在这里对女朋友说出新年的祝福吧。

这半年,一个人辛苦了,没有一直陪在你身边,但是我始终惦记着你,一个月见一次面,倍加珍惜在一起的时间。你早出晚归,小小的身影,考研是一个人的战斗,你倔强的行动着。我始终祝福你,过去,现在,未来,要一直陪着你,珍视你对我的好,然后眼睛里只看着彼此,握着手继续前进,要和你去很多很多的地方。新年快乐,我的宝贝。

对家人,对朋友,对同事,同样报以真诚的祝福,感谢一直以来的帮助和支持,生活总不会是一帆风顺的,愿你们能够在低谷里看到光明,愿你们始终饱含热心,愿你们在新的一年里能够幸福。

大脑在思考,生活在继续。每一年的结尾,我已经习惯了盘点一年来的收获和失去,18年是忙碌且充实的,是平静但踏实的,是坚定的,是进取的。

对未来,没有太多的奢求,因为此刻我亦满足,就用海子的一句诗来结束吧,很好的代表了我此刻的心境。

从明天起,做一个幸福的人

喂马、劈柴,周游世界

从明天起,关心粮食和蔬菜

我有一所房子,面朝大海,春暖花开

2018.12.31 22:47 夜

文章目录
Fork me on GitHub