前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Bug周刊】Vol.5

【Bug周刊】Vol.5

作者头像
客怎眠qvq
发布2024-08-07 14:00:28
700
发布2024-08-07 14:00:28
举报
文章被收录于专栏:某菜鸟の小屋

【Bug周刊】Vol.5

客怎眠qvq2024-07-102024-07-26

前言

最近开发中遇到很多相同的问题,下意识去翻自己的历史记录,但又没能快速定位。我的trilium一直用来记录自己的周报和相关教程,对于常见的bug和修复方案也找不到合适的地方,只能穿插在日报的历史中,随时间沉没。无意间翻到子舒的奇趣周刊,Bug周刊也由此而生。

看蛊真人真上头hhh,一路寒风身如絮,命海沉浮客独行!

数据同步微服务(dataSync)

问题描述

原负责数据同步服务代码编写的同事run了,临时被叫过来完成这个半成品,无文档、无注释、无部署说明,等于从零开始😭

LY,我顶你个肺啊

项目A向项目B同步数据,项目B使用 nacos 作为配置中心,Rancher 管理集群服务的部署及日志,项目A推送数据的同事反馈MQ的数据没有消费,全部在waiting状态。已知信息就这些。

需要在原项目上保证跑通,同时正常推送数据、拓展推送字段。本小节内容讲述的是踩坑的过程,可能会有些无聊🤣

解决方案

1️⃣ 本地启动项目A

手动调用本地服务接口,复现问题,从项目A服务推送数据显示 can't connect to [10.xx.xx.xx:80xx],哪个开发的本地环境端口???代码一层层翻,找到各接口推送对应的配置数据表,修改推送的地址和端口数据,再次手动推送一条数据,成功推送,排除该服务的问题。

2️⃣ 查看项目B的日志

日志显示手动同步数据时,接口返回未授权401,与负责项目A的同事确认,他们并没有携带对应的 Authorization 头,其他相关的数据同步接口也是如此,但调用正常,判断是白名单的问题。

打开 nacos 配置文件,dataSync 对应的 yml 文件果然没有对该接口的白名单配置,添加白名单,重启相关服务。

再次调用接口验证,正常写入数据同步的历史表(这里留个坑),但是前端页面并没有显示数据。

3️⃣ 启动前端项目

简单配置 React 项目的 config 文件,启动前端项目,定位代码文件及控制台报错,控制台显示 error,响应信息提示 unknown column 'xx' in 'field list'

对比前端列表循环的字段名、后端JPA映射的数据库字段和数据库字段,三者有细微的差异,前后端代码是一致的,只有数据库的列名有出入,可能是跑路的同事在开发时,没有将后端的实体类字段和数据库字段一一对应,导致后端查询报错,前端页面为空。

修改数据库某一列名后,正常映射,手动调用接口同步一条数据后,仍不能在前端显示同步数据。

在数据表中手动添加数据后,前端正常显示,说明从数据同步历史表到业务表的写入存在问题,就是2️⃣的坑。

4️⃣ 调试项目B的数据同步代码

在接受数据后,将日志和同步历史数据分别存入对应的两张表,再通过MQ保留数据同步历史表中的主键和其他id(生产)。

利用MQ中的主键和其他id信息查询对应的数据,利用 FeignClient 定义的接口,与系统服务进行远程调用,实现数据同步功能,将新增的数据从历史表写入至业务表(消费)。

查看日志表的内容,又出现了401的问题。等等,系统服务远程调用?md,system 对应的 yml 配置应该也有一处远程调用的白名单.

修改 nacos 的 system 配置,重启数据同步服务和系统服务,再试一次。

业务表中有数据,但是前端不显示,查询的结果是空。

5️⃣ SQL语句逻辑验证

在对数据表的JPA映射中,添加了全局的筛选,只查询标记为未删除的数据,但是结构体中没有对该字段进行初始化,null 值是无法匹配的,所以查询结果为空。

同时,数据写入业务表后会对数据更新日志进行写入,该表的一个列名也有出入,处理方法与3️⃣一致,修改后业务流程终于正常,数据同步成功,前端页面显示数据。

最终的处理流程大致是这样👇

LY,我顶你个肺!

用户管理页面信息绑定

问题描述

参与一个项目的二期改造,在用户管理页面编辑用户信息,新增岗位时,出现异常情况:下拉菜单绑定对应租户名,再选择对应租户下所在公司、部门和岗位后,租户名清空的情况。

免责声明,该项目的前后端都调走了,我只是一个菜逼后端,临时接手

解决方案

1️⃣ F12大法

在进行新增岗位弹窗的操作时,前端发起对应的api请求,获取上一节点下的所有公司/部门/部门信息,请求成功后,前端将数据绑定到下拉菜单中。

对比一二期相同页面下的请求,发现一期比二期的请求多了query形式的租户编码。既然所有的信息都是基于租户身份下的相关下拉信息,初步判断是二期的测试账号没有对租户进行绑定。

刷新当前页面,找到获取当前用户信息的请求,response 中的信息租户编码和租户名都是空。找到问题,对后端代码进行调试。

2️⃣ IDEA启动

运行对应模块,在接口实现类里补充打印对应的日志,梳理处理逻辑。

当用户编码存储在redis时(未过期),获取对应的租户编码;当用户编码无法在redis中找到时,从组织用户关联表查找对应数据

我寻思,用户的租户编码,不应该放在用户信息表里面维护管理吗?关组织用户关联表什么事……wdnmd

最抽象的是,键值对没有设置过期时间,导致获取当前用户信息时,一直是一期的旧数据,连为空时的获取逻辑都不太符合正常思维(从租户表中随便找一个???)。

清理完redis的缓存,对组织用户关联表的租户字段重新赋值,补充存储redis时的过期时间,调整重新获取时的处理逻辑(先判断用户,再从用户和租户关联表获取租户编码)。重启项目测试,问题解决。

谁在redis里存储数据不加过期时间,我必登门拜访!!!

3️⃣ 前端新增功能测试

新增岗位弹窗正常,点击保存后,前端的岗位列表中,对应的租户名显示为空,但是其他信息都是在弹窗中下拉选择的信息

由于在该操作过程中,控制台没有任何的请求发起,初步判断是前端对新增的租户信息没有赋值。

在弹窗 Model 中打印保存时的 data 对象,果然是租户名为空,租户编码正常。查找了下对租户信息监听的函数,在初始化的时候,赋值的是'',由于在弹窗时,租户名的初始值就是根据租户编码确认的 keyValue(这个并不是 data 绑定的租户名变量,是直接前端渲染的),没有变更自然就没有触发赋值。

修改初始化的值,将 data 中的租户名赋值为当前用户对应的租户名,下拉更改其他租户名时会触发监听的函数,问题解决。

呦,你又没初始化啊,活该编译错误。 —— 烫烫烫

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-07-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 【Bug周刊】Vol.5
    • 前言
      • 数据同步微服务(dataSync)
        • 问题描述
        • 解决方案
      • 用户管理页面信息绑定
        • 问题描述
        • 解决方案
    相关产品与服务
    微服务引擎 TSE
    微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档