所有的技术分为两个,就是硬件和软件,硬件就是CPU和内存和磁盘还有一些网络相关东西,这是硬件,一台电脑电脑不管用什么软件,最终都是利用这些硬件的资源去解决对应问题,cpu去做运算,内存做存储,磁盘做存储,网络做通讯
软件就是我们怎么样去开发一个东西出来,基于我们的指令去开发一些东西出来,最终底层都是010101这样晶体管的布局,
最早的汇编语句到我们现在的Java语言,在学习Java之前,计算机不是去认识010101的,计算机只是一个晶体管的信号灯,我们的Java是一种自然语言,我们通过自然语言去开发一些程序,我们需要Java语法,语法是我们可以通过Java所定义的一种规则开发出相应的逻辑,比如说if else判断语句for循环,变量等等.我们会通过这些语法去开发一些东西,
比如说我们希望跟浏览器去交互,那么我们就会用到jsp Servlet技术, Spring SpringMVC框架,框架结合我们的语言我们可以开发动态的web项目,
jspServlet我们需要部署,所以我们就用到容器,比如说Tomcat容器,我们部署容器我们需要接收请求.
接收请求我们需要用到通信,就是网络IO,传统的网络IO是BIO的阻塞模型,我们需要提升我们IO性能的话,我们可能会用到NIO,NIO这种是网络通讯层面的一种性能的提升.
接收了请求我要把数据返回给前端,比如说我要给服务器上的HTML文件或者jsp编译之后生成的文件返回给前端,这个时候我们就需要读取磁盘的数据了,这个时候就需要磁盘的IO了.因为我们所有的静态资源都是放到线上服务器的.
我们希望我们的程序能够最大化的去利用系统资源,无非就是利用好CPU和内存和磁盘的资源,网络资源我们是无法去利用的(带宽是我们花钱去提升的),
我们怎么去提升CPU的处理性能,无非就是利用CPU的多核心去并行处理多个任务,这就是调度线程,这个时候我们通过线程的引用可以去提升我们程序的处理性能,这是通过线程去最大化的利用硬件的cpu资源.
我们很多东西是存到内存里面的,比如说一些经常访问的数据,比如说放到HashMap里面,就是放到内存里面的,我们内存资源是很宝贵的,如果我们去利用好的话,我们可以大大的提高我们的处理性能.如果我们给内存用好我们就能解决很多性能问题.
每一种数据结构会有相应的算法在里面,比如说我们的List数组,Map是hash和红黑树.这些数据结构无非是我们去定义这样的数据结构去存储对应的数据,然后我们去封装成一个集合框架,或者API去使用,我们就可以直接用现成的集合框架去完成我们的业务逻辑.
再说说磁盘,磁盘无非就是IO流么,我们会使用输入流输出流去读取磁盘的数据,我们怎么最大化的去利用磁盘的性能呢,磁盘上有一个所谓的顺序写.顺序写的性能是非常高的,我们以前会认为一个磁盘的IO读写性能比较低是因为是随机读写,随机读写性能是比较低的,如果是顺序读写,那么性能是很高的.
然后磁盘里面会有一些页缓存,这些缓存是可以提升我们的一个性能,我们数据传输,比如说所谓的零拷贝, 零拷贝就是减少了 一个数据从磁盘读取到最终的网络传输过程中的一个拷贝次数.
再说说网络,网络有网络的传输性能,怎么提升呢,比如说数据包的大小,然后就是我们的通讯(NIO),最终就是通过花钱提升我们的带宽.
网络传输怎么提升我们的传输速度呢,就需要序列化,需要考虑序列化的性能和序列化后的数据包大小,然后数据传输过来以后还需要用到内存,因为我们有一些数据要用到内存的,还需要一些数据结构,我们还可以跟我们磁盘打交道,比如说dubbo会把数据持久化到磁盘上.
所以说硬件会限制我们软件的发展,我们的硬件水平就决定我们的软件能够去提升到多大的高度,如果你CPU垃圾,不管你再怎么折腾,提升的性能也是有限的
再说说框架,都是大牛封装好的,而封装的代码里面又会涉及到思想,比如说我为什么这么设计,我这么设计的原因是什么,第二个就是设计模式怎么让这个代码变的更优雅,或者说更加有扩展性,第三个就是我们能够去提供更多的解决方案,这是对业务开发而言的.
再说说缓存,有多种解决方案,比如说有redis这种中间件,中间件的意思是操作系统和应用之间的一种用来解决特定问题的组件,如果我们不用Redis的话,我们也可以自己去实现.redis这种NOSQL去做存储的话,就需要用到数据结构,比如说String,Hash,Set,List等等,不同的数据结构有不同的算法,每种算法又有不同的时间复杂度和空间复杂度.我们怎么去选择最合适的算法去解决这个问题
Redis里面的数据是存在内存里面的,那么内存又是一种系统资源.,又是用到了我们的内存资源,中间件就是更加直观的去跟底层资源去打交道,
比如说其它在中间件 Dubbo 是用的RPC网络通讯,如果我用Dubbo的话,那么我们就会用到IO通讯,就会用到BIO和NIO, 这些底层东西很繁琐,但是中间件帮我们封装好了, 我们只需要直接去使用即可.
分布式里面,任何组件,只要是第三方中间件,一定会提供一个通讯的端口给到你,如果没有端口的话, 那么这个中间件就无法和程序端交互,那么就没有意义了
中间件是特别偏低层的,因为中间件真正意义上是最大化的去利用好这些计算机本身的资源,然后我们在应用层我们去通过中间件提供的API去访问我们的中间件,最后去实现我们类似的这样的功能.
我们要了解组件的实现原理就是要看两个东西,一个是思想,一个是源码.思想的话无非就是为什么要这样的设计,这样的设计有什么样的价值,
思想有两类,一类是借鉴,第二类是理论依据.所有的伟大实践都是由理论支撑的,第一个是先有理论,理论证实可行以后才会有一个实现,比如说我们的算法,算法有Paxos算法,这个算法是解决在分布式环境下各个节点的数据一致性问题.