由於之前閘道器採用的是dubbo的rest協議,但使用一段時間發現速度有些慢,而且總感覺不如直接使用泛化呼叫來的爽,所以打算研究一下dubbo的泛化呼叫,在此記錄一下,參照了很多大神的思路,水平有限,歡迎指正。
dubbo泛化呼叫的原理就不細講了,網上有很多文章,底層基於netty做資料傳輸,進行rpc呼叫,netty是個重要的基礎,有興趣的同學可以研究一下,包括它的編碼,解碼,序列化等等,對理解dubbo框架有很好的幫助的,廢話少說,我記錄一下我的改造過程中涉及到的幾個方面:
1.zkclient,用於監聽zk的變化,這裡我使用redis作為快取,把zk的變化記錄了下來,有變化時,實時更新快取,保證時效性。
在初始化的時候,獲取zk的位址
@postconstruct
public void init()
if (loadbalancerservice == null)
runaway(zkclient, rootpath);
}
監聽zk的變化,放入redis
private void runaway(final zkclient zkclient, final string path) 's child changed, currentchilds:{}", parentpath, currentchilds);
// 一級節點的子節點發生變化
runaway(zkclient, path); // once more
}});
listfirstgeneration = zkclient.getchildren(path); // 二級節點
if (firstgeneration != null && firstgeneration.size() > 0) 's child changed, currentchilds:{}", parentpath, currentchilds);
// 2級節點的子節點發生
runaway(zkclient, path);
}});
listsecondgeneration = zkclient.getchildren(firstnextpath); // **子節點
if (secondgeneration != null && secondgeneration.size() > 0) 's child changed, currentchilds:{}", parentpath, currentchilds);
// 3級節點的子節點發生
runaway(zkclient, path);
}});
listthirdgeneration = zkclient.getchildren(secondnextpath);// 4級子節點
if (thirdgeneration != null && thirdgeneration.size() > 0) catch (unsupportedencodingexception e) }}
}}}}
}}
synchronized (this)
}
public void initdubboservice(string url)
/*** 註冊中心資訊**/
private static registryconfig getregistryconfig(string address, string group, string version)
if (stringutils.isnotempty(version))
if (stringutils.isnotempty(group))
registryconfigcache.put(key, registryconfig);
}return registryconfig;
}private static referenceconfig getreferenceconfig(string inte***cename, string address,
string group, string version)
referenceconfig.setgeneric(true);
referencecache.put(referencekey, referenceconfig);
}return referenceconfig;
}public static object invoke(string inte***cename, string methodname, object paramobject, string address, string version)
object resultparam = genericservice.$invoke(methodname,new string, paramobject);
return resultparam;
}return null;
}}
3.呼叫的時候由於業務需求和相容之前前端介面,往後端傳了兩個引數,這個可以隨意,下面就是呼叫了
jsonobject jsonobject = json.parseobject(reqbody);
token token = new token();
string retcontent = (string)dubbocallbackutil.invoke((string)redisclient.getvalue("dubbo_"+jsonobject.get("id")),(string)jsonobject.get("method"),new string,"zookeeper://"+zkserver,"");
其中業務介面是監聽zk變化存在快取中的,method前端傳過來的,剩下的就是json的引數了,先寫到這裡,後面還有服務端如何解析這些引數,因為後端接受的都是物件,需要通過過濾器來重新轉換json的字串為對應的型別,這個就需要個人發揮啦! dubbo的泛化呼叫研究
結論 泛化呼叫需要繼承乙個類,在配置檔案裡需要明確指出generic true 泛化呼叫在書寫provider 時,變化不大 泛化呼叫和普通呼叫的區別主要在consumer,從 呼叫 的表面意思也能看到端倪 泛化呼叫書寫客戶端時,不需要明確繼承和服務端相同的介面 使用泛化呼叫結合jmeter打壓,也...
dubbo的泛化呼叫研究
結論 泛化呼叫需要繼承乙個類,在配置檔案裡需要明確指出generic true 泛化呼叫在書寫provider 時,變化不大 泛化呼叫和普通呼叫的區別主要在consumer,從 呼叫 的表面意思也能看到端倪 泛化呼叫書寫客戶端時,不需要明確繼承和服務端相同的介面 使用泛化呼叫結合jmeter打壓,也...
ZooKeeper和Dubbo的泛化呼叫
zookeeper和eureka一樣是為微服務框架提供服務註冊發現中心功能.不過zk沒有預設ui介面,啟動後需要用命令列檢視裡面的註冊資料 啟動zk docker run privileged true name zookeeper publish 2181 2181 d zookeeper lat...