1.分布式链路追踪 SkyWalking 源码分析 —— DataCarrier 异步处理库
2.很开心,网站网站在使用mybatis的追踪追踪过程中我踩到一个坑。
3.å¦ä½å¾å°ä¸ä¸ªç½ç«çå代ç ï¼
分布式链路追踪 SkyWalking 源码分析 —— DataCarrier 异步处理库
本文基于 SkyWalking 3.2.6 正式版,主要分享 SkyWalking Collector Remote 远程通信服务,网站网站用于 Collector 集群内部通信。追踪追踪Remote Module 应用于 SkyWalking 架构中,源码源码java嵌入matlab源码实现跨节点的网站网站流式处理。
本文从接口到实现顺序解析 SkyWalking Collector Remote 的追踪追踪项目结构和组件,包括 RemoteModule、源码源码RemoteSenderService、网站网站RemoteClientService、追踪追踪RemoteClient、源码源码CommonRemoteDataRegisterService、网站网站车牌键盘源码RemoteDataRegisterService、追踪追踪RemoteDataIDGetter、源码源码RemoteDataInstanceCreatorGetter、RemoteSerializeService、RemoteDeserializeService。RemoteModule 实现 Module 抽象类,定义服务如 RemoteSenderService、RemoteDataRegisterService,创建 RemoteClient 实现远程通信。CommonRemoteDataRegisterService 用于注册数据类型对应的远程数据创建器和获取数据协议编号。
接着,本文深入探讨基于 Google gRPC 的怎样预览源码远程通信实现,包括 RemoteModuleGRPCProvider、GRPCRemoteSenderService、GRPCRemoteClientService、GRPCRemoteClient、RemoteCommonServiceHandler、GRPCRemoteSerializeService、GRPCRemoteDeserializeService。RemoteModuleGRPCProvider 提供基于 gRPC 的组件服务实现类,实现远程发送服务、客户端选择器和远程客户端服务。GRPCRemoteClient 实现基于 gRPC 的远程客户端,支持异步发送消息。hart net 源码
最后,本文提及 SkyWalking Collector Remote 也支持基于 Kafka 的远程通信实现,但目前暂未完成。为了进一步学习 SkyWalking 的分布式链路追踪和远程通信机制,读者可以关注公众号芋道源码,获取 Java 源码解析、原理讲解、面试题、学习指南,回复「书籍」领取 Java 从入门到架构的 本书籍,加入技术群讨论 Java、后端、cepf源码编译架构相关技术。
很开心,在使用mybatis的过程中我踩到一个坑。
在实际开发过程中,我遇到了mybatis的一个问题,觉得很有必要记录下来并分享给大家。
这个坑的具体情况是这样的:在mybatis中,OgnlOps.equal(0,"")返回的是true,这违背了我们的常识,并且会带来一些问题。
接下来,我将按照遇到问题 -> 分析问题 -> 解决问题的思路,用追踪源码的方法,对这个问题进行剖析。
同时,我会分享一下我是如何通过逆向排查的方法,通过Debug模式找到关键源码,并解决这个问题的。
本文源码:mybatis 3.5.3版本。
背景介绍和需求分析
为了简化问题,我们假设有一个订单表,表结构如下:
为了方便说明,我们假设表里面只有两条数据:订单号为的订单状态为0(关闭),订单号为的订单状态为1(开启)。
已经开发好的功能是模糊查询订单名称,接口如下:
现在需要在已有功能上添加一个根据状态过滤订单的功能。
假设某个页面有这样的一个下拉框,可以根据订单状态过滤订单数据。
准备开发
现在明确了需求,根据订单状态进行过滤。
很简单,最主要的修改地方就是对mapper.xml的修改。
开始自测,遇到问题
为了确保功能的正确性,我进行了单元测试,分别传入状态0和1,预期的结果是各自查询出一条数据。
然而,执行结果却与预期不符,status=0时查询出2条数据,status=1时查询出1条数据。
当时我意识到这个问题可能并不简单,于是决定分析原因。
分析问题
为了找到问题的根源,我首先将sql打印出来,查看最终执行的sql。
通过分析sql,我发现当status为0时,mybatis并没有给我们拼接where关键字。
逆向排查法
为了定位问题,我通过日志找到了关键源码,并使用逆向排查的方法进行追踪。
最终,我发现问题的根源在于mybatis中的OgnlOps.equal(0,"")返回了true。
关键源码
通过分析源码,我找到了导致这个问题的关键代码,并解决了这个问题。
解决问题
为了解决这个问题,我修改了mapper.xml文件中的if标签,最终实现了预期效果。
总结
这次的经历让我深刻认识到,在开发过程中遇到问题时,要善于分析、思考和总结,才能不断提升自己的技能。
å¦ä½å¾å°ä¸ä¸ªç½ç«çå代ç ï¼
ä½ æ说ç代ç æ¯æºç¨åº,å¦æä½ çå°çç½ç«ä½¿ç¨æ¯ç½ç½ä¸å¯ä»¥æ¾å°ç¨åº,å¯ä»¥å¨ä¸äºå°æ¹,æ¯å¦æ«å°¾æè åå°æ¾å°çæ,ä¸è½½å¯¹åºç¨åºå³å¯
æè æ¯å§ä»ç½ç«é»äº
ç´æ¥å¦å为æ¥çå°çæ¯æºä»£ç ,并ä¸æ¯çæ¯æä¹ä¸çç¨åº