产生原因
  • 容器云组同事更新镜像后产生的
  • 详见博客
业务场景
  • 用户修改昵称后抛MQ消息给业务方,业务方接收到消息后,取出最新的昵称展示
问题排查
  • 由于我们代码和业务方代码都没有修改,以为是RabbitMQ的问题
  • 通过咨询MQ开发和运维,都告知未升级版本和做其他操作
  • 然后通过本地代码模仿业务方调用的方式(调用需要走两个dubbo项目),测试未出现乱码
  • 通过如上测试后,想到可能是使用Docker部署导致的
  • 确认容器编码 编码正常
  • 在测试环境进入容器 执行命令
java -XshowSettings:all -version

RabbitTemplate 获取 channel_Dockerfile

  • 文件编码格式是 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'

RabbitTemplate 获取 channel_Dockerfile_02

  • mq本身不会去改字节,乱码的问题是两边编码不一致导致的
  • 通过在Dockerfile中加file.encoding=UTF-8或不加,执行命令 java -XshowSettings:all -version,返回信息都是一样的
  • 最后就需要容器云组和运维一起排查问题所在