python、java大作戰,python測試dubbo接口


很多小伙伴都反映公司要求測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安裝即可:

 

 

當然我們要調用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)#打印結果

 

運行結果看下圖:

   

 

步驟寫的可能有點多,但是具體實現起來很簡單,快去試試吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM