本文转载自微信公众号《桐人的技术分享》,作者kiritomoe。转载本文请联系桐人的技术分享公众号。最近,我经常与实习生候选人打交道。每次接触新的候选人,我都要花一定的时间来介绍我们的团队。应聘者问得最多的一个问题就是“中间件部门一般是做什么的?”,之前正好接触过一些想从事中间件开发的小伙伴,问我“现在转中间件来得及吗?”现在发展?”诸如此类的问题,我就简单的写了一篇文章,谈谈我个人这些年做中间件开发的感受。什么是中间件开发?大四实习的时候,第一次接触中间件是在一个20多人的软件开发团队里。当时项目的架构师介绍了微博开源的RPC框架Motan。借助这个框架,我们很快搭建了一个基于微服务架构的内部电商系统。然后在项目中,由于业务需要,我们引入了ActiveMQ……这个阶段,我已经在使用中间件了,但是我好像没有接触到中间件开发,更多的是在使用层面。在我毕业后的第一份工作中,公司有数百名研发人员。当时的领导看我对中间件比较感兴趣,所以特意把我分配到基础架构组。这是我第一次成为一名真正的员工。”“中间件研发”,通常主要工作是基于开源的Kong和Dubbo,进行一些内部改造,以提供给业务团队更好的使用。这个阶段要做的事情还是比较复杂的。业务团队对一些中间件有定制需求,都需要了解这个中间件,熟悉源码。这个时期也是我成长最快的时期。期间学习了Docker、Neo4j、Kong等之前从未接触过的技术,对Dubbo等RPC框架的原理有了更深入的理解。可能坐在我旁边的是订单系的同学,扔了一个功能点让我修改。现在,我在阿里云的云原生中间件工作。相比之前的中间件研发工作,在阿里云这样的互联网大公司,任何一个中间件,少则几个人,多则几十人。部门和业务单元之间也有明确的界限。在这里,中间件团队的职责可以细分为三个方向:中间件团队会以业务团队的需求为驱动,为集团提供定制化的解决方案,俗称“自研”。所以你可能不知道HSF、Diamond等阿里巴巴内部的中间件。中间件团队会搞开源,花大量精力提升中间件的极致性能,提升开源影响力,引领技术进步。这部分中间件比较有名,比如Dubbo、SpringCloudAlibaba、RocketMQ、Nacos。中间件将在阿里云上输出商业产品,提供比开源产品更高的SLA、更强大的功能、更友好的交互。这部分商业产品如:微服务引擎MSE、消息队列RocketMQ、分布式应用链路跟踪ARMS。我的这三个经历正好体现了不同规模的公司对中间件开发的不同需求。小公司使用中间件,如RPC、MQ、缓存等,基本都是业务开发人员自己维护。但如果后台研发上百人,基本都会组建自己的中间件团队,或者选择使用阿里云等云厂商提供的中间件产品。中间件开发和业务开发的区别在我看来,中间件开发和业务开发没有区别。如果非要说区别的话,有点像游戏中的不同职业。有些人选择成为魔法师,而有些人则选择成为战士。在职场练级的过程中,每个人的总技能点都是一样的,业务发展有点往全能战士的方向发展,每个点都涉及一点点,自然少点技能点也可以分配给每个方向;中间的软件开发就像《因为太怕痛,就全点防御力了》里的主角,给一个方向分配技能点。假设你在一家小公司工作,现阶段没有专门的中间件团队,大家都在做业务开发。这时候我们做一个假设:公司要成立一个中间件团队或者基础设施部门,那么会是哪一个呢?类人动物容易被选中吗?一定是技术背景扎实,对中间件感兴趣,研究过源码的人。这个假设不是凭空捏造的。很多互联网公司的中间件团队都是这样成长起来的。我想说什么?业务开发和中间件开发一开始并没有明确的界限,所以不用担心你现在是否从事业务开发,只要你对中间件感兴趣并且做过源码层面的研究,你就可以成为一个中间件开发者。中间件开发需要哪些品质?公司越大,中间件团队越大,职责划分越垂直。基本上在大公司,一个中间件开发可能需要几年的时间在某个垂直方向上培养。以下是一些常见的中间件方向。当然,由于组织结构的不同,这种分类在每个公司可能会略有不同。微服务治理。比如RPC相关的中间件、注册中心、配置中心、限流熔断器、链接跟踪等。开源产品如:Dubbo、SpringCloud、Nacos、Zookeeper、Sentinel、Hystrix、Zipkin。消息队列。微服务一般强调同步通信,单独列出消息队列,主要是因为它的异步机制。开源产品如:RocketMQ、Kafka存储中间件。比如缓存、数据库等,比如Mysql、Redis。值得一提的是,由于存储相关的系统一般都非常复杂,尤其是在分布式存储领域,系统更加复杂。在阿里巴巴内部,普遍将数据库、缓存等存储产品等同于中间件。存在,所以如果有人说Mysql和Redis不是中间件,那也没什么好争论的。存储代理。一个典型的例子是ShardingSphere。网关。例如SpringCloudGateway、Kong、Nginx。服务网格。Envoy和Istio在阿里这边也分属于中间件部门。其实可以发现,中间件其实并没有一个明确的定义,哪些开源产品可以是中间件,哪些不是。列举完这些典型的中间件之后,继续讨论本节的主题,一个中间件开发者应该具备哪些素质?语言基础。从Java程序员的角度来看,基础通常是:集合、并发、JVM、常用工具类。操作系统基础知识。中间件开发人员经常和操作系统打交道,所以计算机基础也是必不可少的。我将列出一些关键字供您参考。文件输入输出。比如pageCache、mmap、directIO等概念。处理线程。比如greenthread,coroutine等概念。内存/CPU。比如cgroup、cacheline、boundcore等概念。网络基础知识。可以发现,上述每一个中间件都离不开网络通信。必须熟悉TCP和HTTP的原理。在框架层面,需要熟悉NIO、Netty、GRPC、HttpClient等常用的网络框架/工具。分布式知识。了解CAP、paxos、raft、zab、2pc/3pc、base等理论知识,比如在一些应届毕业生的简历中看到一个项目经历,很有意思:根据Raft协议实现POC到麻省理工学院课程实验室。源码阅读能力。我认为阅读源代码的能力是一个中间件开发者必备的素质。在网上经常可以看到各种源码分析文章。通过阅读开源中间件的源代码,可以借鉴别人的设计理念,提高自己的编码水平。保持对技术的热情并拥抱变化。中间件技术日新月异。打败中间件的可能不是同一个产品,而是整体环境。比如近几年,云原生开始流行。几乎所有的中间件都在拥抱变化,积极向K8s看齐。在这样的背景下,接下来中间件开发者需要具备K8s的基本认知能力,熟悉K8s的pod、service、deployment、statefulSet、operator等基本概念。如何成为一名中间件开发者看完上面的要求,可能有的同学会开始说不出话来,其实也没那么可怕。熟悉之后,你会发现原来是一回事。在我的技术交流群里,经常有同学抱怨平时只能接触CRUD,根本接触不到这些“高大上”的技术。我想说的是,机会是自己找的。我在这里有一些实用的建议:参与开源社区的项目并贡献代码。了解中间件的最佳方式是贡献它。带着问题去研究源码是我推荐的方式。您需要做的是找到合适的问题并解决它。不断重复这个过程,你其实就是一个中间件开发者!多做动手实验。上面提到的很多中间件开发和应用的品质都可以通过动手实验来学习,比如实现一个简单的RPC框架,实现一个Raft协议POC,通过benchmark比较FileChannel和MMAP的性能。相信我,这比看书、看视频或看博客有用得多。参与中间件挑战。起初,阿里举办了一年一度的中间件性能挑战赛。后来,华为等一些其他公司也开始效仿。参与这些挑战也能积累不少经验。很多朋友。
