前一段时间上传了很多结构图和脑图,它包含了Java应用开发的大部分知识。要把这些知识串起来,或者更深入的了解,就得了解服务架构运行的原理,了解了原理有助于运用这些组件。
前面20多篇博客最好将其串起来阅读和思考,本人没有打算成为写作专业人员,所以格式上有些土,只是上传上来自己总结,好查看和对大家有一些帮助。
既然是开源服务和框架的原理,我们就列举几个服务和框架作为基础,和说明对象。
(我们这里将搭建和运行整合起来是一个服务的组件,称其为开源服务)
开源服务,如:
- Dubbo
- Zookeeper
- Nginx
- Slor
- MQ
框架,如:
- SpringMVC
- Spring
- Mybatis
- Flume
- Kafka
- Storm
- Spark
不论是上面的开源服务,还是框架,如果看源码,或者是扩展开发,会从三个方面去了解源码和原理。
- 线程池和线程
- 通信,有关通信协议(通信方式有:点对点,点对多的发布订阅)
- 算法,某些功能的高性能算法
然后将这三个方面串起来去阅读源码,了解其原理
- 就第一点讲解:(线程池和线程)
如:Dubbo和SpringMVC
Dubbo的Provider和Consumer分别是应用进程里面创建的线程池运行起来的。
SpringMVC的每一个Servlet运行,本身就是一个线程。
- 就第二点讲解:(通信,有关通信协议)
呈上启下,只要是通信,就会线程池运行做支撑,大部分的通信的底层是IO。对于Java来说尤其是NIO,因为大部分的协议Java底层都是NIO,(用NIO是为了防止IO阻塞,当然还有BIO,和AIO)
如:TCP, UDP, HTTP, RTMP, RPC
代表:Netty通信
- 就第三点讲解:(算法,某些功能的高性能算法)
呈上启下,只要是通信,就会序列化做支撑,如何序列化,每一种序列化本身就是一套算法,不同序列化通信性能和安全性不一样。
如:Hession
代表:Netty序列化
现在我们来将这三点整合起来看看,以zookeeper为例。如果我们要来了解zookeeper的源码或者原理,我们就先看它的线程和线程有关的代码,然后就在看它的通信和通信协议方面的代码,最好看它的有关算法方面的代码。当然有些开源服务和框架的源码和原理不止这一个模块,我们都可以按照这种方式去阅读。
- 创建线程的过程:
zookeeper的启动和停止就是线程的生命周期创建和销毁的过程。
- 1. 启动ZK服务: sh bin/zkServer.sh start
- 2. 查看ZK服务状态: sh bin/zkServer.sh status
- 3. 停止ZK服务: sh bin/zkServer.sh stop
- 4. 重启ZK服务: sh bin/zkServer.sh restart
- 通信,监听节点的增删查改
每个节点的通信是通过心跳机制连接,这种连接的底层和mina的机制很相似。
- 算法,分布式锁的一致性算法paxos
Paxos解决保证每个节点执行相同的操作序列,master是维护一个全局队列,所有的写操作都必须放入这个队列编号,无论多少节点,都按照这个编号来。
例如:(storm原理,源码也类似)