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

1195117754c1ef107a59d95fbdf01260.png

582e09e50ae86706a71b5a38d173b596.png

源宝导读:微服务架构与传统的单体式方案的最大不同是微服务将应用的核心功能拆分成多项服务。每项服务可以单独构建和部署。服务之间需要互相通信。假设服务间每次通信都需要在调用方编码操作,那么必定会增加很大的工作量,并且造成代码冗余并且无法维护。

一、背景

集成平台在整体架构上抽象了连接中心核心服务来负责对外的服务通信。而在内部的服务通信中。接口中心,事件中心,服务流等都需要在接收到外部请求和指令后将对应的请求通过连接中心转发到第三方服务/厂商。那么,在系统内部就存在连接中心会不断的被其他微服务调用。连接中心在被调用时目前需要经历如下几个步骤,服务发现->负载均衡->APM->ZIP->身份认证处理->服务质量。如果这些步骤在此调用的时候都需要被重复编码,那结果肯定是灾难性的。所以,我们给我们的核心服务连接中心提供了专门的调用SDK。

二、实现思路

2.1 行业实现思想

SDK定义:指一些被软件工程师用于为特定的软件包、软件框架、硬件平台及操作系统等创建应用软件的开发工具之集合。

在单体应用早期,我们往往使用SDK封装一些对外公开的功能代码,这样需要使用此功能就可以直接引用SDK,而不需要从头开发。在SOA时代服务SDK的概念其实就已经出现在我们使用的技术中。比如,WCF的客户端在某种程度上也是一种服务SDK,使用客户端可以快捷的调用WCF服务端。而通信,序列化,编码等过程对我们来说是隐式的。我们不需要去关心这些特定的实现细节。

现阶段在对于行业而言,我们熟知的厂商提供了许多的软件服务。比如百度的地图服务,讯飞的语音服务。从他们的技术文档可以得知,基本上每个厂商在提供核心服务的同时。一定会给我们提供配套的服务SDK来简化我们调用服务的过程。在使用的过程中,我们往往只需要使用SDK进行简单的配置。遵循这一思想,在核心服务就绪后,我们可以给核心服务配套对应的SDK来简化外部调用的过程。

2.2 实现过程分析

整体架构分析 :

遵循行业服务端SDK设计思想,我们需要给MIP核心服务连接中心设计配套的调用SDK。虽然连接中心不对外提供服务,但是它在架构中需要对其他微服务提供服务。对应其他服务而言,也需要简化对连接中心的调用。

2efd6c68ce727ffbe11f3735e4ae622f.png

内部服务只需要引用连接中心SDK,提供连接对应的Code(标识)和Path(调用路径)。就可以驱动连接中心访问第三方服务。

SDK功能分析:

  • 支持链式调用,在调用链中现有业务需要支持链路追踪,请求压缩,服务发现,负载均衡,身份认证,服务质量。

  • 连接数据缓存,并实时更新最新连接数据。

内部服务调用连接中心连接服务需要经历如图所示步骤

7563e105c10358fa2ab9c7f2334336f2.png

缓存能力:在SDK加载启动时,SDK应具有实时更新连接数据的能力。

设计思路:通过上述分析得知,SDK支持的功能实际上是一个链式调用的过程。链中的处理中间件是根据需求组装,改变HttpRequest。通过分析有我们有三种链式调用实现方案。

  1. 使用GOF设计模式中的责任链模式构建链式调用通道。

  2. 模仿ASP.NET中间件模式,构建链式调用通道。

  3. 使用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自动化测试

更多明源云·天际开放平台场景案例与开发小知识,可以关注明源云天际开发者社区公众号:

【建模】文档服务提供高保真打印模式

明源云·天际硬核技术认可:获华为鲲鹏技术认证书

天际·开发者社区“重装发布”!

f25a461862f6b3a156894c6497b9e3ad.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tcp连接的七次握手浅析

连接的三次握手 客户端向服务器发送SYN请求 服务器发送ACK回应请求&#xff0c;并同时发送一个SYN的请求给客户端 客户端回应ACK应答 关闭的四次握手 对于关闭流程&#xff0c;一共有三种情况&#xff1a;客户端主动关闭&#xff0c;服务器端主动关闭&#xff0c;客户端和服务器…

VS2022安装教程和使用说明来了

我看很多小伙伴已经开始迫不及待的安装VS2022了&#xff0c;虽然我也安装了VS2022&#xff0c;但是我依旧使用VS2019。因为我觉得适合我的才是最好的&#xff0c;并非是最新的&#xff0c;所以大家在使用的时候&#xff0c;根据实际需求选择开发工具&#xff0c;不要一味追求最…

华为交换机RRPP配置实验

在工作中遇到了H3C和HW的RRPP配置&#xff0c;以下就以华为模拟器再作一次实验。大家共同来论讨论遇到的问题。 【理论基础】RRPP具体的理论见配置手册下面只点几个容易出错的地方1、作为RRPP环的接口要关闭STP2、两个重要的命令&#xff1a;control-vlan vlan-id命令&#xff…

Android之AIDL服务

AIDL服务 服务&#xff08;Service&#xff09;是android系统中非常重要的组件。Service可以脱离应用程序运行。也就是说&#xff0c;应用程序只起到一个启动Service的作用。一但Service被启动&#xff0c;就算应用程序关闭&#xff0c;Service仍然会在后台运行。 andro…

男人的那些统一话术......

1 当面试官来租你的房子▼2 好家伙&#xff08;via.dy油画艺术&#xff09;▼3 学到了&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 一杯奶茶能加多少料▼5 原来我们如此优秀&#xff01;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼6 幼儿园里卧…

后端开发者开发前端必会的工具(一):样式调试篇

又来为大家分享干货了&#xff0c;今天主要是分享一点关于后端工程师开发前端比较苦恼的一个问题《如何去调试前端&#xff1f;》&#xff0c;我相信这是所有后端开发者比较困惑的&#xff0c;如果有这个困惑的&#xff0c;记得关注“程序员晓晓”公众号&#xff0c;并给我留言…

adb android源码分析,Android源码分析(十六)----adb shell 命令进行OTA升级

一: 进入shell命令界面adb shell二&#xff1a;创建目录/cache/recoverymkdir /cache/recovery 如果系统中已有此目录&#xff0c;则会提示已存在。三: 修改文件夹权限chmod -R 777 /cache/recovery四: 把ota文件路径写入/cache/recovery/command文件中echo "--update_pac…

如何使用cURL获得请求和响应时间?

✎ 码甲说 hello&#xff0c;老伙计们&#xff0c;又有半个多月没见了&#xff0c;今天给大家分享一个干货编程小技巧&#xff0c;上至架构师、下至开发者、运维男、QA&#xff0c; 得此利器&#xff0c;事半功倍。cURL在我的眼里&#xff0c;就是一个httpClient手办&#xff…

ASP.NET MVC CheckBoxFor为什么会生成hidden input控件

自己开发的公众号&#xff0c;可以领取淘宝内部优惠券 Html.CheckBoxFor(m > m.Bool) 使用CheckBoxFor方法得到的html代码会是下面这个样子 <input checked"checked" data-val"true" data-val-required"Bool 字段是必需的。" id"Bool…

android 远程调试工具,Android远程调试的探索与实现

文章来源&#xff1a;美团点评技术团队作为移动开发者&#xff0c;最头疼的莫过于遇到产品上线以后出现了bug&#xff0c;但是本地开发环境又无法复现的情况。常见的调查线上棘手问题方式大概如下&#xff1a;方法优点缺点联系用户安装已添加测试日志的APK方便定位问题需要用户…

.NET 6新特性试用 | 自动生成高性能日志记录代码

前言要想记录日志&#xff0c;常用的方式是访问ILogger实例提供的日志记录方法&#xff1a;private readonly ILogger<WeatherForecastController> _logger;public WeatherForecastController(ILogger<WeatherForecastController> logger) {_logger logger; }[Htt…

3150 Pibonacci数 - Wikioi

题目描述 Description   你可能听说过的Fibonacci数和圆周率Pi。   如果你让这两个概念合并&#xff0c;一个新的深奥的概念应运而生&#xff1a;Pibonacci数。   这些数可以被定义为对于x>0&#xff1a;     如果0<x<4&#xff0c;则P(x) 1 …

Oracle Enterprises Manager 12C安装

前言 随着时代的进步与发展&#xff0c;Oracle官方于2012年12月1日起正式公布不再为Oracle10g版本提供免费的技术支持服务&#xff0c;而另一款新产品12C也即将面试&#xff0c;C即cloud&#xff0c;伴随着云计算的脚步&#xff0c;他终于粉墨登场了&#xff0c;熊熊第一时间下…

一个简单的MVC模式练习

控制层Action接受从模型层DAO传来的数据&#xff0c;显现在视图层上。 package Action;import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement;import DAO.StuDAO; import Model.Student; import Util.DBUtil;public class StuAction {public …

GraphQL 到底有什么魔力?

GraphQL 起源时间退回到 2012年的一个下午, 美国加利福尼亚州, facebook 的工程师们发现他们才上架没多久的移动端应用就收到了很多差评, 用户反映app响应慢&#xff0c;耗电严重等&#xff0c;经过分析后发现, 应用在第一次启动时, 会请求大量的后端api接口, 这其中包括用户自…

android root工具twrp,安卓手机没有twrp的情况,如何下刷入magisk并获得root权限.

安装adb工具从以上地址下载,然后解压到任意目录(例如C:\adb).将此目录添加到windows环境变量path中.在cmd中输入adb, fastboot等命令,如果"显示"xxx"不是内部或外部命令命令",那么说明你弄错了,去了解一下什么是环境变量吧.如果显示一堆英文,那么说明安装完…