天天看點

windows平台的分布式微服務解決方案(5)--Web服務/WebApi的負載均衡

本文技術點思路梳理:

建立Web服務組的通用基類“接口”。并在該“接口”上附加ServiceContract、OperationContract、WebInvoke三屬性。

建立WCF服務并實作上述“接口”。并在Web.config中添加<services>與<endpointBehaviors>兩項配置,讓WCF服務兼具Web服務的特性。

把上述Web服務分别部署在網絡上多個不同的地方,形成“Web服務組”。

通過DeveloperSharp.xml來配置“Web服務組”的負載均衡政策。

建立用戶端,在其App.config/Web.config中添加連結DeveloperSharp.xml的appSettings節點。再在代碼中建立基于DeveloperSharp.dll的“Web服務負載均衡調用”工具,并通過該工具調用遠端的Web服務。

【要點綜述1】:為了示範Web服務的負載均衡,本文會建立3個形式一緻的web服務(或者說,建立1個web服務但分别拷貝部署在3個不同的位址),然後在用戶端建立一個代理以“負載均衡”的算法形式遠端調用這3個web服務。

【要點綜述2】:為了實作“統一/透明”的調用形式連接配接“web服務端”與“用戶端”兩者,一個居中的“接口”類是必須建立的,且所有遠端web服務需要繼承此接口。

【要點綜述3】:Web Api是一個經典的http服務提供形式,WCF也是一個經典的兩端通信模式,本文還将會極巧妙的整合這兩者,讓一個服務一次編寫同時具備Web Api與WCF兩者的特性。

我們首先在Visual Studio中建立第一個名字叫“YZZ.Interface”的解決方案+類庫工程,并在此工程中建立“IBase接口”與“Person實體類”,代碼分别如下:

IBase接口:

Person實體類:

如上代碼所示,IBase接口中定義了一個通過年齡來做權限判斷的AccessRight方法,并在該方法上附加了OperationContract與WebInvoke兩個屬性。OperationContract這個屬性是用來給方法賦予WCF的特性,而WebInvoke這個屬性則是給方法賦予了Web Api的特性。

編譯該解決方案,獲得YZZ.Interface.dll。

然後,我們再在Visual Studio中建立第二個名字叫“YZZ.Service”的解決方案+WCF服務應用程式工程,并在此工程中建立名為“MyBaseService.svc”的WCF服務檔案,該檔案的背景代碼如下:

如上代碼所示,MyBaseService類實作了IBase接口中定義的AccessRight方法。

并且,此時我們還需要在此工程的Web.config中做如下兩項配置,才能使得WCF與Web Api的特性在AccessRight方法身上完全見效。

配置一:在<system.serviceModel>節點下添加如下配置

配置二:在<behaviors>節點下添加如下配置

如此一來,AccessRight方法就兼具了Web Api與WCF的雙重特性。其Web Api(Web服務)的調用路徑如下:

http://部署的伺服器路徑(ip+port)/MyBaseService.svc/webapi/AccessRight

為了示範Web服務的負載均衡的效果,現在我們把AccessRight方法的内容稍做修改成3個版本,分别編譯YZZ.Service工程後部署在3個不同的地方(如何部署請參考其它資料,這是基礎知識)。如下:

部署位址1:http://139.244.52.136:120/MyBaseService.svc

對應AccessRight代碼1:

部署位址2:http://139.244.52.136:220/MyBaseService.svc

對應AccessRight代碼2:

部署位址3:http://139.244.52.136:230/MyBaseService.svc

對應AccessRight代碼3:

當“接口”與其對應的“3個Web服務”全部準備就緒,我們最後就來建立一個用戶端以“負載均衡”的算法形式遠端調用這3個web服務。

我們再次打開Visual Studio,建立第三個名字叫“YZZ.Client”的解決方案+控制台工程。然後,我們做如下四步操作:

【第一步】:為工程添加DeveloperSharp.dll核心元件引用。并添加YZZ.Interface.dll的引用。

【第二步】:建立一個名為DeveloperSharp.xml的配置檔案,并在該檔案中設定如上3個web服務的負載均衡政策。檔案内容如下:

對此xml配置檔案說明如下:

(1)     每一個IService節點代表了一組Web服務,此節點的Id值(本文示例值是:YZZ.Interface.IBase)必須是這組Web服務的“基類接口”的完全限定名。

(2)     Service節點中的Weight屬性代表了使用權重。本文示例的3個服務的Weight值分别是100、100、100,則這3個服務的負載均衡使用配置設定比例将會是1:1:1。若把這三個值分别設定為100、50、50,則這3個服務的使用配置設定比例将會變為2:1:1。設定成你想要的比例吧。

(3)     Service節點中的Enable屬性代表了是否可用。true代表可用,false代表不可用。

【第三步】:在工程配置檔案App.config(或Web.config)中添加appSettings節點,節點内容如下:

其中,ConfigFile的設定是為了連結前述的DeveloperSharp.xml這個配置檔案。ErrorLog則是設定一個錯誤日志檔案。它們均需要設定為檔案的“絕對路徑”(此處使用“絕對路徑”而不是“相對路徑”,一是有利于安全性,二是有利于分布式部署)

【第四步】:在控制台應用類的代碼中,添加建立“Web服務”負載均衡調用的工具IUtility.GetService<T>(),并通過該工具調用遠端的Web服務,注意:核心代碼就一行而已!!此示例連續3次調用Web服務,看會顯示什麼結果。如下:

從以上示例代碼我們可以清晰的得知:IUtility.GetService<T>()就是實作負載均衡的關鍵所在。泛型T需要設定為被調用“Web服務組”的“基類接口”,而IUtility.GetService<T>()方法則會每次根據配置的負載均衡政策建立對應的遠端Web服務代理。

YZZ.Client控制台工程輸出顯示結果如下:

學生/員工

學生/員工1

學生/員工2

最後提示一點:若要把一組Web服務的負載均衡應用改為單Web服務應用,隻需要把DeveloperSharp.xml配置檔案中IService節點下的Service節點數量設定為一個即可實作。

後記:讀完本文,你有沒有發現,“微服務”中常用的注冊、發現、服務降級、等功能,往往可通過修改DeveloperSharp.xml這個配置檔案來實作?未完待續…

【本文采用.NET/C#語言撰寫,如需其它語言版本,請聯系作者索取。】

相關下載下傳:

Web服務的負載均衡-示例代碼(dp4-WebBalance.rar)

windows平台的分布式微服務解決方案(5)--Web服務/WebApi的負載均衡

如果文章對您有幫助,請點贊、收藏、關注、分享(原創内容,歡迎轉載,轉載請注明出處)

掃描左側二維碼可以聯系作者,收獲更多精華知識。

出處:https://www.cnblogs.com/DeveloperSharp/

官網:http://www.365ey.net/

本文采用「CC BY 4.0」知識共享協定進行許可,轉載請注明作者及出處。

繼續閱讀