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