本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,特別是涉及一種服務(wù)的重啟方法和一種服務(wù)的重啟裝置。
背景技術(shù):
Thrift是一套不同語言之間通信的RPC(Remote Procedure Call Protocol,遠(yuǎn)程進(jìn)程調(diào)用協(xié)議)框架。本領(lǐng)域技術(shù)人員在采用Thrift在進(jìn)行開發(fā)時(shí)發(fā)現(xiàn),Thrift是使用多個(gè)服務(wù)互相備份的方式部署和更新服務(wù)service。
例如,一服務(wù)service運(yùn)行在一臺(tái)服務(wù)器A上,如果想對(duì)該服務(wù)進(jìn)行升級(jí),就需要使用另外一臺(tái)部署同樣服務(wù)的備份服務(wù)器B替換。即將該服務(wù)的所有線上請(qǐng)求全都移交到服務(wù)器B上,然后停掉服務(wù)器A上服務(wù),更新A上的服務(wù)并重新啟動(dòng),再將服務(wù)從B替換回A上,從而實(shí)現(xiàn)對(duì)服務(wù)的升級(jí)。
但是,Thrift采用上述備份的方式部署和更新服務(wù)service,每次更新服務(wù)操作繁瑣,升級(jí)部署不便捷。
技術(shù)實(shí)現(xiàn)要素:
鑒于上述問題,提出了本發(fā)明以便提供一種克服上述問題或者至少部分地解決上述問題的服務(wù)的重啟方法和相應(yīng)的服務(wù)的重啟裝置。
依據(jù)本發(fā)明實(shí)施例的一個(gè)方面,提供了一種服務(wù)的重啟方法,包括:服務(wù)進(jìn)程依據(jù)重啟指令,獲取與目標(biāo)接口綁定的套接字socket;創(chuàng)建與所述服務(wù)進(jìn)程相同的服務(wù)子進(jìn)程,對(duì)所述服務(wù)子進(jìn)程傳入所述綁定的socket;判斷所述服務(wù)進(jìn)程不存在請(qǐng)求后,關(guān)閉所述服務(wù)進(jìn)程;針對(duì)所述目標(biāo)接口的數(shù)據(jù),采用所述服務(wù)子進(jìn)程調(diào)用所述綁定的socket。
可選的,其中,還包括:預(yù)先變更庫代碼,以使進(jìn)程支持傳入socket,其中,所述進(jìn)程包括服務(wù)進(jìn)程和服務(wù)子進(jìn)程;封裝變更的庫代碼,得到對(duì)應(yīng)支持進(jìn)程熱重啟的庫文件。
可選的,其中,還包括:依據(jù)所述支持進(jìn)程熱重啟的庫文件創(chuàng)建服務(wù)進(jìn)程。
可選的,獲取與目標(biāo)接口綁定的socket之后,還包括:將所述綁定的socket添加到環(huán)境變量中。
可選的,對(duì)所述服務(wù)子進(jìn)程傳入所述綁定的socket,包括:向所述服務(wù)子進(jìn)程傳入所述環(huán)境變量,以傳入所述綁定的socket。
可選的,針對(duì)所述目標(biāo)接口的數(shù)據(jù),采用所述服務(wù)子進(jìn)程調(diào)用所述綁定的socket,包括:在所述目標(biāo)接口處,判斷所述服務(wù)子進(jìn)程的環(huán)境變量中是否存在所述綁定的socket;若存在所述綁定的socket,采用所述服務(wù)子進(jìn)程調(diào)用所述綁定的socket。
可選的,其中,還包括:依據(jù)接口請(qǐng)求創(chuàng)建與目標(biāo)接口綁定的socket。
根據(jù)本發(fā)明實(shí)施例的另一個(gè)方面,提供了一種服務(wù)的重啟裝置,包括:獲取模塊,用于服務(wù)進(jìn)程依據(jù)重啟指令,獲取與目標(biāo)接口綁定的套接字socket;傳入模塊,用于創(chuàng)建與所述服務(wù)進(jìn)程相同的服務(wù)子進(jìn)程,對(duì)所述服務(wù)子進(jìn)程傳入所述綁定的socket;關(guān)閉模塊,用于判斷所述服務(wù)進(jìn)程不存在請(qǐng)求后,關(guān)閉所述服務(wù)進(jìn)程;服務(wù)模塊,用于針對(duì)所述目標(biāo)接口的數(shù)據(jù),采用所述服務(wù)子進(jìn)程調(diào)用所述綁定的socket。
可選的,其中,還包括:庫變更模塊,用于預(yù)先變更庫代碼,以使進(jìn)程支持傳入socket,其中,所述進(jìn)程包括服務(wù)進(jìn)程和服務(wù)子進(jìn)程;封裝變更的庫代碼,得到對(duì)應(yīng)支持進(jìn)程熱重啟的庫文件。
可選的,其中,還包括:創(chuàng)建模塊,用于依據(jù)所述支持進(jìn)程熱重啟的庫文件創(chuàng)建服務(wù)進(jìn)程。
可選的,其中,還包括:變量添加模塊,用于將所述綁定的socket添加到環(huán)境變量中。
可選的,所述傳入模塊,用于向所述服務(wù)子進(jìn)程傳入所述環(huán)境變量,以傳入所述綁定的socket。
可選的,所述服務(wù)模塊,用于在所述目標(biāo)接口處,判斷所述服務(wù)子進(jìn)程的環(huán)境變量中是否存在所述綁定的socket;若存在所述綁定的socket,采用所述服務(wù)子進(jìn)程調(diào)用所述綁定的socket。
可選的,其中,還包括:創(chuàng)建模塊,用于依據(jù)接口請(qǐng)求創(chuàng)建與目標(biāo)接口綁定的socket。
服務(wù)進(jìn)程依據(jù)重啟指令,獲取與目標(biāo)接口綁定的socket,然后創(chuàng)建與所述服務(wù)進(jìn)程相同的服務(wù)子進(jìn)程,對(duì)所述服務(wù)子進(jìn)程傳入所述綁定的socket,通過服務(wù)子進(jìn)程接替服務(wù)進(jìn)程提供對(duì)目標(biāo)接口的服務(wù),在判斷所述服務(wù)進(jìn)程不存在請(qǐng)求后,關(guān)閉所述服務(wù)進(jìn)程,采用服務(wù)子進(jìn)程調(diào)用所述綁定的socket提供針對(duì)目標(biāo)接口的服務(wù),從而實(shí)現(xiàn)對(duì)服務(wù)的熱重啟,能夠在不中斷服務(wù)的情況下重啟服務(wù),操作簡單,無需使用備份服務(wù)器,服務(wù)升級(jí)便捷。
上述說明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說明書的內(nèi)容予以實(shí)施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點(diǎn)能夠更明顯易懂,以下特舉本發(fā)明的具體實(shí)施方式。
附圖說明
通過閱讀下文優(yōu)選實(shí)施方式的詳細(xì)描述,各種其他的優(yōu)點(diǎn)和益處對(duì)于本領(lǐng)域普通技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實(shí)施方式的目的,而并不認(rèn)為是對(duì)本發(fā)明的限制。而且在整個(gè)附圖中,用相同的參考符號(hào)表示相同的部件。在附圖中:
圖1示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種服務(wù)的重啟方法實(shí)施例的步驟流程圖;
圖2示出了根據(jù)本發(fā)明另一個(gè)實(shí)施例的一種服務(wù)的重啟方法實(shí)施例的步驟流程圖;
圖3示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種服務(wù)的重啟裝置實(shí)施例的結(jié)構(gòu)框圖;以及
圖4示出了根據(jù)本發(fā)明另一個(gè)實(shí)施例的一種服務(wù)的重啟裝置實(shí)施例的結(jié)構(gòu)框圖。
具體實(shí)施方式
下面將參照附圖更詳細(xì)地描述本公開的示例性實(shí)施例。雖然附圖中顯示了本公開的示例性實(shí)施例,然而應(yīng)當(dāng)理解,可以以各種形式實(shí)現(xiàn)本公開而不應(yīng)被這里闡述的實(shí)施例所限制。相反,提供這些實(shí)施例是為了能夠更透徹地理解本公開,并且能夠?qū)⒈竟_的范圍完整的傳達(dá)給本領(lǐng)域的技術(shù)人員。
為了解決采用備份的方式部署和更新服務(wù)service時(shí),每次更新服務(wù)操作繁瑣,升級(jí)部署不便捷等至少一個(gè)問題,本發(fā)明實(shí)施例對(duì)服務(wù)進(jìn)行熱重啟,即在不中斷服務(wù)的情況下重啟服務(wù),無需部署備份服務(wù)器,操作簡單,升級(jí)便捷。
參照?qǐng)D1,示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種服務(wù)的重啟方法實(shí)施例的步驟流程圖,具體可以包括如下步驟:
步驟102,服務(wù)進(jìn)程依據(jù)重啟指令,獲取與目標(biāo)接口綁定的套接字socket。
本實(shí)施例中,啟動(dòng)一服務(wù)進(jìn)程service,建立socket與目標(biāo)接口綁定,提供針對(duì)該目標(biāo)接口的服務(wù)。設(shè)置服務(wù)進(jìn)程service能夠響應(yīng)特定信號(hào)然后執(zhí)行熱重啟,其中,特定信號(hào)包括重啟指令,在發(fā)出重啟指令后,服務(wù)進(jìn)程service依據(jù)該重啟指令,獲取該服務(wù)進(jìn)程service對(duì)應(yīng)與目標(biāo)接口綁定的socket。其中,socket用于描述IP地址和端口,是一個(gè)通信鏈的句柄。
步驟104,創(chuàng)建與所述服務(wù)進(jìn)程相同的服務(wù)子進(jìn)程,對(duì)所述服務(wù)子進(jìn)程傳入所述綁定的socket。
依據(jù)重啟指令進(jìn)行熱重啟的過程中,為保證服務(wù)不中斷,可以建立一個(gè)與所述服務(wù)進(jìn)程相同的服務(wù)子進(jìn)程,對(duì)所述服務(wù)子進(jìn)程傳入所述綁定的socket,即在該服務(wù)子進(jìn)程傳入socket,從而能夠提供與目標(biāo)接口綁定的socket,提供支持該目標(biāo)接口的服務(wù)。從而服務(wù)進(jìn)程上正在執(zhí)行的請(qǐng)求繼續(xù)執(zhí)行,而之后對(duì)于該目標(biāo)接口的請(qǐng)求,由傳入的socket提供給服務(wù)子進(jìn)程執(zhí)行。
步驟106,判斷所述服務(wù)進(jìn)程不存在請(qǐng)求后,關(guān)閉所述服務(wù)進(jìn)程。
步驟108,針對(duì)所述目標(biāo)接口的數(shù)據(jù),采用所述服務(wù)子進(jìn)程調(diào)用所述綁定的socket。
服務(wù)進(jìn)程然后對(duì)于服務(wù)進(jìn)程上的請(qǐng)求進(jìn)行監(jiān)聽,當(dāng)監(jiān)聽到服務(wù)進(jìn)程不存在請(qǐng)求后,可以關(guān)閉該服務(wù)進(jìn)程,服務(wù)進(jìn)程不再提供服務(wù),針對(duì)所述目標(biāo)接口的數(shù)據(jù),采用所述服務(wù)子進(jìn)程調(diào)用所述綁定的socket,即由傳入的socket提供給服務(wù)子進(jìn)程,采用服務(wù)子進(jìn)程進(jìn)行處理,繼續(xù)提供對(duì)于目標(biāo)接口的服務(wù),完成對(duì)于服務(wù)的熱重啟。
綜上,服務(wù)進(jìn)程依據(jù)重啟指令,獲取與目標(biāo)接口綁定的socket,然后創(chuàng)建與所述服務(wù)進(jìn)程相同的服務(wù)子進(jìn)程,對(duì)所述服務(wù)子進(jìn)程傳入所述綁定的socket,通過服務(wù)子進(jìn)程接替服務(wù)進(jìn)程提供對(duì)目標(biāo)接口的服務(wù),在判斷所述服務(wù)進(jìn)程不存在請(qǐng)求后,關(guān)閉所述服務(wù)進(jìn)程,采用服務(wù)子進(jìn)程調(diào)用所述綁定的socket提供針對(duì)目標(biāo)接口的服務(wù),從而實(shí)現(xiàn)對(duì)服務(wù)的熱重啟,能夠在不中斷服務(wù)的情況下重啟服務(wù),操作簡單,無需使用備份服務(wù)器,服務(wù)升級(jí)便捷。
本發(fā)明實(shí)施例中以Thrift為了進(jìn)行論述。其中,thrift是一個(gè)軟件框架,可用來進(jìn)行可擴(kuò)展且跨語言的服務(wù)的開發(fā)。它結(jié)合了功能強(qiáng)大的軟件堆棧和代碼生成引擎,以構(gòu)建在C++,Java,Go,Python,PHP,Ruby,Erlang,Perl,Haskell,C#,Cocoa,JavaScript,Node.js,Smalltalk,and OCaml這些編程語言間無縫結(jié)合的、高效的服務(wù)。Thrift允許定義一個(gè)簡單的定義文件中的數(shù)據(jù)類型和服務(wù)接口,以作為輸入文件,編譯器生成代碼用來方便地生成RPC客戶端和服務(wù)器通信的無縫跨編程語言?;赥hrift配置服務(wù)熱重啟,具體如下:
參照?qǐng)D2,示出了根據(jù)本發(fā)明另一個(gè)實(shí)施例的一種服務(wù)的重啟方法實(shí)施例的步驟流程圖,具體可以包括如下步驟:
步驟202,預(yù)先變更庫代碼,以使進(jìn)程支持傳入socket。
步驟204,封裝變更的庫代碼,得到對(duì)應(yīng)支持進(jìn)程熱重啟的庫文件。
本實(shí)施例中,服務(wù)的軟件框架不只是傳入socket直接使用,即通常僅支持建立socket后使用,而不能將已經(jīng)建立的socket傳入來使用。因此本實(shí)施例更改軟件框架的庫代碼,使得該軟件框架的進(jìn)程能夠支持傳入socket直接使用。在變更庫代碼后重新封裝變更的庫代碼,得到支持傳入socket直接使用的庫代碼,從而能夠?qū)崿F(xiàn)通過進(jìn)程傳入socket來支持進(jìn)程熱重啟的庫文件。其中,所述進(jìn)程包括服務(wù)進(jìn)程和服務(wù)子進(jìn)程。
例如,thrift server不支持傳入一個(gè)socket直接使用,假設(shè)服務(wù)是使用C++來完成的,則使用的是thrift的C++庫。由于thrift server不支持傳入一個(gè)socket直接使用,因此可以改造thrift庫代碼使其支持傳入socket直接使用。再將改造的庫代碼進(jìn)行封裝,得到一個(gè)能夠支持熱重啟庫文件。本實(shí)施例中,熱重啟可保持端口能持續(xù)不斷的提供服務(wù),且進(jìn)程能夠響應(yīng)特定信號(hào)然后執(zhí)行熱重啟過程。
步驟206,依據(jù)所述支持進(jìn)程熱重啟的庫文件創(chuàng)建服務(wù)進(jìn)程。
步驟208,依據(jù)接口請(qǐng)求創(chuàng)建與目標(biāo)接口綁定的socket。
在變更庫代碼重新封裝庫文件后,基于該庫文件創(chuàng)建服務(wù)進(jìn)程,服務(wù)進(jìn)程能夠提供接口服務(wù),因此對(duì)于目標(biāo)接口的接口請(qǐng)求,服務(wù)進(jìn)程可以創(chuàng)建socket,將該socket與目標(biāo)接口綁定。
步驟210,服務(wù)進(jìn)程依據(jù)重啟指令,將所述綁定的socket添加到環(huán)境變量中。
步驟212,創(chuàng)建與所述服務(wù)進(jìn)程相同的服務(wù)子進(jìn)程。
步驟214,向所述服務(wù)子進(jìn)程傳入所述環(huán)境變量,以傳入所述綁定的socket。
在需要重啟服務(wù)時(shí),發(fā)送重啟指令,服務(wù)進(jìn)程依據(jù)重啟指令確定與目標(biāo)接口綁定的socket,將所述綁定的socket添加到環(huán)境變量中,環(huán)境變量(environment variables)即系統(tǒng)、進(jìn)程的相關(guān)參數(shù)。并且依據(jù)重啟指令創(chuàng)建與所述服務(wù)進(jìn)程相同的服務(wù)子進(jìn)程,例如可以通過fork函數(shù)創(chuàng)建一個(gè)與所述服務(wù)進(jìn)程相同的服務(wù)子進(jìn)程。然后向該服務(wù)子進(jìn)程傳入所述環(huán)境變量,即向服務(wù)子進(jìn)程傳入所述綁定的socket,以提供針對(duì)目標(biāo)接口的服務(wù)。
其中,一個(gè)進(jìn)程可包括代碼、數(shù)據(jù)及分配給進(jìn)程的資源等,fork函數(shù)可通過系統(tǒng)調(diào)用創(chuàng)建一個(gè)與原來進(jìn)程幾乎完全相同的進(jìn)程,從而兩個(gè)進(jìn)程可執(zhí)行相同的操作,當(dāng)然若初始參數(shù)或者傳入的變量不同,兩個(gè)進(jìn)程也可執(zhí)行不同的操作。本實(shí)施例中通過fork函數(shù)創(chuàng)建服務(wù)子進(jìn)程,在服務(wù)子進(jìn)程中裝載該服務(wù)的二進(jìn)制并傳入包含socket的環(huán)境變量,從而使得服務(wù)子進(jìn)程能夠執(zhí)行與服務(wù)進(jìn)程相同的操作,均基于綁定的socket提供針對(duì)目標(biāo)接口的服務(wù)。
例如對(duì)于thrift的服務(wù)進(jìn)程,獲取當(dāng)前服務(wù)的socket,保存到環(huán)境變量中,然后執(zhí)行fork創(chuàng)建一個(gè)服務(wù)子進(jìn)程,在服務(wù)子進(jìn)程中執(zhí)行execve裝載服務(wù)程序的二進(jìn)制,同時(shí)傳入環(huán)境變量,使得服務(wù)子進(jìn)程能夠執(zhí)行與服務(wù)進(jìn)程相同的操作,均基于綁定的socket提供針對(duì)目標(biāo)接口的服務(wù)。
步驟216,判斷所述服務(wù)進(jìn)程是否存在請(qǐng)求。
在服務(wù)子進(jìn)程傳入包含socket的環(huán)境變量,能夠提供針對(duì)目標(biāo)接口的服務(wù)后,對(duì)于該目標(biāo)接口的新請(qǐng)求由服務(wù)子進(jìn)程提供服務(wù),而服務(wù)進(jìn)程已在執(zhí)行的請(qǐng)求繼續(xù)執(zhí)行,直到服務(wù)進(jìn)程的請(qǐng)求執(zhí)行完畢才能關(guān)閉該服務(wù)進(jìn)程,完全由服務(wù)子進(jìn)程提供服務(wù)。因此要判斷所述服務(wù)進(jìn)程是否存在請(qǐng)求;若服務(wù)進(jìn)程存在請(qǐng)求,則返回步驟216繼續(xù)判斷;若服務(wù)進(jìn)程不存在請(qǐng)求,執(zhí)行步驟218。
步驟218,關(guān)閉所述服務(wù)進(jìn)程。
判斷所述服務(wù)進(jìn)程不存在請(qǐng)求后,關(guān)閉所述服務(wù)進(jìn)程,即退出該服務(wù)進(jìn)程。
步驟220,在所述目標(biāo)接口處,判斷是否存在所述綁定的socket。
對(duì)于接口請(qǐng)求,確定接口請(qǐng)求對(duì)應(yīng)目標(biāo)接口,在目標(biāo)接口處先判斷是否存在該目標(biāo)接口綁定給的socket,如果存在則使用該socket對(duì)應(yīng)服務(wù)進(jìn)程提供服務(wù);若不存在則執(zhí)行步驟208創(chuàng)建與目標(biāo)接口綁定的socket。
因此對(duì)于服務(wù)子進(jìn)程通過傳入環(huán)境變量以傳入socket,則可以在目標(biāo)接口處判斷所述服務(wù)子進(jìn)程的環(huán)境變量中是否存在所述綁定的socket;若服務(wù)子進(jìn)程的環(huán)境變量中存在所述綁定的socket,則執(zhí)行步驟222;若不存在與該目標(biāo)接口綁定的socket,則執(zhí)行步驟208創(chuàng)建與目標(biāo)接口綁定的socket。
步驟222,采用所述服務(wù)子進(jìn)程調(diào)用所述綁定的socket。
若服務(wù)子進(jìn)程的環(huán)境變量中存在所述綁定的socket,采用所述服務(wù)子進(jìn)程調(diào)用所述綁定的socket,即由服務(wù)子進(jìn)程采用綁定的socket提供目標(biāo)接口的服務(wù)。
可見,在服務(wù)進(jìn)程沒有請(qǐng)求后退出該服務(wù)進(jìn)程,由服務(wù)子進(jìn)程提供目標(biāo)接口的服務(wù),實(shí)現(xiàn)對(duì)于服務(wù)的熱重啟。因此可在執(zhí)行入口(如目標(biāo)接口)處判斷環(huán)境變量中是否有socket,如果有則直接使用這個(gè)socket進(jìn)行服務(wù),從而服務(wù)子進(jìn)程在執(zhí)行時(shí),進(jìn)入入口就能使用父進(jìn)程傳入的socket,實(shí)現(xiàn)了服務(wù)的不間斷。
從而實(shí)現(xiàn)了thrift服務(wù)的熱重啟,保證服務(wù)在更新的時(shí)候也不會(huì)中斷服務(wù),簡化了部署與運(yùn)維thrift服務(wù)。
對(duì)于方法實(shí)施例,為了簡單描述,故將其都表述為一系列的動(dòng)作組合,但是本領(lǐng)域技術(shù)人員應(yīng)該知悉,本發(fā)明實(shí)施例并不受所描述的動(dòng)作順序的限制,因?yàn)橐罁?jù)本發(fā)明實(shí)施例,某些步驟可以采用其他順序或者同時(shí)進(jìn)行。其次,本領(lǐng)域技術(shù)人員也應(yīng)該知悉,說明書中所描述的實(shí)施例均屬于優(yōu)選實(shí)施例,所涉及的動(dòng)作并不一定是本發(fā)明實(shí)施例所必須的。
在上述實(shí)施例的基礎(chǔ)上,本實(shí)施例還提供了一種服務(wù)的重啟裝置。
參照?qǐng)D3,示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種服務(wù)的重啟裝置實(shí)施例的結(jié)構(gòu)框圖,具體可以包括如下模塊:
獲取模塊302,用于服務(wù)進(jìn)程依據(jù)重啟指令,獲取與目標(biāo)接口綁定的套接字socket。
傳入模塊304,用于創(chuàng)建與所述服務(wù)進(jìn)程相同的服務(wù)子進(jìn)程,對(duì)所述服務(wù)子進(jìn)程傳入所述綁定的socket。
關(guān)閉模塊306,用于判斷所述服務(wù)進(jìn)程不存在請(qǐng)求后,關(guān)閉所述服務(wù)進(jìn)程。
服務(wù)模塊308,用于針對(duì)所述目標(biāo)接口的數(shù)據(jù),采用所述服務(wù)子進(jìn)程調(diào)用所述綁定的socket。
綜上,服務(wù)進(jìn)程依據(jù)重啟指令,獲取與目標(biāo)接口綁定的socket,然后創(chuàng)建與所述服務(wù)進(jìn)程相同的服務(wù)子進(jìn)程,對(duì)所述服務(wù)子進(jìn)程傳入所述綁定的socket,通過服務(wù)子進(jìn)程接替服務(wù)進(jìn)程提供對(duì)目標(biāo)接口的服務(wù),在判斷所述服務(wù)進(jìn)程不存在請(qǐng)求后,關(guān)閉所述服務(wù)進(jìn)程,采用服務(wù)子進(jìn)程調(diào)用所述綁定的socket提供針對(duì)目標(biāo)接口的服務(wù),從而實(shí)現(xiàn)對(duì)服務(wù)的熱重啟,能夠在不中斷服務(wù)的情況下重啟服務(wù),操作簡單,無需使用備份服務(wù)器,服務(wù)升級(jí)便捷。
參照?qǐng)D4,示出了根據(jù)本發(fā)明另一個(gè)實(shí)施例的一種服務(wù)的重啟裝置實(shí)施例的結(jié)構(gòu)框圖,具體可以包括如下模塊:
庫變更模塊310,用于預(yù)先變更庫代碼,以使進(jìn)程支持傳入socket,其中,所述進(jìn)程包括服務(wù)進(jìn)程和服務(wù)子進(jìn)程;封裝變更的庫代碼,得到對(duì)應(yīng)支持進(jìn)程熱重啟的庫文件。
創(chuàng)建模塊312,用于依據(jù)所述支持進(jìn)程熱重啟的庫文件創(chuàng)建服務(wù)進(jìn)程;依據(jù)接口請(qǐng)求創(chuàng)建與目標(biāo)接口綁定的socket。
獲取模塊302,用于服務(wù)進(jìn)程依據(jù)重啟指令,獲取與目標(biāo)接口綁定的套接字socket。
變量添加模塊314,用于將所述綁定的socket添加到環(huán)境變量中。
傳入模塊304,用于創(chuàng)建與所述服務(wù)進(jìn)程相同的服務(wù)子進(jìn)程;向所述服務(wù)子進(jìn)程傳入所述環(huán)境變量,以傳入所述綁定的socket。
關(guān)閉模塊306,用于判斷所述服務(wù)進(jìn)程不存在請(qǐng)求后,關(guān)閉所述服務(wù)進(jìn)程。
服務(wù)模塊308,用于針對(duì)所述目標(biāo)接口的數(shù)據(jù),采用所述服務(wù)子進(jìn)程調(diào)用所述綁定的socket。
其中,所述服務(wù)模塊,用于在所述目標(biāo)接口處,判斷所述服務(wù)子進(jìn)程的環(huán)境變量中是否存在所述綁定的socket;若存在所述綁定的socket,采用所述服務(wù)子進(jìn)程調(diào)用所述綁定的socket。
可見,在服務(wù)進(jìn)程沒有請(qǐng)求后退出該服務(wù)進(jìn)程,由服務(wù)子進(jìn)程提供目標(biāo)接口的服務(wù),實(shí)現(xiàn)對(duì)于服務(wù)的熱重啟。因此可在執(zhí)行入口(如目標(biāo)接口)處判斷環(huán)境變量中是否有socket,如果有則直接使用這個(gè)socket進(jìn)行服務(wù),從而服務(wù)子進(jìn)程在執(zhí)行時(shí),進(jìn)入入口就能使用父進(jìn)程傳入的socket,實(shí)現(xiàn)了服務(wù)的不間斷。
從而實(shí)現(xiàn)了thrift服務(wù)的熱重啟,保證服務(wù)在更新的時(shí)候也不會(huì)中斷服務(wù),簡化了部署與運(yùn)維thrift服務(wù)。
對(duì)于裝置實(shí)施例而言,由于其與方法實(shí)施例基本相似,所以描述的比較簡單,相關(guān)之處參見方法實(shí)施例的部分說明即可。
在此提供的算法和顯示不與任何特定計(jì)算機(jī)、虛擬系統(tǒng)或者其它設(shè)備固有相關(guān)。各種通用系統(tǒng)也可以與基于在此的示教一起使用。根據(jù)上面的描述,構(gòu)造這類系統(tǒng)所要求的結(jié)構(gòu)是顯而易見的。此外,本發(fā)明也不針對(duì)任何特定編程語言。應(yīng)當(dāng)明白,可以利用各種編程語言實(shí)現(xiàn)在此描述的本發(fā)明的內(nèi)容,并且上面對(duì)特定語言所做的描述是為了披露本發(fā)明的最佳實(shí)施方式。
在此處所提供的說明書中,說明了大量具體細(xì)節(jié)。然而,能夠理解,本發(fā)明的實(shí)施例可以在沒有這些具體細(xì)節(jié)的情況下實(shí)踐。在一些實(shí)例中,并未詳細(xì)示出公知的方法、結(jié)構(gòu)和技術(shù),以便不模糊對(duì)本說明書的理解。
類似地,應(yīng)當(dāng)理解,為了精簡本公開并幫助理解各個(gè)發(fā)明方面中的一個(gè)或多個(gè),在上面對(duì)本發(fā)明的示例性實(shí)施例的描述中,本發(fā)明的各個(gè)特征有時(shí)被一起分組到單個(gè)實(shí)施例、圖、或者對(duì)其的描述中。然而,并不應(yīng)將該公開的方法解釋成反映如下意圖:即所要求保護(hù)的本發(fā)明要求比在每個(gè)權(quán)利要求中所明確記載的特征更多的特征。更確切地說,如下面的權(quán)利要求書所反映的那樣,發(fā)明方面在于少于前面公開的單個(gè)實(shí)施例的所有特征。因此,遵循具體實(shí)施方式的權(quán)利要求書由此明確地并入該具體實(shí)施方式,其中每個(gè)權(quán)利要求本身都作為本發(fā)明的單獨(dú)實(shí)施例。
本領(lǐng)域那些技術(shù)人員可以理解,可以對(duì)實(shí)施例中的設(shè)備中的模塊進(jìn)行自適應(yīng)性地改變并且把它們?cè)O(shè)置在與該實(shí)施例不同的一個(gè)或多個(gè)設(shè)備中。可以把實(shí)施例中的模塊或單元或組件組合成一個(gè)模塊或單元或組件,以及此外可以把它們分成多個(gè)子模塊或子單元或子組件。除了這樣的特征和/或過程或者單元中的至少一些是相互排斥之外,可以采用任何組合對(duì)本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的所有特征以及如此公開的任何方法或者設(shè)備的所有過程或單元進(jìn)行組合。除非另外明確陳述,本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的每個(gè)特征可以由提供相同、等同或相似目的的替代特征來代替。
此外,本領(lǐng)域的技術(shù)人員能夠理解,盡管在此所述的一些實(shí)施例包括其它實(shí)施例中所包括的某些特征而不是其它特征,但是不同實(shí)施例的特征的組合意味著處于本發(fā)明的范圍之內(nèi)并且形成不同的實(shí)施例。例如,在下面的權(quán)利要求書中,所要求保護(hù)的實(shí)施例的任意之一都可以以任意的組合方式來使用。
本發(fā)明的各個(gè)部件實(shí)施例可以以硬件實(shí)現(xiàn),或者以在一個(gè)或者多個(gè)處理器上運(yùn)行的軟件模塊實(shí)現(xiàn),或者以它們的組合實(shí)現(xiàn)。本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,可以在實(shí)踐中使用微處理器或者數(shù)字信號(hào)處理器(DSP)來實(shí)現(xiàn)根據(jù)本發(fā)明實(shí)施例的服務(wù)的重啟方法和裝置設(shè)備中的一些或者全部部件的一些或者全部功能。本發(fā)明還可以實(shí)現(xiàn)為用于執(zhí)行這里所描述的方法的一部分或者全部的設(shè)備或者裝置程序(例如,計(jì)算機(jī)程序和計(jì)算機(jī)程序產(chǎn)品)。這樣的實(shí)現(xiàn)本發(fā)明的程序可以存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)上,或者可以具有一個(gè)或者多個(gè)信號(hào)的形式。這樣的信號(hào)可以從因特網(wǎng)網(wǎng)站上下載得到,或者在載體信號(hào)上提供,或者以任何其他形式提供。
應(yīng)該注意的是上述實(shí)施例對(duì)本發(fā)明進(jìn)行說明而不是對(duì)本發(fā)明進(jìn)行限制,并且本領(lǐng)域技術(shù)人員在不脫離所附權(quán)利要求的范圍的情況下可設(shè)計(jì)出替換實(shí)施例。在權(quán)利要求中,不應(yīng)將位于括號(hào)之間的任何參考符號(hào)構(gòu)造成對(duì)權(quán)利要求的限制。單詞“包含”不排除存在未列在權(quán)利要求中的元件或步驟。位于元件之前的單詞“一”或“一個(gè)”不排除存在多個(gè)這樣的元件。本發(fā)明可以借助于包括有若干不同元件的硬件以及借助于適當(dāng)編程的計(jì)算機(jī)來實(shí)現(xiàn)。在列舉了若干裝置的單元權(quán)利要求中,這些裝置中的若干個(gè)可以是通過同一個(gè)硬件項(xiàng)來具體體現(xiàn)。單詞第一、第二、以及第三等的使用不表示任何順序??蓪⑦@些單詞解釋為名稱。
本發(fā)明公開了A1、一種服務(wù)的重啟方法,包括:
服務(wù)進(jìn)程依據(jù)重啟指令,獲取與目標(biāo)接口綁定的套接字socket;
創(chuàng)建與所述服務(wù)進(jìn)程相同的服務(wù)子進(jìn)程,對(duì)所述服務(wù)子進(jìn)程傳入所述綁定的socket;
判斷所述服務(wù)進(jìn)程不存在請(qǐng)求后,關(guān)閉所述服務(wù)進(jìn)程;
針對(duì)所述目標(biāo)接口的數(shù)據(jù),采用所述服務(wù)子進(jìn)程調(diào)用所述綁定的socket。
A2、如A1所述的方法,其中,還包括:
預(yù)先變更庫代碼,以使進(jìn)程支持傳入socket,其中,所述進(jìn)程包括服務(wù)進(jìn)程和服務(wù)子進(jìn)程;
封裝變更的庫代碼,得到對(duì)應(yīng)支持進(jìn)程熱重啟的庫文件。
A3、如A2所述的方法,其中,還包括:
依據(jù)所述支持進(jìn)程熱重啟的庫文件創(chuàng)建服務(wù)進(jìn)程。
A4、如A1所述的方法,其中,獲取與目標(biāo)接口綁定的socket之后,還包括:
將所述綁定的socket添加到環(huán)境變量中。
A5、如A4所述的方法,其中,對(duì)所述服務(wù)子進(jìn)程傳入所述綁定的socket,包括:
向所述服務(wù)子進(jìn)程傳入所述環(huán)境變量,以傳入所述綁定的socket。
A6、如A5所述的方法,其中,針對(duì)所述目標(biāo)接口的數(shù)據(jù),采用所述服務(wù)子進(jìn)程調(diào)用所述綁定的socket,包括:
在所述目標(biāo)接口處,判斷所述服務(wù)子進(jìn)程的環(huán)境變量中是否存在所述綁定的socket;
若存在所述綁定的socket,采用所述服務(wù)子進(jìn)程調(diào)用所述綁定的socket。
A7、如A1所述的方法,其中,還包括:
依據(jù)接口請(qǐng)求創(chuàng)建與目標(biāo)接口綁定的socket。
本發(fā)明實(shí)施例還提供了B8、一種服務(wù)的重啟裝置,包括:
獲取模塊,用于服務(wù)進(jìn)程依據(jù)重啟指令,獲取與目標(biāo)接口綁定的套接字socket;
傳入模塊,用于創(chuàng)建與所述服務(wù)進(jìn)程相同的服務(wù)子進(jìn)程,對(duì)所述服務(wù)子進(jìn)程傳入所述綁定的socket;
關(guān)閉模塊,用于判斷所述服務(wù)進(jìn)程不存在請(qǐng)求后,關(guān)閉所述服務(wù)進(jìn)程;
服務(wù)模塊,用于針對(duì)所述目標(biāo)接口的數(shù)據(jù),采用所述服務(wù)子進(jìn)程調(diào)用所述綁定的socket。
B9、如B8所述的裝置,其中,還包括:
庫變更模塊,用于預(yù)先變更庫代碼,以使進(jìn)程支持傳入socket,其中,所述進(jìn)程包括服務(wù)進(jìn)程和服務(wù)子進(jìn)程;封裝變更的庫代碼,得到對(duì)應(yīng)支持進(jìn)程熱重啟的庫文件。
B10、如B9所述的裝置,其中,還包括:
創(chuàng)建模塊,用于依據(jù)所述支持進(jìn)程熱重啟的庫文件創(chuàng)建服務(wù)進(jìn)程。
B11、如B8所述的裝置,其中,還包括:
變量添加模塊,用于將所述綁定的socket添加到環(huán)境變量中。
B12、如B11所述的裝置,其中,
所述傳入模塊,用于向所述服務(wù)子進(jìn)程傳入所述環(huán)境變量,以傳入所述綁定的socket。
B13、如B12所述的裝置,其中,
所述服務(wù)模塊,用于在所述目標(biāo)接口處,判斷所述服務(wù)子進(jìn)程的環(huán)境變量中是否存在所述綁定的socket;若存在所述綁定的socket,采用所述服務(wù)子進(jìn)程調(diào)用所述綁定的socket。
B14、如B8所述的裝置,其中,還包括:
創(chuàng)建模塊,用于依據(jù)接口請(qǐng)求創(chuàng)建與目標(biāo)接口綁定的socket。