? ? ? ? ?偶然在網(wǎng)上瀏覽到這樣的一些字眼“寫一個(gè)自己的RPC框架”,心中也很激憤。于是乎想從頭開始,深入研究一下如何搭建一個(gè)RPC框架。筆者是做java的,市面上開源的RPC框架很是不少,Dubbo、Thrift等等。我規(guī)劃了一下自己的算是學(xué)習(xí)路線。線程->nio->netty->RPC->RPC產(chǎn)品。線程相關(guān)的知識(shí)筆者自認(rèn)為還算可以。那么就從nio開始,很多人認(rèn)為應(yīng)該先從“同步”“異步”“阻塞”“非阻塞”幾個(gè)概念開始,但是這些網(wǎng)上解釋的已經(jīng)很是透徹,就從nio涉及的幾大成員開始吧,第一站:Buffer。

一 、Buffer
?一種byte數(shù)組類型的存儲(chǔ)結(jié)果。
抽象類
非線程安全
具有6個(gè)屬性,其中
mark:標(biāo)示位,默認(rèn)為-1。一般配合mark和reset一起用,下面再說。
position:默認(rèn)為0,表示當(dāng)前可操作元素的位置。
limit:數(shù)據(jù)指針可到達(dá)的最大位置。
capacity:總?cè)萘?/p>
address:直接內(nèi)存buffer中會(huì)用到,之后說。
屬性值之間的關(guān)系 :mark <= position <= limit <= capacity
方法
均有獲取以上屬性值 帶參和不帶參的方法,不帶參為獲取當(dāng)前數(shù)組中的值,帶參則是指定值。
mark(): 將當(dāng)前的mark值設(shè)置為position的值。
reset(): 將position的值設(shè)置為當(dāng)前mark的值。
clear():初始化所有屬性值為默認(rèn)值。
flip():limit的值設(shè)置為position的值,其他屬性值設(shè)置為默認(rèn)的值。
rewind():讀/寫到buffer中數(shù)據(jù),然后調(diào)用rewind 從來再開始。position=0 mark=-1.
remaining():剩余可操作容量 limit-position
hasRemaining():是否還有剩余?limit-position>0?
isReadOnly():
isDirect():
nextGetIndex() 帶參(返回position+int參數(shù)的位置)和不帶參(返回當(dāng)前position的位置)兩種。
checkIndex(int i) 檢測給定的值i 是否在可操作范圍內(nèi)。
discardMark() 將mark屬性值設(shè)置為默認(rèn)值 也就是-1
truncate()? mark=-1 其他值為0
buffer類及其子類的所有操作方法 都僅僅是操作幾個(gè)屬性的值? 對(duì)里面的元素沒有任何操作,簡單的說,只是指針的變化,但是元素沒有任何變動(dòng)。我沒有列出源碼,我相信所有人的機(jī)器上都會(huì)有的。
二、HeapByteBuffer& HeapByteBufferR
堆內(nèi)內(nèi)存,jvm堆內(nèi)內(nèi)存,垃圾回收由jvm來控制。
ByteBuffer.allocate(int) 分配內(nèi)存。
方法
slice(): 構(gòu)造一個(gè)與源buffer共享元素的buffer ,mark=-1,position=0,limit=capacity=源buffer的remaining也就是剩余長度,offset=position+offset。也就是說,如果是正常遍歷而改動(dòng)的數(shù)據(jù)指針屬性值的話,這個(gè)操作是將所有remaining的位置構(gòu)成一個(gè)新的共享同一些元素的buffer。
duplicate():復(fù)制一份源buffer 構(gòu)成一個(gè)新buffer,共享元素。
asReadOnlyBuffer() 復(fù)制一份源buffer,構(gòu)成一個(gè)只讀buffer(HeapByteBufferR.class)
ix(int i): 相對(duì)offset 第i個(gè)元素。 offset默認(rèn)為0;
get() = hb[ix(nextGetIndex())] 獲取當(dāng)前相對(duì)offset位置第 position的元素。
get(i) 獲取指定位置的元素,首先i需要在可操作元素的下標(biāo)范圍內(nèi)。
get(byte[] arg,offset,length) 將buffer中的元素,copy到arg中。
put(byte[] arg,offset,length) 將arg中的元素,copy到buffer中。
compact():從當(dāng)前position位置開始向后取remaining()長度的元素,放到buffer 從position=0開始的位置。置換完成之后,position=remaining() mark=-1
HeapByteBufferR只讀buffer,重寫了所有寫操作,均會(huì)拋出異常,通過buffer.asReadOnlyBuffer()來構(gòu)建。
關(guān)于方法使用的具體業(yè)務(wù)場景,現(xiàn)在能寫出來的都是個(gè)人猜測,所以我想在接下來的測試中補(bǔ)全。