通过JDL搭建的微服务未自动写入用户信息,是否是设计错误?
问题核心原因
你当前的问题是JHipster OAuth2微服务架构的设计逻辑和你实体关联方式不匹配导致的:
- JHipster使用OAuth2认证时,用户数据默认统一存储在授权服务器(如Keycloak)中,所有微服务本地不会默认创建
User表、也不会自动同步用户数据,这是微服务SSO架构的标准设计,和你之前接触的单体应用或会话认证架构的逻辑不同。 - 你在JDL中直接让多个微服务的实体和
User实体做数据库层面的多对一关联,但是微服务本地根本不存在User表,插入测试数据时会触发外键约束失败,这就是关联User的实体测试全部报错的直接原因。 - 你移除Kafka配置不生效是正常的:JHipster本身没有内置跨微服务的用户同步逻辑,哪怕保留Kafka,也需要你自己开发用户事件的监听、广播、消费逻辑才能实现数据同步,移除Kafka反而切断了后续自己实现同步的通道,自然解决不了问题。
可行解决方案
方案1(推荐,符合微服务设计规范)
删除JDL中所有实体到User的数据库关联关系,仅保留普通的用户标识字段(如userLogin String、userId String),不设置外键约束:
- 需要展示用户信息时,从网关层调用授权服务器的用户信息接口获取,或者在网关层统一封装用户信息查询能力供各微服务调用
- 不需要在各微服务冗余存储用户数据,避免多副本数据一致性问题,适配响应式/非响应式所有类型的微服务
方案2(适合必须在微服务本地存储用户数据的场景)
自行实现跨微服务的用户同步逻辑:
- 在网关或授权服务器侧开发用户事件监听能力,用户创建、更新、删除时,通过Kafka广播对应事件
- 各微服务开发对应Kafka消费者,接收用户事件后写入本地的
User表 - 保留JDL中到
User的关联逻辑,注意响应式微服务(AnswerStore)需要使用响应式Kafka消费者实现同步逻辑
测试临时修复方案
如果当前只需要让Cypress测试跑通,可以先修改各微服务的测试数据生成逻辑,提前构造好对应User实体的测试数据插入数据库,再生成关联实体的测试数据即可临时规避报错。
内容的提问来源于stack exchange,提问作者erwin-lovecraft
相关产品推荐
相关产品推荐

