技术分享 | 【构建服务端SDK】之连接中心统一调用SDK
源寶導(dǎo)讀:微服務(wù)架構(gòu)與傳統(tǒng)的單體式方案的最大不同是微服務(wù)將應(yīng)用的核心功能拆分成多項(xiàng)服務(wù)。每項(xiàng)服務(wù)可以單獨(dú)構(gòu)建和部署。服務(wù)之間需要互相通信。假設(shè)服務(wù)間每次通信都需要在調(diào)用方編碼操作,那么必定會(huì)增加很大的工作量,并且造成代碼冗余并且無(wú)法維護(hù)。
一、背景
集成平臺(tái)在整體架構(gòu)上抽象了連接中心核心服務(wù)來(lái)負(fù)責(zé)對(duì)外的服務(wù)通信。而在內(nèi)部的服務(wù)通信中。接口中心,事件中心,服務(wù)流等都需要在接收到外部請(qǐng)求和指令后將對(duì)應(yīng)的請(qǐng)求通過連接中心轉(zhuǎn)發(fā)到第三方服務(wù)/廠商。那么,在系統(tǒng)內(nèi)部就存在連接中心會(huì)不斷的被其他微服務(wù)調(diào)用。連接中心在被調(diào)用時(shí)目前需要經(jīng)歷如下幾個(gè)步驟,服務(wù)發(fā)現(xiàn)->負(fù)載均衡->APM->ZIP->身份認(rèn)證處理->服務(wù)質(zhì)量。如果這些步驟在此調(diào)用的時(shí)候都需要被重復(fù)編碼,那結(jié)果肯定是災(zāi)難性的。所以,我們給我們的核心服務(wù)連接中心提供了專門的調(diào)用SDK。
二、實(shí)現(xiàn)思路
2.1 行業(yè)實(shí)現(xiàn)思想
SDK定義:指一些被軟件工程師用于為特定的軟件包、軟件框架、硬件平臺(tái)及操作系統(tǒng)等創(chuàng)建應(yīng)用軟件的開發(fā)工具之集合。
在單體應(yīng)用早期,我們往往使用SDK封裝一些對(duì)外公開的功能代碼,這樣需要使用此功能就可以直接引用SDK,而不需要從頭開發(fā)。在SOA時(shí)代服務(wù)SDK的概念其實(shí)就已經(jīng)出現(xiàn)在我們使用的技術(shù)中。比如,WCF的客戶端在某種程度上也是一種服務(wù)SDK,使用客戶端可以快捷的調(diào)用WCF服務(wù)端。而通信,序列化,編碼等過程對(duì)我們來(lái)說(shuō)是隱式的。我們不需要去關(guān)心這些特定的實(shí)現(xiàn)細(xì)節(jié)。
現(xiàn)階段在對(duì)于行業(yè)而言,我們熟知的廠商提供了許多的軟件服務(wù)。比如百度的地圖服務(wù),訊飛的語(yǔ)音服務(wù)。從他們的技術(shù)文檔可以得知,基本上每個(gè)廠商在提供核心服務(wù)的同時(shí)。一定會(huì)給我們提供配套的服務(wù)SDK來(lái)簡(jiǎn)化我們調(diào)用服務(wù)的過程。在使用的過程中,我們往往只需要使用SDK進(jìn)行簡(jiǎn)單的配置。遵循這一思想,在核心服務(wù)就緒后,我們可以給核心服務(wù)配套對(duì)應(yīng)的SDK來(lái)簡(jiǎn)化外部調(diào)用的過程。
2.2 實(shí)現(xiàn)過程分析
整體架構(gòu)分析 :
遵循行業(yè)服務(wù)端SDK設(shè)計(jì)思想,我們需要給MIP核心服務(wù)連接中心設(shè)計(jì)配套的調(diào)用SDK。雖然連接中心不對(duì)外提供服務(wù),但是它在架構(gòu)中需要對(duì)其他微服務(wù)提供服務(wù)。對(duì)應(yīng)其他服務(wù)而言,也需要簡(jiǎn)化對(duì)連接中心的調(diào)用。
內(nèi)部服務(wù)只需要引用連接中心SDK,提供連接對(duì)應(yīng)的Code(標(biāo)識(shí))和Path(調(diào)用路徑)。就可以驅(qū)動(dòng)連接中心訪問第三方服務(wù)。
SDK功能分析:
支持鏈?zhǔn)秸{(diào)用,在調(diào)用鏈中現(xiàn)有業(yè)務(wù)需要支持鏈路追蹤,請(qǐng)求壓縮,服務(wù)發(fā)現(xiàn),負(fù)載均衡,身份認(rèn)證,服務(wù)質(zhì)量。
連接數(shù)據(jù)緩存,并實(shí)時(shí)更新最新連接數(shù)據(jù)。
內(nèi)部服務(wù)調(diào)用連接中心連接服務(wù)需要經(jīng)歷如圖所示步驟
緩存能力:在SDK加載啟動(dòng)時(shí),SDK應(yīng)具有實(shí)時(shí)更新連接數(shù)據(jù)的能力。
設(shè)計(jì)思路:通過上述分析得知,SDK支持的功能實(shí)際上是一個(gè)鏈?zhǔn)秸{(diào)用的過程。鏈中的處理中間件是根據(jù)需求組裝,改變HttpRequest。通過分析有我們有三種鏈?zhǔn)秸{(diào)用實(shí)現(xiàn)方案。
使用GOF設(shè)計(jì)模式中的責(zé)任鏈模式構(gòu)建鏈?zhǔn)秸{(diào)用通道。
模仿ASP.NET中間件模式,構(gòu)建鏈?zhǔn)秸{(diào)用通道。
使用DelegatingHandler為HttpClient創(chuàng)建附加消息處理程序從而構(gòu)建鏈?zhǔn)秸{(diào)用通道。
緩存設(shè)計(jì)思路:使用集成平臺(tái)中比較成熟的Consul Blocking Query組件實(shí)時(shí)監(jiān)控Consul中連接Flag的更改并實(shí)時(shí)獲取最新的連接配置數(shù)據(jù)。
三、實(shí)現(xiàn)方案
經(jīng)過對(duì)三種鏈?zhǔn)秸{(diào)用方案的對(duì)比,我們決定使用HttpClient的HttpHandler構(gòu)建連接中心SDK的鏈?zhǔn)酵ǖ?#xff0c;那么為什么使用DelegatingHandler呢?第一和第二種方案需要我們自己實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用的頭尾相連的過程。這個(gè)過程比較繁瑣而且維護(hù)成本較高。而HttpClient天生就支持創(chuàng)建附加消息處理程序。這樣HttpClient的調(diào)用鏈就是一個(gè)調(diào)用通道。我們可以根據(jù)需求在這個(gè)通道中插入自己的邏輯。
關(guān)鍵實(shí)現(xiàn)代碼
定義通道中的SDK功能實(shí)現(xiàn)
/// <summary>/// 連接中心SDK鏈路追蹤實(shí)現(xiàn)/// </summary>publicclassTracingHandler : DelegatingHandler{//聲明變量private readonly ConnectionProvider _provider;private readonly MipDeployConfigProvider _deployConfigProvider;protected static readonly DiagnosticListener _diagnosticListenerEvent = new DiagnosticListener(MIPDiagnosticStrings.EventActionInvokeListenerName);protected static readonly DiagnosticListener _diagnosticListenerApigateway = new DiagnosticListener(MIPDiagnosticStrings.ApiGatewayActionInvokeListenerName);protected static readonly DiagnosticListener _diagnosticListenerFlow = new DiagnosticListener(MIPDiagnosticStrings.Flow_ApiConnectionListenerName);/// <summary>/// 構(gòu)造函數(shù)/// </summary>/// <param name="provider">連接中心運(yùn)行時(shí)提供者</param>/// <param name="deployConfigProvider">部署信息提供者</param>public TracingHandler(ConnectionProvider provider, MipDeployConfigProvider deployConfigProvider){_provider = provider;_deployConfigProvider = deployConfigProvider;}/// <summary>/// 將MIP連接中心請(qǐng)求,相應(yīng)鏈路追蹤加入到HTTPClient擴(kuò)展通道中/// </summary>/// <param name="requestMessage">發(fā)送到連接API的Http請(qǐng)求</param>/// <param name="cancellationToken">令牌</param>/// <returns>連接中心API請(qǐng)求結(jié)果</returns>protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage requestMessage, CancellationToken cancellationToken){try{//省略代碼ExecuteHttpAfter(requestMessage, response, carrier);return response;}else{return await base.SendAsync(requestMessage, cancellationToken);}}catch (Exception ex){ExecuteHttpError(requestMessage, ex);throw;}} }編排通道調(diào)用鏈
public static class HttpHandleExtension{public static void AddHttpClinet(this IServiceCollection services){//編排HttpClient的調(diào)用通道鏈條services.TryAddTransient<ConnectivityTokenHandler>();services.TryAddTransient<AuthenticationHandler>();services.TryAddTransient<LoadBalancerHandler>();services.TryAddTransient<TracingHandler>();services.TryAddTransient<CompatibleGzipHandler>();services.TryAddTransient<PollyCircuitBreakingHandler>();services.TryAddTransient<WebRequestHandler>();services.TryAddSingleton<MipDeployConfigProvider>();AddConnectivityApiClient(services);AddConnectionApiClient(services);AddFakeConnectionApiClient(services);}/// <summary>/// 配置HTTP行為/// </summary>/// <returns></returns>private static HttpMessageHandler CreateDefaultHttpClientHandler(){var handler = new HttpClientHandler{AllowAutoRedirect = false,AutomaticDecompression = DecompressionMethods.None,UseCookies = false,UseProxy = false,ServerCertificateCustomValidationCallback = Const.DangerousAcceptAnyServerCertificateValidator,};if (handler.MaxConnectionsPerServer < Const.DefaultMaxConnectionsPerServer)handler.MaxConnectionsPerServer = Const.DefaultMaxConnectionsPerServer;//return handler;return new WebRequestHandler {InnerHandler = handler};}}至此,集成平臺(tái)中的其他內(nèi)部服務(wù),只需要調(diào)用SDK的注冊(cè)就可以通過連接Code/Path來(lái)調(diào)用連接中心中連接實(shí)例提供的Rest服務(wù)了。
四、后續(xù)思考
目前而言,連接中心SDK并未公開任何擴(kuò)展點(diǎn)。雖然我們構(gòu)建了調(diào)用通道,但是對(duì)通道的擴(kuò)展能力并未對(duì)外公開。在后續(xù)的過程中。SDK可以根據(jù)需求變更進(jìn)行如下兩個(gè)優(yōu)化。
1、支持通道擴(kuò)展能力。
2、緩存目前只支持從Consul實(shí)時(shí)更新數(shù)據(jù),這也可以在后續(xù)過程中根據(jù)需求增加更多的基礎(chǔ)設(shè)施。
------ END ------
作者簡(jiǎn)介
劉同學(xué):?集成平臺(tái)的開發(fā)工程師,目前負(fù)責(zé)天際平臺(tái)相關(guān)開發(fā)工作。
也許您還想看:
技術(shù)分享|Java SDK動(dòng)態(tài)數(shù)據(jù)源和上下文機(jī)制
技術(shù)分享|NodeJS分布式鏈路追蹤實(shí)現(xiàn)
技術(shù)分享 | Java SDK 元數(shù)據(jù)驅(qū)動(dòng)的事件通信架構(gòu)
技術(shù)分享|Hangfire深度實(shí)踐
技術(shù)分享 | APT結(jié)合JavaPoet生成模板化Java源代碼文件
技術(shù)分享 | 玩轉(zhuǎn)高效UI自動(dòng)化測(cè)試
更多明源云·天際開放平臺(tái)場(chǎng)景案例與開發(fā)小知識(shí),可以關(guān)注明源云天際開發(fā)者社區(qū)公眾號(hào):
【建?!课臋n服務(wù)提供高保真打印模式
明源云·天際硬核技術(shù)認(rèn)可:獲華為鯤鵬技術(shù)認(rèn)證書
天際·開發(fā)者社區(qū)“重裝發(fā)布”!
總結(jié)
以上是生活随笔為你收集整理的技术分享 | 【构建服务端SDK】之连接中心统一调用SDK的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 正式发布!Azure Functions
- 下一篇: 后端开发者开发前端必会的工具(一):样式