『互联网架构』JDBC和RestApi调用埋点

网友投稿 545 2022-10-30

『互联网架构』JDBC和RestApi调用埋点

『互联网架构』JDBC和RestApi调用埋点

JDBC做过java开发的都知道JDBC是干什么的,RestApi其实就是http的调用,http的调用就是调用第三方的服务的时候,第三方的服务并不是在自己的系统范围内,如果出现不稳定挂掉,对自身来说是不可控了,所以第三方服务而言对我们而言是非常的明感的。JDBC和RestApi的监控对系统来讲意义很大,数据库得多重要,在系统的内部进行监控更能良好的反应sql的执行性能。

(一)JDBC调用拦截

JDBC插桩目的 哪些监控怼开发运维来说最有用的。 SQL语句、SQL参数、用了多长时间、SQL类型、结果集大小、返回字段、规范、Join次数 拦截监听SQL语句 找出慢查询语句 模型结构

字段 类型 描述
sql text sql语句
params json 参数
resultSize int 结果大小
url varchar 数据库连接路径
userName varchar 数据库用户名
error text 异常堆栈
useTime int 用时

JDBC插桩位置 这些user,框架,连接池,驱动都依赖jdbc,jdbc是一个什么东西?jdbc是一种规范,一堆接口组成的规范j2se,由驱动来实现的。servlet也是一种接口规范,是j2ee的规范,由tomcat,jetty等容器实现的。任任何一层都可以做为插桩的切入点,但是选用User 层、框架层、连接池&数据源层、驱动层其实现是多样的,无法做到普适性。所以在此选用JDBC 作为插桩切入 点。

从上图可以分析出JDBC执行过程

1.从驱动获取连接(Connection) 2.基于连接构建预处理对象(prepareStatement)3.执行SQL4.读取结果集(ResultSet)5.关闭释放连接。其中涉及对象构建逻辑如下:Driver==》Connection==》prepareStatement==》ResultSet

(二)Http调用拦截

Http埋点目的 很多时候我们会调用第三方API。比如:消息推送、短信发送、第三方支付接口等,因为服务是第三方提供,如果服务出现性能或可用性问题对于我方而言不可控,所以这类接口的稳定性是我们需要重点关注的对象。通常这类接口会基于Http协议实现,所对Htpp协议监控,即实现了对第三方接口的监控。 Http埋点位置

1.user层:无法判断User具体执行方法,基于配置又做不到普适性。2.Http协议层:能找到具体方法,也能做到普适性。需要对Http协议进行全面解析,而且Http协议为文本协议,解析难度更大,实现成本居高。3.专有SDK、与自定义封装的Http工具包,跟具体业务偶合同样无法做到普适应。4.java net URL 与 HttpClient 都是Http client 基于二者实现可以在一定程度上达成我们的目标。

Http埋点机制(java-.URL)

URL常用写法:

URL url = new URL("conn = url.openConnection();conn.setDoInput(true);conn.setDoOutput(true);conn.connect();OutputStream output = conn.getOutputStream();output.write("a=c&b=1".getBytes());InputStream input = conn.getInputStream();byte[] bytes = IOUtils.readFully(input, -1, false);System.out.println(new String(bytes));

> URL 装载执行过程: 1. URL 基于protocol 构建对应 UrlStreamHandler 2. UrlStreamHandler.openConnection() 打开连接,返回URlConnection 3. URlConnection 设置连接属性 4. URlConnection 打开 outPutStream 写入参数 5. URlConnection 打开 inPutStream读取结果 > 其中涉及对象构建逻辑如下: URL==》URLStreamHandler==》URLConnection==》outPutStream、InputStream。 > 如果上述过程加一层**静态代理**即可监控这些对象所有的执行过程从而得到所需监控数据: URL==》Proxy(URLStreamHandler)==》Proxy(URLConnection)==》Proxy(outPutStream)、Proxy(InputStream)。 * URL的类结构 ![](https://s2./images/blog/202207/18095929_62d4be811501180691.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=) > 怎么样才能加上这层代理呢?其关键方法在于 通过静态代理的方式。 java-.URL#setURLStreamHandlerFactory。该方法允许用户自定义URL协议实现. ![](https://s2./images/blog/202207/18095929_62d4be81265a014333.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=) PS:太复杂了,看源码debug看比较好,jdbc和restApi通过的proxy代理的方式。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:ngeo一个旨在简化基于AngularJS和OpenLayers应用程序开发的JS库
下一篇:#yyds干货盘点# 解决名企真题: 奖学金
相关文章

 发表评论

暂时没有评论,来抢沙发吧~