客怎眠qvq2024-07-102024-07-26
最近开发中遇到很多相同的问题,下意识去翻自己的历史记录,但又没能快速定位。我的trilium
一直用来记录自己的周报和相关教程,对于常见的bug和修复方案也找不到合适的地方,只能穿插在日报的历史中,随时间沉没。无意间翻到子舒的奇趣周刊,Bug周刊也由此而生。
看蛊真人真上头hhh,一路寒风身如絮,命海沉浮客独行!
原负责数据同步服务代码编写的同事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 中的租户名赋值为当前用户对应的租户名,下拉更改其他租户名时会触发监听的函数,问题解决。
呦,你又没初始化啊,活该编译错误。 —— 烫烫烫