原创 ReferenceQueue

java的引用 1. 強引用 只要是這個強引用存在時,內存中會一直保留他的內存,即使垃圾回收器來回收垃圾時,也不會回收這個對象的內存。即使內存不足時,會報內存溢出 Object o = new Object

原创 guava cache 代碼分析3 get(key) -- 7

上面在講到Segment數組的時候,已經提過根據key的hash計算出在那一個Segment裏面。下面具體看下Segment是怎麼從緩存中取出的。 V get(K key, int hash, CacheLoader<? sup

原创 guava cache 存儲的數據結構2之ReferenceEntry實現類 --- 3

上一節提到緩存中的實體類是ReferenceEntry{K, V>(key可以是任意的類型,value是ValueReference{K, V>),但是它只是個接口,下圖是他的實現 創建方式 這個是在Segment類裏,map

原创 dubbo 線程模型

<dubbo:protocol name=“dubbo” dispatcher=“all” threadpool=“fixed” threads=“100” /> Dispatcher dubbo默認是使用netty的,在初始化N

原创 dubbo源碼5 -- 消費者發送數據調用鏈

List<Config> configs = testService.findByCategory(“aa”); 調用test項目的com.test.ITestService.findByCategory(String categ

原创 dubbo源碼分析4-- ReferenceBean 獲取消費者代理對象

主要工作 獲取invoker對象 a)註冊消費端的臨時節點 b) 訂閱以下的節點 /dubbo/com.test.ITestService/providers /dubbo/com.test.ITestService/con

原创 dubbo --netty創建服務端、客戶端以及handler

上一節說到用到這個來創建服務,其實到最後就是new NettyServer(url, listener) Transporters.bind(url, new DecodeHandler(new HeaderExchangeHan

原创 dubbo源碼分析2 -- 解析dubbo文件

dubbo在gitHub上的地址是https://github.com/apache/incubator-dubbo 解析dubbo命名空間 在dubbo-config-spring下面有個spring.handlers,在spr

原创 dubbo源碼分析3 -- ServiceBean 發佈服務

主要的工作 生成invoker保存在DubboProtocol的exporterMap中 啓動netty服務器 獲取 zookeeperRegistry。啓動定時器去處理一些失敗操作(訂閱、註冊、通知等) 創建提供者的臨時節點

原创 dubbo-- 註冊中心Zookeeper (註冊、訂閱、通知)

註冊中心可以是zookeeper、redis和dubbo zookeeper的路徑如上圖所示,root下面有接口,接口下面有providers和consumers。 首先會註冊節點. 消費者會訂閱接口下的providers的所有

原创 guava cache

guava cache 緩存一般分爲cpu緩存、操作系統緩存、本地緩存、分佈式緩存、http緩存和數據庫緩存.而guava cache是全內存的本地緩存。 你的緩存數據不超過內存(Guava緩存是單個應用中的本地緩存。它不

原创 guava cache 代碼分析1 -- 5

建立緩存實體LoadingCache LoadingCache只是個接口,具體的還是LocalLoadingCache,其實真正管理緩存的是LocalCache。 class LocalLoadingCache<K, V> e

原创 guava EventBus 觀察者模式

guava EventBus 觀察者模式 主要有主題和觀察者,主題發生變化時,通知觀察者(用戶只要提供觀察者,並且向主題中註冊即可),其中在操作subscribersByType都開啓鎖了。所以這個EventBus 主要提供線程

原创 guava cache 創建方式 --- 1

緩存一般分爲cpu緩存、操作系統緩存、本地緩存、分佈式緩存、http緩存和數據庫緩存.而guava cache是全內存的本地緩存。 你的緩存數據不超過內存(Guava緩存是單個應用中的本地緩存。它不會將數據存儲到文件中,或者外

原创 Disruptor 高併發 無鎖

以下是原理圖 啓動的時候一個處理事件一個線程。 使用 //啓動 Disruptor<DisruptorEvent> disruptor = new Disruptor<>(new Runnab