微前端架构如何改变企业的开发模式与效率提升
545
2022-10-30
『互联网架构』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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~