日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

技术分享 | 【构建服务端SDK】之连接中心统一调用SDK

發(fā)布時間:2023/12/4 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 技术分享 | 【构建服务端SDK】之连接中心统一调用SDK 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


源寶導(dǎo)讀:微服務(wù)架構(gòu)與傳統(tǒng)的單體式方案的最大不同是微服務(wù)將應(yīng)用的核心功能拆分成多項服務(wù)。每項服務(wù)可以單獨構(gòu)建和部署。服務(wù)之間需要互相通信。假設(shè)服務(wù)間每次通信都需要在調(diào)用方編碼操作,那么必定會增加很大的工作量,并且造成代碼冗余并且無法維護。

一、背景

集成平臺在整體架構(gòu)上抽象了連接中心核心服務(wù)來負責(zé)對外的服務(wù)通信。而在內(nèi)部的服務(wù)通信中。接口中心,事件中心,服務(wù)流等都需要在接收到外部請求和指令后將對應(yīng)的請求通過連接中心轉(zhuǎn)發(fā)到第三方服務(wù)/廠商。那么,在系統(tǒng)內(nèi)部就存在連接中心會不斷的被其他微服務(wù)調(diào)用。連接中心在被調(diào)用時目前需要經(jīng)歷如下幾個步驟,服務(wù)發(fā)現(xiàn)->負載均衡->APM->ZIP->身份認證處理->服務(wù)質(zhì)量。如果這些步驟在此調(diào)用的時候都需要被重復(fù)編碼,那結(jié)果肯定是災(zāi)難性的。所以,我們給我們的核心服務(wù)連接中心提供了專門的調(diào)用SDK。

二、實現(xiàn)思路

2.1 行業(yè)實現(xiàn)思想

SDK定義:指一些被軟件工程師用于為特定的軟件包、軟件框架、硬件平臺及操作系統(tǒng)等創(chuàng)建應(yīng)用軟件的開發(fā)工具之集合。

在單體應(yīng)用早期,我們往往使用SDK封裝一些對外公開的功能代碼,這樣需要使用此功能就可以直接引用SDK,而不需要從頭開發(fā)。在SOA時代服務(wù)SDK的概念其實就已經(jīng)出現(xiàn)在我們使用的技術(shù)中。比如,WCF的客戶端在某種程度上也是一種服務(wù)SDK,使用客戶端可以快捷的調(diào)用WCF服務(wù)端。而通信,序列化,編碼等過程對我們來說是隱式的。我們不需要去關(guān)心這些特定的實現(xiàn)細節(jié)。

現(xiàn)階段在對于行業(yè)而言,我們熟知的廠商提供了許多的軟件服務(wù)。比如百度的地圖服務(wù),訊飛的語音服務(wù)。從他們的技術(shù)文檔可以得知,基本上每個廠商在提供核心服務(wù)的同時。一定會給我們提供配套的服務(wù)SDK來簡化我們調(diào)用服務(wù)的過程。在使用的過程中,我們往往只需要使用SDK進行簡單的配置。遵循這一思想,在核心服務(wù)就緒后,我們可以給核心服務(wù)配套對應(yīng)的SDK來簡化外部調(diào)用的過程。

2.2 實現(xiàn)過程分析

整體架構(gòu)分析 :

遵循行業(yè)服務(wù)端SDK設(shè)計思想,我們需要給MIP核心服務(wù)連接中心設(shè)計配套的調(diào)用SDK。雖然連接中心不對外提供服務(wù),但是它在架構(gòu)中需要對其他微服務(wù)提供服務(wù)。對應(yīng)其他服務(wù)而言,也需要簡化對連接中心的調(diào)用。

內(nèi)部服務(wù)只需要引用連接中心SDK,提供連接對應(yīng)的Code(標(biāo)識)和Path(調(diào)用路徑)。就可以驅(qū)動連接中心訪問第三方服務(wù)。

SDK功能分析:

  • 支持鏈?zhǔn)秸{(diào)用,在調(diào)用鏈中現(xiàn)有業(yè)務(wù)需要支持鏈路追蹤,請求壓縮,服務(wù)發(fā)現(xiàn),負載均衡,身份認證,服務(wù)質(zhì)量。

  • 連接數(shù)據(jù)緩存,并實時更新最新連接數(shù)據(jù)。

內(nèi)部服務(wù)調(diào)用連接中心連接服務(wù)需要經(jīng)歷如圖所示步驟

緩存能力:在SDK加載啟動時,SDK應(yīng)具有實時更新連接數(shù)據(jù)的能力。

設(shè)計思路:通過上述分析得知,SDK支持的功能實際上是一個鏈?zhǔn)秸{(diào)用的過程。鏈中的處理中間件是根據(jù)需求組裝,改變HttpRequest。通過分析有我們有三種鏈?zhǔn)秸{(diào)用實現(xiàn)方案。

  • 使用GOF設(shè)計模式中的責(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è)計思路:使用集成平臺中比較成熟的Consul Blocking Query組件實時監(jiān)控Consul中連接Flag的更改并實時獲取最新的連接配置數(shù)據(jù)。

    三、實現(xiàn)方案

    經(jīng)過對三種鏈?zhǔn)秸{(diào)用方案的對比,我們決定使用HttpClient的HttpHandler構(gòu)建連接中心SDK的鏈?zhǔn)酵ǖ?#xff0c;那么為什么使用DelegatingHandler呢?第一和第二種方案需要我們自己實現(xiàn)鏈?zhǔn)秸{(diào)用的頭尾相連的過程。這個過程比較繁瑣而且維護成本較高。而HttpClient天生就支持創(chuàng)建附加消息處理程序。這樣HttpClient的調(diào)用鏈就是一個調(diào)用通道。我們可以根據(jù)需求在這個通道中插入自己的邏輯。

    關(guān)鍵實現(xiàn)代碼

    定義通道中的SDK功能實現(xiàn)

    /// <summary>/// 連接中心SDK鏈路追蹤實現(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">連接中心運行時提供者</param>/// <param name="deployConfigProvider">部署信息提供者</param>public TracingHandler(ConnectionProvider provider, MipDeployConfigProvider deployConfigProvider){_provider = provider;_deployConfigProvider = deployConfigProvider;}/// <summary>/// 將MIP連接中心請求,相應(yīng)鏈路追蹤加入到HTTPClient擴展通道中/// </summary>/// <param name="requestMessage">發(fā)送到連接API的Http請求</param>/// <param name="cancellationToken">令牌</param>/// <returns>連接中心API請求結(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};}}

    至此,集成平臺中的其他內(nèi)部服務(wù),只需要調(diào)用SDK的注冊就可以通過連接Code/Path來調(diào)用連接中心中連接實例提供的Rest服務(wù)了。

    四、后續(xù)思考

    目前而言,連接中心SDK并未公開任何擴展點。雖然我們構(gòu)建了調(diào)用通道,但是對通道的擴展能力并未對外公開。在后續(xù)的過程中。SDK可以根據(jù)需求變更進行如下兩個優(yōu)化。

    1、支持通道擴展能力。

    2、緩存目前只支持從Consul實時更新數(shù)據(jù),這也可以在后續(xù)過程中根據(jù)需求增加更多的基礎(chǔ)設(shè)施。

    ------ END ------

    作者簡介

    劉同學(xué):?集成平臺的開發(fā)工程師,目前負責(zé)天際平臺相關(guān)開發(fā)工作。

    也許您還想看:

    技術(shù)分享|Java SDK動態(tài)數(shù)據(jù)源和上下文機制

    技術(shù)分享|NodeJS分布式鏈路追蹤實現(xiàn)

    技術(shù)分享 | Java SDK 元數(shù)據(jù)驅(qū)動的事件通信架構(gòu)

    技術(shù)分享|Hangfire深度實踐

    技術(shù)分享 | APT結(jié)合JavaPoet生成模板化Java源代碼文件

    技術(shù)分享 | 玩轉(zhuǎn)高效UI自動化測試

    更多明源云·天際開放平臺場景案例與開發(fā)小知識,可以關(guān)注明源云天際開發(fā)者社區(qū)公眾號:

    【建模】文檔服務(wù)提供高保真打印模式

    明源云·天際硬核技術(shù)認可:獲華為鯤鵬技術(shù)認證書

    天際·開發(fā)者社區(qū)“重裝發(fā)布”!

    總結(jié)

    以上是生活随笔為你收集整理的技术分享 | 【构建服务端SDK】之连接中心统一调用SDK的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。