由於希望使用Wcf作爲公司內的通訊框架,因此基於Wcf進行了一些擴展,主要的目的有以下幾個方面:
1) 希望減少客戶端調用的複雜度,調用方式簡化爲WcfServiceLocator.Create<ITestService>().Add(1,2)。不需要考慮:endpoint配置,信道創建,信道出問題等等問題。
2) 希望減少服務端配置的複雜度,沒有配置文件(或者說配置文件不需要更改),所有和服務相關的元數據處於數據庫中,這樣客戶端也沒有配置。
3) 有後臺來管理所有元數據的配置,並且可以在配置更改的時候通知相關的客戶端來重新建立信道,通知相關的服務端來重啓服務。
4) 進行簡單的路由功能,比如優先考慮IPC/TCP的信道而不是HTTP的信道,引用了高版本服務契約的客戶端優先訪問高版本服務契約的服務端。也就是說,在生產環境中,如果契約不兼容,可以再開一組高版本的服務端集羣,客戶端一個一個更新契約,一個一個引入高版本的服務端,等更新全部完成之後再撤去老版本的服務端。
5) 我非常重視橫切關注點,希望整個框架在下面幾個維度建立日誌:
5) 我非常重視橫切關注點,希望整個框架在下面幾個維度建立日誌:
A)調用信息,客戶端調用遠程方法結束後記錄,服務端完成遠程方法執行後記錄,可以記錄調用的方法名、服務名、所需時間、兩端版本、兩端機器名等信息
B)啓動信息,客戶端第一次建立信道工廠的時候記錄,服務端第一次啓動服務的時候記錄
C)消息信息,客戶端收到和發送的消息,服務端收到和發送的消息
D)異常信息,服務端產生的異常,客戶端收到的經過包裝的異常
6) 這些大量的日誌的記錄策略本身是在數據庫中配置的,日誌記錄到存儲中,使用Mongodb的Nosql技術
總之,一句話,服務的消費者和提供者只需要考慮怎麼去寫服務,其它的配置/部署/橫切等等基礎工作全都不需要考慮,配置集中對於部署有好處,各種具有獨立開關的日誌對於故障排查有好處。
整體結構如下:
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是框架主體,主要分爲四個部分: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是業務實現,只被服務端引用。
此文只是介紹一下基本的架構,後續的文章會介紹一些實現以及提供源代碼。