技术分享 | 【构建服务端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,一经查实,立即删除!

相关文章

android动态化ui框架,动态化高性能的 UI 框架 Virtualview-Android

软件介绍Virtualview-Android 是一个虚拟化组件&#xff0c;是 Tangram 模型在 2.0 版本补充的 UI 开源库。它开创了一种虚拟化开发基础控件的技术&#xff0c;使用方只要按照指定协议实现一个基础控件的尺寸计算、绘制逻辑、布局逻辑&#xff0c;即能实现在宿主容器的 canvas …

Java的位运算符详解实例——与()、非(~)、或(|)、异或(^)

位运算符主要针对二进制&#xff0c;它包括了&#xff1a;“与”、“非”、“或”、“异或”。从表面上看似乎有点像逻辑运算符&#xff0c;但逻辑运算符是针对两个关系运算符来进行逻辑运算&#xff0c;而位运算符主要针对两个二进制数的位进行逻辑运算。下面详细介绍每个位运…

关于Webapp的注意事项

meta标签<meta name"viewport" content"widthdevice-width, initial-scale1.0, user-scalableno, minimum-scale1.0, maximum-scale1.0">宽度&#xff1d;设备宽度&#xff0c;初始比例&#xff1d;1&#xff0c;阻止放大&#xff0c;最小比例&#…

Tcp连接的七次握手浅析

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

与副交流后总结

昨天和几个项目刚刚上线的3位管理者向副总汇报了一下项目总结&#xff0c;或者是交流&#xff08;老板直接说是轻松一点的交流&#xff09; 我的总结主要部分: 亮点&#xff1a; •从可行性研究到最后的上线&#xff0c;思路还算清晰•共好的项目组&#xff0c;同事的有力支持•…

探讨float类型的数值,为什么两个float不能直接相等

转载&#xff1a;http://blog.csdn.net/turkeyzhou/article/details/2755970 在程序编写的时候&#xff0c;我们会忽略一些细节上的问题&#xff0c;尤其是写java这种高级语言&#xff0c;久而久之&#xff0c;我们会对底层缺乏认识&#xff0c;这也是为什么前段时间会有人说j…

android ifw 启动广告,使用 IFW 完全控制 Android 应用行为 | 实用技巧

我们常说 Android 系统最大的优点是开放性与包容性&#xff0c;但这也造成了应用行为不容易掌控的缺点。特别是国内应用与系统&#xff0c;失去了谷歌 Play 商店官方的应用审核政策后普通用户根本无法确定应用获取的权限用来干什么&#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;并给我留言…

C#编程中的66个好习惯,你有多少个?(转)

http://www.cnblogs.com/jxsoft/archive/2012/01/11/2318824.html转载于:https://www.cnblogs.com/ein-key5205/p/3592583.html

sqlite数据库的char,varchar,text,nchar,nvarchar,ntext的区别

1、CHAR。CHAR存储定长数据很方便&#xff0c;CHAR字段上的索引效率级高&#xff0c;比如定义char(10)&#xff0c;那么不论你存储的数据是否达到了10个字节&#xff0c;都要占去10个字节的空间,不足的自动用空格填充。 2、VARCHAR。存储变长数据&#xff0c;但存储效率没有CHA…

配置 mybatis的 log4j.properties

log4j.rootLoggerdebug,stdout,logfile### 把日志信息输出到控制台 ### log4j.appender.stdoutorg.apache.log4j.ConsoleAppender #log4j.appender.stdout.TargetSystem.err log4j.appender.stdout.layoutorg.apache.log4j.SimpleLayout### 把日志信息输出到文件&#xff1a;jb…

linux 下 oracle 10.2.0.1 32bit netca报错

现象如下&#xff1a; 今天一同事安装完数据库软件运行netca创建监听时报错(运行netmgr与dbca均可执行成功)&#xff0c; 报错信息: [oracleWEB01A bin]$ netca Oracle Net Services Configuration: # # An unexpected error has been detected by HotSpot Virtual Machine:…

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…