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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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


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

一、背景

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

二、實現思路

2.1 行業實現思想

SDK定義:指一些被軟件工程師用于為特定的軟件包、軟件框架、硬件平臺及操作系統等創建應用軟件的開發工具之集合。

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

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

2.2 實現過程分析

整體架構分析 :

遵循行業服務端SDK設計思想,我們需要給MIP核心服務連接中心設計配套的調用SDK。雖然連接中心不對外提供服務,但是它在架構中需要對其他微服務提供服務。對應其他服務而言,也需要簡化對連接中心的調用。

內部服務只需要引用連接中心SDK,提供連接對應的Code(標識)和Path(調用路徑)。就可以驅動連接中心訪問第三方服務。

SDK功能分析:

  • 支持鏈式調用,在調用鏈中現有業務需要支持鏈路追蹤,請求壓縮,服務發現,負載均衡,身份認證,服務質量。

  • 連接數據緩存,并實時更新最新連接數據。

內部服務調用連接中心連接服務需要經歷如圖所示步驟

緩存能力:在SDK加載啟動時,SDK應具有實時更新連接數據的能力。

設計思路:通過上述分析得知,SDK支持的功能實際上是一個鏈式調用的過程。鏈中的處理中間件是根據需求組裝,改變HttpRequest。通過分析有我們有三種鏈式調用實現方案。

  • 使用GOF設計模式中的責任鏈模式構建鏈式調用通道。

  • 模仿ASP.NET中間件模式,構建鏈式調用通道。

  • 使用DelegatingHandler為HttpClient創建附加消息處理程序從而構建鏈式調用通道。

  • 緩存設計思路:使用集成平臺中比較成熟的Consul Blocking Query組件實時監控Consul中連接Flag的更改并實時獲取最新的連接配置數據。

    三、實現方案

    經過對三種鏈式調用方案的對比,我們決定使用HttpClient的HttpHandler構建連接中心SDK的鏈式通道,那么為什么使用DelegatingHandler呢?第一和第二種方案需要我們自己實現鏈式調用的頭尾相連的過程。這個過程比較繁瑣而且維護成本較高。而HttpClient天生就支持創建附加消息處理程序。這樣HttpClient的調用鏈就是一個調用通道。我們可以根據需求在這個通道中插入自己的邏輯。

    關鍵實現代碼

    定義通道中的SDK功能實現

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

    編排通道調用鏈

    public static class HttpHandleExtension{public static void AddHttpClinet(this IServiceCollection services){//編排HttpClient的調用通道鏈條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};}}

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

    四、后續思考

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

    1、支持通道擴展能力。

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

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

    作者簡介

    劉同學:?集成平臺的開發工程師,目前負責天際平臺相關開發工作。

    也許您還想看:

    技術分享|Java SDK動態數據源和上下文機制

    技術分享|NodeJS分布式鏈路追蹤實現

    技術分享 | Java SDK 元數據驅動的事件通信架構

    技術分享|Hangfire深度實踐

    技術分享 | APT結合JavaPoet生成模板化Java源代碼文件

    技術分享 | 玩轉高效UI自動化測試

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

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

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

    天際·開發者社區“重裝發布”!

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。