【发布时间】:2016-11-07 05:36:38
【问题描述】:
我在微服务之间使用实体有问题,我有微服务1有团队实体我需要在微服务2中使用团队实体,我的意思是我需要在微服务2中导入TeamRepository.java,如何用jhipster做到这一点?
【问题讨论】:
我在微服务之间使用实体有问题,我有微服务1有团队实体我需要在微服务2中使用团队实体,我的意思是我需要在微服务2中导入TeamRepository.java,如何用jhipster做到这一点?
【问题讨论】:
这是一个有多种答案的问题,因为有多种方法可供选择。
最简单的方法是调用您的第一个应用程序的端点,该端点通过 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 不直接支持这些选项,需要一些时间才能进入,因为它不是微不足道。
【讨论】:
你不能那样做,也不应该那样做。你不能试图共享 JPA 实体和 Spring 存储库,这完全违背了微服务的目的,这就像试图构建一个分布式单体,这是一种反模式。
每个微服务都有自己的数据库,如果 microservice2 需要访问一些 microservice1 数据,它必须通过 microservice1 REST API 来完成。详情请见https://github.com/jhipster/generator-jhipster/issues/3649。
或者,如果您有这样的需求,这可能是一个强烈的信号,您必须重构您的服务并重新考虑它们的边界。这是微服务架构中最难的部分。
【讨论】: