You are on page 1of 2

作者:hasaki

链接:https://www.zhihu.com/question/265634331/answer/830026280
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

举个例子好了:我现在是个懵懂的小白,老师让我用 java 做一个图书管理系统:图书管理系统得有页面吧,页面


我该怎么开发呢?于是你百度:前端入门,然后你就知道了,原来我使用 html js css 就可以写一个页面出来
了。假设你坚持到了这一步,你发现用 js 写这些东西好麻烦啊,特别冗长,关键是原生的 JavaScript 还有各
种浏览器兼容性的问题,你写出来的东西在 chrome 上能用,在 ie 上就展示的不正常了。于是乎你又百度:js
框架。浏览器告诉你 js 的框架有很多:JQuery,React,Vue,假设挑选了 Jquery 来做你的项目,你会发现,
额 是比之前爽多了,毕竟框架会集成好很多方便的功能,你觉得你的效率在提高。现在你坚持到了第四步,但是
你又发现了新的问题,虽然相比之前 JQuery 操作起来是简单了许多,不过还是要我主动操作 dom 对象,有没有
办法:我只关心我当前页面所用的数据是啥玩意就行了,改了数据之后,跟数据绑定的页面元素能够自动改变呢?
这样我不就不用自己操作 dom 了吗?哦,对了,我之前搜索 js 框架的时候还有 Vue 和 React,这都是啥玩意,
于是乎,你百度:Vue 入门。好了,你开始使用 Vue 来写你的前端页面了,相比之前效率又高了很多,使用 Vue
的过程中,你可能接触到越来越多的概念,前端的模块啊,打包啊等等。你也许觉得写前端真他妈好玩,于是乎
你关闭了这篇文章,去搜索:前端学习路线图。。。。PS:我现在很难受,我是来跟你们一起学习 java 的终于
到后端了:现在你已经会写页面了,可是管理系统的数据我怎么展示在页面上呢,总不能写死在页面上吧。要是
能有个地方存这个图书管理系统的数据,并且我的页面可以从那个地方拿就好了。存图书数据的地方肯定就是叫
数据库啦,于是你百度:数据库入门,书上告诉你数据库有好多种:sql
server、mysql、oracle、db2 ..... 但是无论是哪一种都要先学习一下 SQL,不管了,程序员就是爱学习,
学呗你现在学会了 sql 了,你按照网上的说明安装了 mysql 数据库,知道了怎么用 sql 操作数据库里面的数据,
真是个天才。但是没用啊,我给别人用的是系统哎,我不能跟他说,你过来,我给你用 sql 展示一下数据库里面
有哪些数据吧。既然是个图书的管理系统,图书的增删改查肯定都得放在后端来做吧,毕竟前端只是做页面样子
和交互,后端才是处理数据的,对图书的增删改查就是对数据库的增删改查呗。哦,我记得之前 java 书上看到
JDBC 可以操作数据库,把这块知识点捡起来,试着写一段程序操作一下吧。好厉害,你竟然已经学会了 java 操
作数据库,现在哪怕不打开数据库,不借助数据库的各种客户端你也能通过你的 java 代码查到库里面的内容了。
但是还有个问题,我前端页面怎么跟后端打交道呢?换句话说,我前端页面写的花里胡哨的,可是该怎么告诉后
端程序:你给我展示一下数据库里面有哪些书?数据库里面有没有一个叫 java 从入门到放弃的书?于是你百度:
js 前后端交互你发现了 Ajax,js 中的这种技术可以请求后端的接口,拿到数据。然后用数据做相应的展示、交
互之类的。并且你也知道了 json,他几乎成了前后端交互事实上的数据标准。于是乎,你通过简单的百度之后,
知道了该怎么向后端发起请求(当然了 也许在前 5 步的时候,你已经知道了怎么向后端发送请求,并且你有各种
不同的姿势来发,什么原生的 js 啊,vue 啊,react 啊,jquery 啊。各种姿势都不在话下)页面写好了,也知
道在页面上怎么向后端发送指令了,现在就差后端接口了。我刚刚写的 java 操作数据库,花里胡哨的,但是没用
啊,我要先接收到前端发给我的指令,我再开始查询,或是各种管理吧。前端都没说话呢,你一顿操作,不是个
沙雕吗?好吧,那我的 java 怎么能接收前端发给我的指令呢?你百度:java http 接口。于是你知道了
servlet ,tomcat。原来我只要写一个 servlet,接着将其放到 tomcat 中执行,就能对外提供一个接口了呀。
天哪,我的 servlet 成功接收到了前端请求,根据前端的各种命令,后端开始尽职尽责的执行各种 java 指令,
返回 json 数据给前端。完美啊,我做完了,关闭这篇文章,打游戏去了。。。等等,首先那个 jdbc 操作的是在
是太麻烦了吧,open connection 各种 try catch 。上面不是有个 mybatis 说是可以简化 jdbc 操作吗,
怎么玩的?百度一下:mybatis 入门嗯,mybatis 确实太香了。优雅的 orm 映射、灵活的 sql 编写。都让你觉
得使用原生 jdbc 操作起来真是太费劲了。不对,我觉得用 servlet 也有点麻烦,每次建立一个 servelt 之后,
还要在 web.xml 配置,而且写起来也不优雅,json 数据都是各种拼装起来的,真麻烦。是时候学习一下
spring 了,大家都说 spring 是 java 程序员必学的,他到底好在哪呢,我的程序能不能用一下 spring?让我
百度一下 spring 入门。果然 spring 确实方便,有了 spring,我再也不用 new 对象了,我想要的,她都懂我,
给我提前准备好了之后,我直接拿就行了。并且啊,她还会贴心的把依赖关系给我搞好。没错,这就是 Spring
核心的容器和 DI 功能。你发现,spring 家族竟然还有个东西:spring mvc,他是一个 MVC 框架,大家都在用,
你也尝试了一下。十分钟后你觉得:我再也不会用 servlet 去写了,用 springMVC 写效率提升十倍不止。爱好
学习的你在项目中用了 spring,springMVC,mybatis。额,这 tm 的不就是 SSM 三大框架吗。嗯,不错,可
以出去装逼了同学啊,你这个管理系统怎么那么慢啊,我查了一本书 :java 从入门到放弃,每次查询都要好几
秒,程序太烂了吧。你很难受,你的程序被大家吐槽了,要是我能快一点就好了?加个缓存吧,大家都说 redis
很好,性能高,支持事务,还能持久化。你一顿操作,在项目中集成了 redis。班上的同学都很满意,见到你就
说,同学,你现在好快啊,每次都不到 3 秒。用户体验哗哗的提升。你很满足,很自豪。学校新进了一本书,刘
慈欣的《三体》,大家都很喜欢看,一听到书籍上架的消息都去用你的系统。结果由于人数太多,你的系统没有
抗住,挂掉了。。。不行,有点丢人。加机器吧,我要是能有十台机器,每台上面都部署我的程序,并且这十台
都提供给用户服务。那么自然每台的压力就小很多了。但是该怎么做呢,总不能告诉他们说:一班的同学你们使
用 135 的这台机器,二班的同学你们使用 136 的这台机器吧。要是大家都有统一的入口,但是通过该入口,请求
会自动分配到这 10 台机器上就好了。于是你搜索一下:负载均衡。你发现了 nginx 还有 h5 负载均衡器等各种软
件或是硬件实现的负载均衡(当然 nginx 不止这个功能)。加一台 nginx 吧,毕竟不要钱。你按照文档配置好
10 台机器的权重。现在用户的请求能被 10 台机器处理。学校又进了一批热门的图书,这次你的系统没有垮掉。
真厉害。又来了一个需求,系统加了一个关注的功能,用户可以关注某本未上架的书,等它上架的时候,系统要
通知用户。所以该怎么做呢,现在的你可能想着,我写个程序不停的去询问数据库,看这本书有没有上架。但是
这么做有个问题,就是及时性的问题,你该设置多久询问一次呢?所以,是时候使用 mq 了,当书上架的时候,将
书的信息放到消息队列中,消息消费者一监听到消息,立马就去发送通知。怎么样,这样做是不是逻辑上也解耦
了,代码写着也不累了。你闲着蛋疼,往系统里面新增了各种各样的功能:当用户预约的书到了的时候,发送提
醒。一些淘汰的书籍你还给加上了公益拍卖的功能,用户只要竞拍,就可以获取到这个书籍,为公益做贡献。真
是个商业奇才。你越写越多,想法犹如泉水一样连绵不绝,然后你发现了一个问题,系统实在是功能太多了,你
随便改一下东西可能都影响到别的功能,启动一次动不动五六分钟,关键是有一些新的小伙伴加入你的时候,每
个模块的功能他都要了解,否则一不小心就像拍仓鼠一样,一个 bug 改了,又冒出来一个。拆分吧,装个逼。拆
成微服务。用户一个服务,图书的管理一个服务,拍卖一个服务,短信一个服务。每个服务由不同的人来负责,
大家都对自己的业务比较熟悉,项目小而精致。但是拆分会面临以下很多问题:怎么拆分,如何划分颗粒度拆分
后怎么协作下游服务频繁的失败怎么办怎么保证高可用怎么保证数据的一致性系统间怎么监控?(调用链路、日
志、报警机制、)....

You might also like