Dubbo泛化呼叫閘道器初試

2021-10-05 16:13:25 字數 2924 閱讀 4704

由於之前閘道器採用的是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...