一个会画图的工程师
發現小謝圖畫的很好,雖然有些也是他引用的,但是我覺得還是很好所以這里收集下。
?【RocketMQ源碼學習】2-Namesrv
3-Remoting模塊?
rocketmq-remoting 模塊是 RocketMQ 中負責網絡通信的模塊,被其他所有需要網絡通信的模塊依賴。它是基于 Netty 實現的,避免了網絡編程很多 tricky 的問題。
首先來看下 RocketMQ NettyServer 的 Reactor 線程模型,一個 Reactor 主線程負責監聽 TCP 連接請求,建立好連接后丟給 Reactor 線程池,它負責將建立好連接的 socket 注冊到 selector 上去(這里有兩種方式,NIO和Epoll,可配置),然后監聽真正的網絡數據。拿到網絡數據后,再丟給 Worker 線程池。
Worker 拿到網絡數據后,就交給 Pipeline,從 Head 到 Tail 一個個 Handler 的走下去,這些 Handler 是在創建 Server 的時候指定的。NettyEncoder 和 NettyDecoder 負責網絡數據和 RemotingCommand 之間的編解碼。NettyServerHandler 拿到解碼得到的 RemotingCommand 后,根據 RemotingCommand.type 來判斷是 request 還是 response,如果是 request, 就根據 RomotingCommand 的 code(code用來標識不同類型的請求) 去 processorTable 找到對應的 processor,然后封裝成 task 后,丟給對應的 processor 線程池, 如果是 response 就根據 RemotingCommand.opaque 去 responseTable 中拿到對應的 ResponseFuture,把結果 set 給它。
對于 Client,經過 Pipeline 的順序是從 Tail 到 Head。不管是 Server 和 Client,并不是每次數據流轉都得經過所有的 Handler,而是會根據 Context 中的一些信息去判斷。
整個數據流轉過程中還有很多hook, 比如處理 command 前,處理 command 后,發送數據前,發送數據后等。
?
【RocketMQ源碼學習】4-消息發送?
?Broker端,消息的處理和落地
【RocketMQ源碼學習】5-消息消費?
Pull 的過程比較簡單(因為應用代碼要去做比較多的事情),所以這里我主要來梳理一下 Push 方式的整個過程。
【RocketMQ源碼學習】6-消息存儲?
寫消息MappedFile Append Message
MappedFile 和物理文件是一一對應的,append的過程,消息的具體構成如圖所示,大部分字段都很好理解,這里重點關注下 queueOffset 和 physicaloffset. queueOffset 是指對應的 consumeQueue 中的 offset, physicaloffset 是指該消息的物理offset,即圖中的 wroteOffset, 它等于 fileFromOffset(當前mappedFile的物理offset) 加上 mappedFile 對應的 buffer 的 position(一個邏輯的offset).
ReputMessageService 也是一個單獨的線程,它負責構建 ConsumeQueue 和 Index。
ConsumeQueue的結構如圖:
Index File
Java Nio
作者jjenkov最后寫了一個nio demo?https://github.com/fdx321/java-nio-server. 過了一遍源碼,工作過程大致如圖:
【Tomcat學習筆記】2-整體架構
下面是Tomcat的整體架構
?
這個類圖是Tomcat最主要的一個結構:
?
Engine、Host、Context、Wrapper 四種 Container 都可以配置?Valve,即使不配置,每個 Container 代碼里都有默認的Valve(StandardEngineValve, StandardHostValve …)是處理請求的時候必須經過的。關于 Pipeline 和 Valve,就是一個水管中間有多個閥門,每個數據流過來都在閥門的地方被處理一下。 四個容器的Pipeline串起來,可以用張圖來描述一下:
?
【Tomcat學習筆記】3-組件聲明周期?
LifecycleState?這個枚舉類定義了生命周期的各個階段,這個狀態機是這樣子滴:
【Tomcat學習筆記】4-啟動流程分析
它們是如何一層一層完成初始化和啟動的
以StandardServer為例:
如下面的時序圖所示:
【Tomcat學習筆記】9-ClassLoader
Tomcat的三大ClassLoader
為什么 Tomcat 里要自定義 ClassLoader 呢,先來考慮一個問題:一個Tomcat 部署兩個應用,App1 和 App2, App1 里定義了一個 com.fdx.AAA 類,App2 也定義了一個 com.fdx.AAA 類,但是里面的實現是不一樣的,如果不自定義 ClassLoader,
而都用 AppClassLoader 來加載的話,你讓它加載哪一個呢,一個 ClassLoader 是不能加載兩個一樣的類的。所以,ClassLoader 最重要的一個功能就是 類隔離。
?
【Tomcat學習筆記】14-Cluster?
Tomcat Cluster 這塊代碼較多,代碼主要在 org.apache.catalina.ha 和 org.apache.catalina.tribes 兩個package. ha這個package主要做了兩件事,或者說Tomcat cluster 主要就做了這兩件事:集群間 Session 同步 和 集群War部署。tribes 則是Tomcat 集群通訊模塊。
Tomcat 做了個集群的功能,大部分功能主要是解決session在集群中的同步,然而在有點規模的互聯網公司都不怎么用它。
- 對于無狀態的應用,通過apache/ngnix 負載均衡到 各個 tomcat就可以了
- 對于有狀態的(session)應用,往往都自研分布式Session應用。分布式系統下用 Tomcat 的 session 會有很多限制。
Tomcat還做了個功能,監控集群中應用的變更,如果有一臺的War包發生了變化,會通知其他機器自動重新部署。這個功能,在有點規模的互聯網公司應該也不會用它,肯定用自研的運維系統, 可以支持更靈活的應用部署,方便和公司的運維體系打通。
?
?
?Java Volatile 學習筆記
圖片來源?http://mechanical-sympathy.blogspot.com
說明:他引用的這個作者在JVM方面有一定的研究,圖畫的不錯
https://mechanical-sympathy.blogspot.com/
?
終于搞清楚Java的日志了?
Java的日志框架很多,JUL, Log4J, Lobback, JCL, SLF4J等
先來看下slf4j官方的一張圖:
關于這么多框架如何搭配使用,這篇文章總結的不錯,slf4j、jcl、jul、log4j1、log4j2、logback大總結
?
?
Spring事務管理
所謂聲明式事務,就是通過配置的方式省去很多代碼,從而讓Spring來幫你管理事務。本質上就是配置一個Around方式的AOP,在執行方法之前,用TransactionInterceptor截取,然后調用PlatformTransactionManager的某個實現做一些事務開始前的事情,然后在方法執行后,調用PlatformTransactionManager的某個實現做commit或rollback. 如圖:
總結
- 上一篇: 木屋多少钱啊?
- 下一篇: 我爱你你爱她她爱他这是什么歌?