洞察探索open banking如何通过小程序容器技术助力金融企业实现数据安全和数字化转型
591
2022-10-27
『互联网架构』调用链系统服务端实现
采集器采集后对应的日志信息,如果正常的传入到目标系统中,这其实有一定的挑战的。如果用http的话会影响应用系统,本身是为了监控业务系统,结果反而导致影响业务系统的性能,这肯定是不应该。日志存储这块不能简简单单用mysql,所以后来用[ElasticeSearch文档的方式进行存储。
(一)追踪数据传输方案
一个调用链系统的实现最基本的模块
1.性能日志采集2.数据传输3.数据存储4.图表展示
这是系统是重点和难点。剩下的传输、存储、图表展示虽然没有那么复杂但不代表它们不重要,接下来就一起搞清楚剩下的三个模块是如何实现的。
数据传输所面临的问题和挑战1.业务系统高并发高承载的情况下采集器对资源的占用降至最低2.保证数据采集上报的及时性3.数据丢失率在可控范围之类 现有架构: 基于这些问题在来看我们架构是如何满足上述要求
上述架构中-采集到节点数据之基于Http发送至监控中心在发送至Elasticsearch进行存储。为保证不影响业务系统发送逻辑采用后台线程异步发送,并控制发送线程的数量。
上传流程说明
a. 初化一个限定容量的阻塞队列b. 采集器抓取数据并上传至队列,超出容量直接丢弃c. 线程池分配上传线程d. 控制器取出指定数量数据,如果数量小于0线程阻塞。e. 调用上传服务,根据策略选择具体(Http的监控,而日志传输也是采用Http 不会出现死循环吗?
答:不会,因为上传线程 没有开启监控会话
传输解决方案升级: 上述传输的解决方案对于,对于并发量不高的系统是最优解,因为简单。但随着目标系统的并发量增加,就会显得乏力,当然不管怎么样都不会影响到业务系统,只是采集数据会出现大量的丢失。为解决该问题就得进一步升级传输方案。现有方案中最大的瓶颈是直接通过Http发送,所以最好的办法是先将其打印到本地日志,在基于logstash、flume日志收集工具进行发送。
(二)日志存储方案
存储需求,跟踪节点模型表
字段 | 类型 | 描述 |
---|---|---|
traceId | string | 跟踪ID |
rpcId(EventID \spanID\nodeID) | string | 节点ID |
appId | string | 目标应用ID |
appDetail | string | 应用名称 |
nodeType | string | 节点类型 |
resultState | string | 结果状态 |
resultSize | number | 结果大小 |
servicePath | string | 服务路径 |
serviceName | string | 服务名称 |
beginTime | long | 开始时间 |
endTime | long | 结束时间 |
addressIp | string | 目标 IP地址 |
fromIp | string | 发起方IP地址 |
inParam | text(json) | 输入参数 |
outParam | text(json) | 输出结果 |
errorMessage | string() | 异常类型 |
errorStack | text | 异常堆栈 |
存储方案要求1.大文本的存储2.足够快的写入速度
方案选择
a.mysqlb.MongoDBc.ElasticSearchd.Redis
基于上述要求 mysql作为关系型数据肯定不能和NoSQL相比。剩下的MongoDB与ElasticSearch都满足需求,只不过ElasticSearch 关于日志传输有完整的解决方案,即ELK。另外加上其搜索功能加持 ,所以选择了ElasticSearch。
具体实现a.接收到数据后异步发送至ElasticSearchb.Agent 采用fastjson 作为数据存储,而ElasticSearch 采用的是jackson,特殊字符转义的时候会存在格式化失败的问。
(三)可视化展示
知识点 列表视图 调用链TreeTable 调用链关系图 节点详情视图a. 输入输出参数 Json 视图b. SQL语句格式化展示c. SQL返回结果展示 列表视图 时间过滤 IP过滤 关键字搜索 基于条件查询并展示相关节点源码位置:com.cbt.server.control.TraceRequestControl页面:page/trace/requestTableView.ftl
*节点展示表格视图(TreeTable目的只有一个以TreeTable的形式展示链条节点,并重点标记状态,简单起见这里直接选择了 EasyuI)。
源码位置:com.cbt.server.control.TraceDetailViewControl#openTraceListView
页面:page/trace/traceListView.ftl
调用链关系图 其目的是以图的形式直观展示调用关系。
JsPlumb:是一套开源的流程图创建工具,早期一款画图工具,D3.js:html5领域,d3可谓是最好的可视化基础库,提供方面的DOM操作,非常强大Go.js:go.js 提供一整套的JS工具 ,支持各种交互式图表的创建。有免费版和收费版
相关源码:com.cbt.server.control.TraceConsoleControl#getflowChartNodeData
页面: page/trace/traceListView.ftl 216L
节点详情视图
弹窗组件:layer.js
布局组件:bootstrap.js
SQL语法高亮:highlight.pack.js
SQL格式化:com.alibaba.druid.sql.SQLUtils#formatMySql(java.lang.String)
相关源码:com.cbt.server.control.TraceDetailViewControl#openDetailView
普通节点页面:page/trace/NormalDetailsView.ftl
SQL节点页面:page/trace/SqlDetailsView.ftl
PS:调用链系统的大体介绍基本完成了,老铁里面用了很多设计模式:代理模式,生产者消费者,策略模式等等吧。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~