Wcf通訊基礎框架方案(一)——基本結構

 

由於希望使用Wcf作爲公司內的通訊框架,因此基於Wcf進行了一些擴展,主要的目的有以下幾個方面:

1) 希望減少客戶端調用的複雜度,調用方式簡化爲WcfServiceLocator.Create<ITestService>().Add(1,2)。不需要考慮:endpoint配置,信道創建,信道出問題等等問題。

2) 希望減少服務端配置的複雜度,沒有配置文件(或者說配置文件不需要更改),所有和服務相關的元數據處於數據庫中,這樣客戶端也沒有配置。

3) 有後臺來管理所有元數據的配置,並且可以在配置更改的時候通知相關的客戶端來重新建立信道,通知相關的服務端來重啓服務。

4) 進行簡單的路由功能,比如優先考慮IPC/TCP的信道而不是HTTP的信道,引用了高版本服務契約的客戶端優先訪問高版本服務契約的服務端。也就是說,在生產環境中,如果契約不兼容,可以再開一組高版本的服務端集羣,客戶端一個一個更新契約,一個一個引入高版本的服務端,等更新全部完成之後再撤去老版本的服務端。

5) 我非常重視橫切關注點,希望整個框架在下面幾個維度建立日誌:

 

5) 我非常重視橫切關注點,希望整個框架在下面幾個維度建立日誌:

image_thumb[6]

A)調用信息,客戶端調用遠程方法結束後記錄,服務端完成遠程方法執行後記錄,可以記錄調用的方法名、服務名、所需時間、兩端版本、兩端機器名等信息

B)啓動信息,客戶端第一次建立信道工廠的時候記錄,服務端第一次啓動服務的時候記錄

C)消息信息,客戶端收到和發送的消息,服務端收到和發送的消息

D)異常信息,服務端產生的異常,客戶端收到的經過包裝的異常

6) 這些大量的日誌的記錄策略本身是在數據庫中配置的,日誌記錄到存儲中,使用Mongodb的Nosql技術

總之,一句話,服務的消費者和提供者只需要考慮怎麼去寫服務,其它的配置/部署/橫切等等基礎工作全都不需要考慮,配置集中對於部署有好處,各種具有獨立開關的日誌對於故障排查有好處。

整體結構如下:

image_thumb[2]

1) ConfigCenter是一個網站,有兩個作用,一提供了配置的後臺,二是實現了IWcfConfigService,暴露出去,提供服務:

public interface IWcfConfigService
{
[OperationContract]
WcfService GetWcfService(string serviceType, string serviceContractVersion, string machineName); // 服務端的配置

[OperationContract]
WcfClientEndpoint GetWcfClientEndpoint(string serviceContractType, string serviceContractVersion, string machineName); //客戶端的端點

[OperationContract]
ClientLogConfig GetClientLogConfig(string serviceContractType); //客戶端的橫切配置

[OperationContract]
ServerLogConfig GetServerLogConfig(string serviceContractType, string machineName); //服務端的橫切配置
}

配置信息保存在MSSQL中,後臺提供配置。此外,在修改了配置之後,向Redis發佈消息,所有客戶端和服務端會訂閱這些消息。實現配置更改的發佈訂閱。

2) LogService也是一個網站,同樣是實現各種日誌的查看,以及提供IWcfLogService的實現:

public interface IWcfLogService
{
[OperationContract]
string Health(); //心跳,不可用的時候切換爲本地日誌服務

[OperationContract(Name = "LogList", IsOneWay = true)]
void Log(List<AbstractLogInfo> logInfo);

[OperationContract(Name = "LogOne", IsOneWay = true)]
void Log(AbstractLogInfo logInfo);
}

收集到日誌之後通過隊列,寫入Mongodb,後臺提供查看。
3) WcfExtension是框架主體,主要分爲四個部分:

image_thumb[8]

A) Client是所有和客戶端信道、代理、行爲相關的東西,實現調用的代理以及日誌的收集

B) Server是所有和服務端相關的東西,包括服務的IOC、各種日誌收集、異常處理、服務行爲等

C) Log包括IWcfLogService服務契約以及、數據契約和數據的收集模塊

D) Config包括IWcfConfigService服務契約、相關的數據契約(也包括框架本身的配置)

4)Clients.Console是控制檯方式的客戶端,生產環境很可能是網站。引用WcfExtension框架和業務服務契約。

5)Hosts.Console是控制檯方式的服務端,生產環境很可能是網站或Windows服務。引用WcfExtension框架、業務服務契約和實現。

6)WcfExtension.Services.Interface是業務契約,被客戶端和服務端引用。

7)WcfExtension.Services.Implementation是業務實現,只被服務端引用。

此文只是介紹一下基本的架構,後續的文章會介紹一些實現以及提供源代碼。

發佈了88 篇原創文章 · 獲贊 16 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章