产生原因
容器云组同事更新镜像后产生的详见博客 https://blog.csdn.net/weigang200820chengdu/article/details/102521408
业务场景
用户修改昵称后抛MQ消息给业务方,业务方接收到消息后,取出最新的昵称展示
问题排查
由于我们代码和业务方代码都没有修改,以为是RabbitMQ的问题通过咨询MQ开发和运维,都告知未升级版本和做其他操作 然后通过本地代码模仿业务方调用的方式(调用需要走两个dubbo项目),测试未出现乱码 通过如上测试后,想到可能是使用Docker部署导致的确认容器编码 编码正常 在测试环境进入容器 执行命令
java
-XshowSettings
:all
-version
文件编码格式是 UTF-8的,确认编码格式后就想到没有必要在 Dockerfile中指定编码格式了(但是事实不是这样的 问题就在于此)然后尝试修改对象转JSON串逻辑
# 旧
JsonUtil
.toJson(object
);
# 新
JSON
.toJSONString(object
);
MQ中还是乱码考虑到影响业务方较大,暂时通过Base64编解码解决问题
大佬指导解决思路
确认MQ的sdk,发布和订阅是否强制指定编码格式发布未指定编码 订阅指定编码 看来sdk确认存在bug;考虑到MQ sdk一直处于没人维护状态,则最终问题没有找到大佬让确认下openjdk编码格式 执行命令
java
-XshowSettings
:all
-version
# 确实是 file
.encoding
=UTF
-8
想到强制在Dockerfile中强制指定编码格式进行测试
ENV CUSTOM_JDK_OPTION
'-Dfile.encoding=UTF-8'
mq本身不会去改字节,乱码的问题是两边编码不一致导致的通过在Dockerfile中加file.encoding=UTF-8或不加,执行命令 java -XshowSettings:all -version,返回信息都是一样的最后就需要容器云组和运维一起排查问题所在