【问题标题】:using entity in other jhipster microservice在其他 jhipster 微服务中使用实体
【发布时间】:2016-11-07 05:36:38
【问题描述】:

我在微服务之间使用实体有问题,我有微服务1有团队实体我需要在微服务2中使用团队实体,我的意思是我需要在微服务2中导入TeamRepository.java,如何用jhipster做到这一点?

【问题讨论】:

    标签: jhipster microservices


    【解决方案1】:

    这是一个有多种答案的问题,因为有多种方法可供选择。

    最简单的方法是调用您的第一个应用程序的端点,该端点通过 REST API 公开您的团队实体。这直接意味着,每次您的第二个服务需要对团队实体执行某项操作时,它都会通过 HTTP 检索一个或多个。这目前主要在 uaa 配置中涵盖(使用 JHipster uaa 进行身份验证)

    使用 uaa,您可以定义与 JPA 存储库非常相似的东西:

    @AuthorizedFeignClient(name = "microservice1")
    public interface TeamClient {
       @RequestMapping(value = "/api/teams/", method = RequestMethod.GET)
       List<Team> findTeams();
    
       @RequestMapping(value = "/api/teams/{id}", method = RequestMethod.GET)
       Team findTeam(@PathVariable("id") Long id);
    }
    

    它看起来像您定义存储库的方式,但它与 REST 一起工作。它还为您处理安全问题,因此您可以确保只有定义的用户或服务可以访问您的资源。有关此解决方案的更多信息here

    这种策略的优势在于它的简单性以及来自 spring 和 JHipster 的即用型实现的存在。缺点是,当您的设计迫使您过于频繁地使用此类请求时,这可能会导致性能非常低,从而导致巨大的网络负载。

    解决此问题的替代方法是使用事件驱动系统,如 Spring Cloud Bus、Event-Sourcing、CQRS 等……但是,JHipster 不直接支持这些选项,需要一些时间才能进入,因为它不是微不足道。

    【讨论】:

      【解决方案2】:

      你不能那样做,也不应该那样做。你不能试图共享 JPA 实体和 Spring 存储库,这完全违背了微服务的目的,这就像试图构建一个分布式单体,这是一种反模式。

      每个微服务都有自己的数据库,如果 microservice2 需要访问一些 microservice1 数据,它必须通过 microservice1 REST API 来完成。详情请见https://github.com/jhipster/generator-jhipster/issues/3649

      或者,如果您有这样的需求,这可能是一个强烈的信号,您必须重构您的服务并重新考虑它们的边界。这是微服务架构中最难的部分。

      【讨论】:

      • 使用 KeyCloak 后这些解决方案是否也成立?
      猜你喜欢
      • 2018-01-02
      • 2017-12-31
      • 1970-01-01
      • 2020-03-17
      • 1970-01-01
      • 2021-08-26
      • 1970-01-01
      • 2019-02-26
      • 2019-11-15
      相关资源
      最近更新 更多