Skip to content
Go back

后端学习路线

后端技术知识一览

一句话结论(30s)

这份学习路线的核心是”按解决问题的顺序学,而非按框架清单背”——因为框架会不断变化但底层设计思想不变,先掌握语言 + 数据库 + ORM + Web 框架 + 接口工具 + 依赖管理 + 版本控制七件套的最小闭环,再按”遇到问题再学对应技术”补齐中间件与系统设计,才能真正建立后端知识体系。

核心原理(2min)

底层深入(5-10min)

整理了一下自己在学习后端时的心得体会,争取可以让各位立志学习后端的朋友快速了解一下后端的技术 🐎

如果觉得项目不错,或者给你带来了一些帮助,不妨点个 Star ❤️

本篇文章属于本人的原创作品,如果需要转载,请保留出处,谢谢咯 😆

由于本人现在的技术可能不太成熟,对于一些概念可能理解的会有问题,所以如果你在文章中发现了问题不妨指出问题,提一个issue哦 🌹

为什么会创建这样一个仓库?

很多教程对于后端的技术栈说明的并不全面,或者是太全面了让人不知道从哪里开始学起,这导致初入编程的我们学习的过程中没有较强的连续性,很容易让人产生不知道学了有什么用,有那么多技术框架,我该先学哪个的疑问。

所以作为一名普通的在校大学生,我想在此分享一下自己学习后端的整个心路历程和经验,将整个后端要学习的技术尽量以一种启发式的方式介绍给大家,希望能为所有想学习后端的同学们提供一些帮助。

这个仓库包含了哪些知识的介绍?

个人认为除了四大件和其他CS专业知识的介绍,关于纯后端知识的介绍已经非常全面了。

你可能会觉得还不是很全,比如这里有一些概念笔者并没有提及:CDN内容分发网络,DDD架构,分布式的Raft,拥抱云的GraalVM,新时代GC的ZGC,服务网格Istio,提高代码质量的SonarQube等等。

其实当然,后端知识浩如烟海,怎么可能仅仅只用一篇文章介绍完。倒不如说,这些后端知识应该是你在有了一定基础之后自己去看前沿文章去了解到的。

思考穿插:为什么市面上的学习路线要么”太全”要么”太简单”,都不好使?因为”太全”把初学者淹没在框架清单里,不知道先学哪个、学了有什么用;“太简单”又建不起完整的体系感。关键不是列了多少技术,而是按”解决问题”的顺序串起来——先会一个最小闭环,再遇到问题补对应技术。

写这篇文章主要是觉得现在市面上的学习路线主要有以下两个极端:

所以这里就我在大学以来和在团队中学习的经验写一些我对于后端的看法,希望可以让朋友们拨开云雾见青天,知道自己为什么学这些技术,以及要学什么技术。

我该怎么学习后端的技术

我目前学习后端的主要语言是Java,所以在这里主要介绍一下Java后端的学习路线,当然如果你是其他语言的选手,这并不影响你阅读本章内容,因为业界要解决的问题是不会变的,变的只是框架。

比如你在Java中使用Mybatis-plus操作数据,在Go中使用GORM操作数据,在Java中使用SpringBoot作为基本的Web开发框架,在Go中使用Gin或Echo作为基本的Web开发框架。

下面,各位朋友可以根据自己的需求来学习。

这里直接总结一下最基础的后端开发需求,适合真正的初学者:

比如,我这里以Java为例:

又或者,以Go为例:

除了这些,建议你了解学习以下内容:

当你有了一定的基础后,你可以根据后面写的这些来查缺补漏,丰富自己的技术栈。

语言---Java(必学)

首先我们要编程,写项目,一定要会一门语言,正所谓万丈高楼平地起,语言就是我们搭建高楼的砖块。

不过初学一门编程语言的时候可能你会遇到很多问题,比如思考为什么要写OOP,为什么要有多线程,很多东西你可能暂时不太了解,不过这没有关系,当你学到后面的时候自然会体会到这样做的原因。

这里介绍一下我初学Java语言时的技巧:

推荐文档和工具:

关系型数据库---MySQL(必学)

当我们学完一门语言后,一般学校里面都会要求我们做一个课设(这里用贪吃蛇举例),我们初步了解Java并上手之后,知道了可以使用文件来存储读取数据,那么一旦当数据多起来的时候,我们就不好处理了,这时我们不妨在网上搜搜看有什么东西可以帮助我们存储数据呢?

于是你找到了MySQL(这里还推荐你了解一下MariaDBPostgreSQL)。

那么我们学习MySQL到底要到一个什么程度才能进行开发呢?

推荐文档:

ORM框架---MyBatis / Mybatis-plus(必学)

当你写多了原生的JDBC来操作数据库之后,会发现编码效率很低,写的过程中也比较容易出错,为了更好的和数据库进行交互,于是你又在网上看别人的博客,发现了ORM这个东西,这种框架可以帮助我们更快的写SQL,甚至有时候都不用写,而是自动生成。

这里简单介绍一下我写项目时的搭配(MyBatis / Mybatis-plus),当然JPA也是可以的:

这里简单说明一下,为什么这样搭配,因为在写复杂SQL的时候Mybatis-plus的wrapper会很复杂,可读性很低,我们写的时候犯错的几率也会更大,所以推荐这时使用Mybatis来写。

推荐文档:

Web开发框架---Spring,SpringMVC,Spring Boot(必学)

这是我们做Web服务时常用的框架,如果不想从麻烦的原生配置开始做起,建议直接学习SpringBoot2。

SpringBoot3相对于SpringBoot2就是功能更多,但是API发生了较大的变化,可能你学习的时候大部分时间都用在处理冲突上了,所以建议新手入门直接学习SpringBoot2,等有了一定基础再学Spring家族的其他框架,做一般的项目SpringBoot也够用了。

还有就是不要看Spring,SpringMVC,Spring Boot有三个,其实Spring + SpringMVC ≈ SpringBoot,所以你其实可以直接学习SpringBoot。但是可能对于一些在前者(Spring,SpringMVC)中约定俗称的配置有些迷惑,所以这边还是建议有时间的话先把Spring,SpringMVC学了再学SpringBoot。

推荐文档:

接口管理工具---Postman / Apifox / Swagger / YApi(必学)

什么,你还在使用HttpClient发送请求?

那么不妨试一试我上面提到的工具吧,这些工具的界面更加友好,功能更加强大,我们没有理由不去使用它。

最开始我使用的是Postman,后面使用过Apifox,Swagger,YApi等工具,就我个人这么久的使用体验而言,感觉Apifox的功能更多更强大,界面是中文,而且还可以导出接口文档,很方便,不用我们自己去写。

这个就不用什么文档了,建议直接CSDN启动。

安全管理框架---Spring Security / Shiro框架(选学,项目有安全需要的学)

当你的系统缺少安全管理部分可以使用到它,你也许还听说过Shiro框架,它也是做安全的,只不过相比于Spring Security更加轻量。

当然,我们说安全管理框架可能你还不太清楚,为什么要这个东西,如果你写过登录系统,就应该明白,没有框架来管理接口访问,我们将无法对用户进行相应的验证和授权,也就无法区分管理员与普通用户的权限。

除了上面那些框架,我还可以尝试什么?

推荐文档:

依赖管理工具---Maven / Gradle(必学)

相信你之前使用依赖的方式是直接将对应的JAR包放入项目中,但是随着你项目中使用的依赖越来越多,自己管理依赖逐渐变成了一件麻烦的事情。

于是你发现了Maven,这个工具可以帮助你管理你的依赖,并且你可以通过pom.xml的形式配置jar包的版本。从我们自己在Maven仓库中找到对应依赖的jar包,自己导入项目,自己管理,到Maven的一键配置,大大减少了我们为管理依赖头疼的时间。

相关建议:

推荐文档和仓库:

版本控制工具---Git(必学)

你可能想过:有没有一个工具记录自己做过的事情并且可以标准的区分自己各个版本的功能呢?

当然有咯,那就是Git,于此相应的概念还有GitHub,不过前者是一个版本控制工具,类似的还有SVN,后者是一个代码托管平台,类似的还有GitLab

我们该怎么学习Git?

以及,我们主要要学习Git的哪些API呢?

推荐文档和网站:

服务器---Linux(必学)

你是不是有疑惑,为什么自己写的项目只能被自己的电脑访问,而不能被其他的电脑访问?

其实是因为你没有自己的服务器,如果你要让别人访问你的服务,你可以去买一个属于你的域名和一个云服务器,将自己写的服务部署到服务器上,供别人访问。

那么,使用Linux服务器最基本的技能是什么呢?

由于现在的很多前后台项目大多都是在Linux环境下部署的,所以我们至少要了解一些常用的Linux指令。

当然如果你不买现成的云服务器,你还可以使用虚拟机,这样同样可以模拟在云服务器上Linux的操作。学会了基础的Linux操作之后,你将会在之后学习微服务架构时将会如鱼得水。

那么多命令我该怎么记下来呢?

我该看什么了解Linux命令呢?

我该怎么用Linux系统呢?

这个Linux上有很多好玩的东西,下面我来介绍一下:

推荐网站:

前端基础---前端三剑客HTMLCSSJavaScript(选学,这个不做要求,感兴趣可以了解一下)

作为一位想要从事后端工作的程序员来说,了解一点前端知识是很有用处的。

正如你所了解的一样,后端负责给前端提供数据,前端负责在页面上展示数据。为了使我们和前端的小伙伴们配合的更好,我们可以适当了解一些关于前端的知识,知道数据怎么提交给前端,以便于前端处理,知道前端是怎么获取到后端数据的等等。

那么,我们具体需要掌握到什么层次呢?

好的,完成上面内容的基本学习之后,你将掌握基本的项目开发能力,但是想要做到一个合格的后端程序员是不容易的,接下来,我们还需要学会这些知识。

设计模式---优化代码(选学,想要项目有更好设计的学)

也许你已经写出过几千行的代码了,但是你或许会发现自己每改动一个位置的代码,很多位置都会发生变化,你常常因为这件事情焦头烂额,觉得工作量太大。

其实大可不必,很多时候都是我们没有设计好类与类之间的关系,使得我们后期加需求,维护时的难度大大提升。

简而言之,设计模式可以让你写出高质量的代码(Safe from bugs,Easy to understand,Ready for change)。

设计模式简单的说有三个模式:创建型模式,结构型模式,行为型模式。当然,你肯定不想让我在这里介绍一些枯燥的知识,所以我这里直接说说我对设计模式的看法:

思考穿插:为什么”不要为了用设计模式而用”?因为设计模式的价值在”解决具体问题”,而不是”代码看起来高级”——需求没定型就套模式,只会凭空增加抽象层次、降低可读性。它更像一张”读源码的地图”,帮你理解 Spring 为什么这么写,而不是你写代码时的强制模板。

推荐资料(除了设计模式本身,也包含了其他让你写出高质量代码的资料):

缓存---Redis(必学)

在你使用MySQL的时候不知道你有没有想到过,如果频繁的对于一些经常要访问的数据进行SQL查询是十分浪费性能的(因为数据库是从硬盘里面读取数据到内存中)。

在业务处理中IO往往是导致处理请求慢的罪魁祸首,所以我们不妨使用一下缓存技术吧,将数据缓存到内存中,然后直接省去了从硬盘中读取这一步!

要知道缓存经常访问的不易变化的数据对于提升系统性能是有很大帮助的!

缓存其实和数据库类似,毕竟都是对数据进行存储的,所以一般而言,我们对其的操作也不会超过增删改查。

但是与关系型数据库不同的是,缓存常常和业务是强耦合的,你需要根据实际的情况判断哪些需要缓存,哪些不需要缓存(对于经常变化的数据,不建议缓存,对于不经常变化的数据,建议缓存)。

如果你学完之后意犹未尽,不妨看看Caffeine(这是一个很优秀的本地缓存框架)和多级缓存(可以使用Lua脚本Nginx里构建缓存)。

推荐文档:

性能压测---JMeter(选学,想要测试一下自己程序性能的可以试试)

对了,看到这里你可能会问,为什么用了缓存之后,你就知道性能提升了啊?

没错,我们接下来介绍一下JMeter。

JMeter就是用来做压测的,你可以多关注一下你加了缓存和没有加缓存的QPS分别是多少,这时你就会发现缓存的厉害之处了。

这个就不用专门去看文档学习了,它只是一个工具,具体的可以去CSDN上看看是怎么实现压测的。

当然,这里提一下,我们这个压测仅仅只是初略的估计,因为你电脑不可能只跑你的服务,可能会打开一些Edge浏览器窗口,可能会挂着QQ,它们都会占用你电脑的系统资源。

同时,JMeter发送请求的时候也会占用你电脑的资源(毕竟是你电脑的一个进程),所以我们这里只是大概看一下自己写的程序的性能罢了。

要想真正的测试你程序的性能,建议你把你的服务放在一台远程服务器上跑,然后用本地电脑发送JMeter请求,这样测试的相较于上面的就更加精确了。

消息队列---RabbitMQ(必学)

消息是消息,队列是队列,两个合在一起就是消息队列(在队列里存放的是一个一个的消息对象)。

这项技术主要是用于异步消息,比如说调用一个服务的链路很长,就以订单服务来说,首先创建订单,扣减库存,扣减账户余额,创建完成订单,一下子就调用到了订单服务,库存服务,用户账户服务这三个服务,如果是依次调用的话那么用户可能买完东西后会等好一会才有反应,那么如果链路变的更长呢?

所以我们急需一种技术可以实现传输和保存消息,将各个服务的请求交由消息队列去处理(这里再举一个小例子,快递员是直接上楼将快递给你快,还是统一将快递交由快递柜快,答案显而易见)。

消息队列也是同样的设计思想,与其将消息传递给对接的服务,不如解耦,去找一个代理的去异步处理消息。

消息队列那么多,我该学习哪个呢?

什么时候使用到它呢?

推荐文档:

反向代理服务器---Nginx(选学,一般只要了解一下怎么用即可)

你是否还在为Tomcat的性能而担忧,那么,来试试使用Nginx吧,Nginx一般使用在Tomcat的前面,用于抗住较高的并发量。

一般用于存储前端的静态资源,实现动静分离,屏蔽后面的服务器,实现反向代理。

如果你要学习Nginx的话,建议你了解一下OpenResty,相较于Nginx,OpenResty的功能更多,而且我们也更容易使用Lua脚本语言来改造,加上一些自己特制的功能,当然Tengine也不错。

推荐文档:

网路编程---Netty(选学,除非你对于网络编程很感兴趣)

如果你对于框架底层的网络编程很感兴趣,那么一定要学学Netty,可以说,很多框架的高性能是多亏了它。

可以说Netty才是集Java并发的大成者,它才是Java真正的高并发,有兴趣的可以了解一下,个人觉得难度还是不小的。

也许你觉得它和你太过遥远,其实不然,Redis客户端用过Netty,Elasticsearch底层使用的是Netty,很多微服务框架底层使用的也是Netty,比如Spring CloudDubbo等,Netty的高性能使得很多框架都喜欢使用它。

微服务框架---SpringCloud(必学)

微服务,什么是微服务,微服务就是将原来巨大的单体服务拆分成一个个职责明确、功能独立的细小模块,然后再将这些模块分别部署到服务器上。

那么,为什么会出现微服务呢?

推荐学习的路线:

组件那么多,我该先学哪些?

容器---Docker(必学)

当你想要在你的服务器上运行你自己的项目时,你会发现,你要配置对应的环境,而且自己的项目没有一个统一的工具进行管理。

那么为什么我们不能将这个流程自动化呢?毕竟计算机就是解放人类的,如果你想要减轻自己配置环境的负担而且不想因为自己小测试需要的环境污染整个计算机环境,那么Docker将会是你的一个不错的选择。

Docker主要做的是将你的项目和你项目所需的环境进行封装,可以使我们的程序直接在Linux服务器上跑,省去了我们亲自配置环境的麻烦事(直接写好一个Dockerfile就行了),而且由于其很好的隔离性,不会使得程序之间相互影响。

主要是多练练相关的命令,可以试着将自己的项目采用Docker的方式部署在虚拟机上试试,或者使用WSL2,这也是一个不错的选择。

推荐文档和仓库:

容器编排---Kubernetes(选学,有自动化部署集成需求的学)

当你的容器启动的越来越多时,再采用原始的手动控制容器已经不适合了,毕竟你也不想将时间浪费在容器的起起停停上吧,于是我们有了更加自动化的工具Kubernetes,帮助我们对这些容器进行管理。

这里说说我一开始使用Kubernetes遇到的问题:

推荐文档:

CI / CD---Jenkins(选学,有自动化部署集成需求的学)

不知道各位有没有使用过Github Pages这个功能,每次你将最新的静态网站代码交上Github之后,再次访问自己的网站就会发现内容更新了,那么到底是谁偷偷的为我们做了哪些本该由我们做的部署呢?

答案是Github Actions,GitHub有属于自己的一套CI /CD(持续集成,持续交付,简单的理解就是持续交代码,持续帮你部署发布)。

这里讲讲我在学习Jenkins时遇到的一些问题:

推荐文档:

并发编程---JUC(必学)

都说Java百万并发,千万并发的,其实说的就是Java的JUC,JUC旨在教导你使用计算机有限的资源去应对更多的请求压力,看到这里相信你也明白了,这是属于程序优化的内容。

建议就是菜就多练,这部分是Java最难的部分之一,没有长时间的实践积累,学习原理,你是拿不下这块内容的。

推荐网站(建议自己找书看):

虚拟机---JVM(必学)

和上面的JUC一样,都是Java中的大头,对于JVM而言,相信你可能听过JVM调优,没错,又是对Java程序优化,在这里你将学习到如何从JVM的层面了解Java代码,会使你看待Java程序的观点产生质的变化。

这边建议结合视频和书(《深入理解Java虚拟机(第3版)》)一起看,毕竟这个东西比较枯燥,可能你会看不下去书,还有就是推荐使用Arthas这个工具来帮助我们学习。

推荐工具和文档(建议自己找书看):

任务调度---XXL-JOB(选学,一般了解即可)

任务交由谁来执行呢,定时任务该怎么做,如果你有这样的需求,那么XXL-JOB一定对你的胃口。

个人感觉和RabbitMQ的功能比较类似,但是比起RabbitMQ,XXL-JOB在实际的项目使用中更加轻量化。

推荐文档:

搜索引擎---Elasticsearch(选学,等你项目需要搜索功能的时候再学)

这个其实也和数据库比较像,想想你平时搜索,如果匹配到了是会高亮的,或者说,不是完全匹配也可以找到数据,其实这都是它的功劳(比如你搜索笔记电脑,但是很明显,没有这个东西,可能是你打掉了一个字,但是搜索的时候依然可以搜索出来笔记本电脑)。

为要搜索的数据建立索引,主要用于快速搜索。

这个Elasticsearch是ELK的一部分,其中Kibana可以可视化你存在Elasticsearch中的数据,而且还提供了一个写DSL语句的页面,有点类似HttpClient。

推荐文档:

链路追踪---SkyWalking(选学,除非你的项目很大,链路层级很深)

当你链路长了的时候推荐使用,主要是帮助你分析调用链路的,比如是在哪里调用出现了问题,哪里的请求处理耗时太长等等。

这个你也可以不用学,因为我们之前已经学习了Micrometer Tracing服务链路追踪,已经学习了一个链路追踪的组件了,如果你学了一个的话,其实也没有必要学习太多,学好一个就行了。

推荐网站:

读写分离---ShardingSphere / MyCat(选学,除非你的项目一个数据库不够用)

可以帮助你实现读写分离,分库分表,一般是在你一个数据库不够应对现有并发量的情况下使用,否则不建议学习,建议有需要了再学习。

这个建议直接看官方文档,主要是官方文档写的比较精炼,而且基本上照着文档上面说的配置一般都没有什么问题,不过要注意使用的数据库连接客户端的版本不能太低,要不然会产生不兼容的问题。

至于这两个我们到底要选择哪一个,我推荐学习使用ShardingSphere,因为它的社区更活跃,功能更多,比MyCat更加完善。

推荐文档:

同步数据---Canal(选学,建议了解即可,毕竟我们也不是要做运维人员)

主要是为了解决主从数据库数据的同步问题,一般要用的话会配合MySQL使用。

存图片---OSS(选学,建议当你遇到存图片的需求的时候再去有针对性的学)

嗯,想想看,当你有了一个用户系统,然后每一个用户都会上传自己的头像,随着用户越来越多,你会发现这些图片好像浪费了你服务器的很多空间,那么你有没有考虑过将图片存储在其他人的服务器上以避免这种情况呢?

如果你想优化一下,那么不妨试一试阿里云的OSS云存储吧,免费又实用。

推荐网站:

超好用的工具包---Hutool(必学)

你是不是在为有时候没有好用的工具而烦恼,又或者是自己写的小工具总是有Bug,那么不妨尝试一下这款工具包吧,里面包含了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,用起来既方便又安全。

推荐文档:

笔者最后想说的话

什么?你竟然看到这里来了,那么不管怎么说,你一定是热爱技术的,不过我想在此提提我学了这么久的一些心得体会:

思考穿插:为什么”框架会变,底层思想不变”能成为学习路线的主心骨?因为框架只是某个思想的某个版本实现——Java 用 MyBatis 做 ORM、Go 用 GORM 做 ORM,换的是 API,不变的是”对象和关系如何映射”这个老问题。抓住不变的思想,你学一个就能迁移到同类技术,而不是被层出不穷的新框架牵着鼻子走。

最后的最后,能帮作者点一个star吗?举手之劳万分感谢。

章末提问

学习路线里的每个”先后顺序”和”取舍”,都值得追问。以下是三个典型追问:

  1. “你这份路线里为什么把 MySQL 放在 MyBatis 前面学?” 结论先行:「因为 MyBatis 本质是封装 JDBC 操作数据库,先懂 SQL 和表设计,才知道它帮你省了什么。」因为 学习顺序应该遵循”先底层、再封装”——否则你用 MyBatis 生成 SQL 时,根本看不懂它替你做的是什么事,出了问题也无从排查。

  2. “你说框架会变但底层思想不变,能举个具体例子吗?” 结论先行:「能——Java 用 MyBatis-Plus、Go 用 GORM,都是 ORM,解决的都是’对象与关系映射’这个不变的问题,学会一个再换语言只是换 API。」因为 这题在验证你是不是真理解了”迁移观”——能举出跨语言/跨框架的映射例子,才说明你抓住的是思想而非某个工具的语法。

  3. “为什么建议’遇到问题再学对应技术’,而不是先把所有中间件都学一遍?” 结论先行:「因为脱离真实场景硬背中间件记不牢、也分不清轻重;带着问题学,才能回答’它解决什么、代价是什么’。」因为 知识要挂在问题钩子上才记得住——空学一遍 Redis 你只知道命令,真遇到缓存穿透才知道为什么需要布隆过滤器,理解才完整。


Share this post on:

Previous Post
BIO的ServerSocket.accept()——从Java到内核的完整调用链