很多小伙伴都反映公司要求測dubbo(dubbo是一個java的分布式開源框架)接口,不會寫java代碼,怎么測,能不能用python來調dubbo接口。當然是可以的了,最近研究了一下,很簡單,分享給大家。
關於dubbo這個框架咱就不過多描述了,開發用,咱們只關注怎么調用就行了,想了解原理的可以看下這篇文章 http://www.cnblogs.com/Javame/p/3632473.html
Dubbo本身支持多種遠程調用方式,例如Dubbo RPC(二進制序列化 + tcp協議)、http invoker(二進制序列化 + http協議)、hessian(二進制序列化 + http協議)、WebServices (文本序列化 + http協議)等。
Dubbo是支持hessian+http協議調用的,hessian是一種二進制序列化的方式。咱們用python調用的dubbo的時候,就是用hessian+http的方式調用,所以dubbo項目要配置使用hessian方式序列化,如果小伙伴要用python調用的時候,注意要找開發小哥哥在項目里面改成hessian方式的序列化,也就是改個配置文件的事,不影響原來的項目,如下圖:
咱們用python調用的時候,hessian+http這種方式調用,需要安裝一個第三方模塊,python-hessian這個模塊,直接pip安裝即可:
|
1
2
|
pip install python-hessian
|
當然我們要調用dubbo接口的話,要知道dubbo接口的調用地址、方法、入參對象和入參,這個就需要開發小哥哥提供給你文檔了。
如果沒有文檔的話,就需要你能看懂java和dubbo的代碼了。我這里沒有文檔,就直接說怎么找這些咱們需要用到的。
1、先找到調用地址、接口、方法。
dubbo是帶有服務監控的功能的,這個都有,管開發要地址就行,這個里面可以看到你要測的服務,他里面的地址、方法,如下圖,我們可以看到在dubbo服務監控里面有個HelloApi的服務:

然后我們帶點這個服務進去,就可以看到這個服務是部署在哪個服務器上的,然后點這個服務器的ip進去,就可以看到調用地址、接口、和方法,分別是:
調用地址:http://192.168.1.100:8181/api/yz.dubbo.api.HelloApi ,#那個頁面里寫的是hessian,咱們用的是http協議發送的,這里咱們用的時候就改成http
方法:hello
如下圖:

2、找到入參對象和入參
通過dubbo的服務監控,我們可以獲得調用地址、接口,入參對象和入參就得看代碼了,我們打開項目代碼,看到入參類型是在yz.dubbo.api下面的param包里面的Param對象,那么入參對象就是yz.dubbo.api.param.Param,然后我們可以看到這個對象里面有幾個屬性,也就是它的入參,一個字符串類型的sth,一個整形數組ints,一個字符串鍵值對maps,對應到咱們python的數據類型就是一個字符串,一個list,一個字典。
入參對象:yz.dubbo.api.param.Param
入參:sth、ints、maps

3、調用
通過上面的東西,咱們調用的dubbo需要用到的東西全部都准備好了,咱們封裝一個函數去調用,下面是代碼,寫好了注釋
from pyhessian.client import HessianProxy #從pyhessian導入HessianProxy,用它來發請求 from pyhessian import protocol #這個是用來進行把咱們python的數據類型序列化成二進制的 def dubbo_api(url,interface,method,param_obj,**kwargs): ''' :param url: url地址 :param interface: 接口名稱,因為這里可能還有別的服務要測,接口名不一樣,這里定義成變量 :param method: 調用哪個方法 :param param_obj: 入參的對象 :param kwargs: 這個用關鍵字參數,因為每個接口的參數都不一樣,不固定,所以這里用關鍵字參數 :return: ''' req_param = protocol.object_factory(param_obj,**kwargs) #這個是用來構造二進制的入參的,也就是把入參序列化 try:#用try捕捉一下異常 req_obj = HessianProxy(url+interface) #這個req是生成一個請求對象 res = getattr(req_obj,method)(req_param) #getattr是python的內置方法,獲取對象的方法,咱們從構造的請求對象里面獲取到方法,然后調用,把前面生成的 #序列化好的參數傳進去,然后獲取到返回的數據 except Exception as e: print('有異常了,異常信息是:%s'%e) res = {"msg":"異常:%s"%e,"code":300} #這個是自己定義的異常,如果調用出錯了,就返回這個 return res if __name__ == '__main__': url = 'http://192.168.1.100:8181/api/' interface = 'yz.dubbo.api.HelloApi' method = 'hello' param_obj = 'yz.dubbo.api.param.Param' params = {"sth":"dubbo","ints":[1,2,3],"maps":{"name":"dubbo"}} #這個入參,為了不定義多個變量,咱們把它寫成字典形式的,就和stu=dubbo這種方式調用是一樣的 over = dubbo_api(url,interface,method,param_obj,**params) #測試調用一下 print(over)#打印結果
運行結果看下圖:

