kafka connect java_问题分析:Kafka Connect 引入了Fastjson后,Rest API响应为{}

前言

最近在学习Kafka Connect,写了个连接器的demo。在demo提交了几个版本之后,突然发现Kafka Connect Rest API 无法正常响应了,明明有正在运行的连接器,查询status,居然返回{}

问题分析

对 Rest API 进行debug后,确认是有数据的,但是数据返回不到客户端,很奇怪。因为我记得之前是好用的,所以我回滚了代码版本,逐一排查之后发现当引入Fastjson 依赖之后,会导致Connect Rest API 不可用

如果懒一点的话,到这里就已经结束了,直接删除Fastjson依赖,使用其他Json包。但是我很好奇,在我的理解里,Fastjson 这种库就是个工具包,如果我们程序没有主动调用的时候,是不会对我们产生任何影响的。

百度谷歌一通之后,一筹莫展之际,点开了Fastjson的源码包,在这里发现了Fastjson为JAXRS提供的SPI扩展

9570e7f220cbdefa594d5d947242f760.pngJAXRS:Java API for RESTful Web Services,JavaEE提供的Web服务接口。Jersey 实现了JAXRS,而Kafka Connect 引用了Jersey 。

SPI:Service Provider Interface ,是JDK内置的一种服务提供发现机制,可以参考我之前的博客 Java SPI 实战

打开javax.ws.rs.ext.MessageBodyWriter 文件,可以看到提供的实现类是com.alibaba.fastjson.support.jaxrs.FastJsonProvider,定位到FastJsonProvider下writeTo方法,该方法会把object写入到OutputStream中,看起来很靠谱,debug试一下

fb5a012fba04f701e95540e9a1c6b345.png

果然,说明Fastjson果然参与了Rest API的响应。为什么使用Fastjson就响应不了数据呢,看了下源码,这里要求被序列化的Bean必须标记Fastjson相关的注解,而实际的Bean使用的是Jackson的注解,所以Fastjson无法序列化数据。

接下来可以根据调用栈和全局搜索找一下,看看FastJsonProvider是在什么时机加载的,能否干掉他。

调用栈并没有找到什么有用的信息,通过全局搜索MessageBodyWriter找到了FastJsonProvider的加载位置,MessageBodyFactory::initialize

22c4919e7643cab86718217fa8fdac41.png

上图字面意思理解,使用 injectionManager (注入管理器),找到MessageBodyWriter的可用实现

这里的 customMbws size = 2,分别是FastJson和Jackson的实现。但是FastJson在前,而每次需要做JSON序列化的时候,会遍历writers,如果找到支持application/json的MessageBodyWriter则直接返回,所以每次使用的都是FastJson的实现。

至此已经明白了,为什么Fastjson 会影响Kafka Connect了,接下来就是想办法解决了

这个时候还是没有找到Fastjson是在哪加载的,在Fastjson的 wiki 中找到了些灵感,发现Fastjson 在Jersey 中并不是通过SPI的方式进行的扩展,而是通过FastJsonAutoDiscoverable,向Jersey 的 context中注册FastJsonProvider

add7637f8dccad6d0a534a7f7d21dac1.png

最后,我们在java 进程启动时指定参数 -Dfastjson.auto.discoverable=false,禁用 FastJsonProvider

参考

Kafka Connect中,使用SASL_PLAINTEXT认证是一种常见的配置方式,它可以确保连接的安全性。要配置Kafka Connect使用SASL_PLAINTEXT认证,你需要进行以下步骤: 1. 创建一个Kafka Connect的JAAS配置文件,比如kafka_connect_jaas.conf。在该文件中,你可以指定使用的认证模块和相关的认证参数,比如用户名和密码。一个示例的配置可以是: ``` KafkaClient { org.apache.kafka.common.security.plain.PlainLoginModule required username="alice" password="alice-pwd"; }; ``` 2. 在Kafka Connect启动脚本中,设置环境变量KAFKA_OPTS,指定使用的JAAS配置文件。例如,在kafka_connect_start.sh脚本中,你可以添加以下配置: ``` export KAFKA_OPTS="-Djava.security.auth.login.config=/path/to/kafka_connect_jaas.conf" ``` 通过上述配置,你就可以启用SASL_PLAINTEXT认证,并使用指定的用户名和密码进行连接操作了。请注意,在实际使用中,你需要将上述示例中的用户名和密码替换为你自己的认证信息,并指定正确的配置文件路径。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Kafka使用SASL_PLAINTEXT实现简易的用户认证及权限](https://blog.csdn.net/qq_32907195/article/details/122562105)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值