当前位置: 首页 > 知识库问答 >
问题:

寻找与quarkus共享微服务接口的最佳方法

郁烨
2023-03-14

我对微服务还是一个新手,有一些基本的架构问题现在还无法解决。我使用Quarkus框架和标准扩展(如quarkus-resteasy和quarkus-rest-client)来实现。

@Path("/api/persistence")
@Products(MediaType.APPLICATION_JSON)
public class Persistence{

    @Inject
    EntityManager entityManager;

    @POST
    @Transactional
    public Response create(PostDto postDto) {
        Post post = toPostMapper.toResource(postDto);
        entityManager.persist(post);
        return Response.ok(postDto).status(201).build();
    }
}

这两个服务都是作为Maven项目创建的。根据教程,我发现正确的方法是在DataGenerator项目中声明一个接口(这里称为PersistenceAPI),如下所示

@Path("/api/persistence")
@Products(MediaType.APPLICATION_JSON)
@RegisterRestClient
public interface PersistenceApi {

    @POST
    @Transactional
    public Response create(PostDto post) ;
    
}

然后通过@inject将此接口集成到DataGenerator服务中,这导致了以下示例性服务。

@RequestScoped
@Path("/api/datagenerator")
@Products("application/json")
@Consumes("application/json")
public class DataGenerator{

    @Inject
    @RestClient
    PersistenceApi persistenceApi 
    
    @POST
    public void getPostExamplePostToPersistence() {
        PostDto post = new PostDto();
        post.setTitle("Find me in db in persistence-service")
        persistenceApi.create(post);
    }
}

我使persistenceService在端口8181上本地运行,并在DataGenerator项目的application.properties中添加了以下条目,以便可以找到该服务。

furnace.collection.item.service.PersistenceApi/mp-rest/url=http://localhost:8181
furnace.collection.item.service.PersistenceApi/mp-rest/scope=javax.inject.Singleton

我发现在我的DataGenerator中声明接口是“错误的”,因为此时我没有注意到Persistence服务提供的api何时发生了更改。因此,我们可以想到将接口定位在persistence服务中,然后由具体的persistence实现来实现,并生成以下代码。

@Path("/api/persistence")
@Products(MediaType.APPLICATION_JSON)
@RegisterRestClient
public class PersistenceApiImpl implements PersistenceApi {

    @Inject
    EntityManager entityManager;

    @POST
    @Transactional
    public Response create(PostDto fruit) {
        Post post = toPostMapper.toResource(fruit);
        entityManager.persist(post);
        return Response.ok(fruit).status(201).build();
    }

}

为了在我的Datagenerator项目中使用它们,我必须将Persistence项目作为一个依赖项包含在我的Datagenerator项目中,这对我来说听起来像是一个“带有额外步骤的整体”,因此在“关注点分离”方面感觉是错误的。

我尝试了以下方法:我创建了另一个名为PersistenceAPI的Maven项目,它只包含相应的PersistenceAPI。这个persistenceAPI项目随后作为依赖项包含在“persistence”和“DataGenerator”项目中。在“Persistence”项目中,我实现了上面示例中的服务,并尝试通过@inject在“DataGenerator”项目中寻址相应的接口。

不幸的是,这不起作用。在构建服务时,我得到的消息是,所需的依赖项PersistenceAPI不能以UnsatisfiedResolutionException的形式注入,我希望通过DataGenerator服务中的@Inject包含该依赖项。

现在我的问题是:

  1. 我看不出我在这里错过了什么。你能帮我吗?
  2. 这种与专用Api项目共享Api的方式是可行的吗?还是“带额外步骤的整体式”方法真的是可行的?

提前谢谢你。

共有1个答案

廉元龙
2023-03-14

这是微服务的一个常见问题。就像Eberhard Wolff的书“microservices:Grundlagen flexibler SoftwareArchitekTuren”(我看到你也是德国人)一样,我遵循这样的想法,即微服务应该像开发它们的团队和开发它们的组织一样具有相同的耦合(看看康威定律吧)。因此,大多数独立团队的服务应该独立开发,一个服务的api更改不应该在更新时影响另一个服务。

如果您在您的团队中开发这两个服务,那么我认为您可以以您正在做的方式将它们耦合在一起,因为您不必与其他团队一起工作,也不会有巨大的开销。请注意,您将被迫同时发布两个服务。如果这对您来说总是可以的,那么就节省您的时间,以您自己的方式来完成它,如果不可以,请查看API版本控制:

我使用api版本控制,因此旧的api仍然可以在“V1/”下访问,新的api仍然可以在“V2/”下访问。这样,其他微服务背后的团队就有足够的时间更新他们的服务。

了解域驱动设计中集成有界上下文(=服务)的不同方法和耦合后果。如果没有API版本控制,您将被迫建立一个合作伙伴关系,并且需要一起发布。也许你更喜欢客户-供应商,甚至因循守旧。

为了测试两个服务之间的兼容性,请查看消费者驱动的契约和契约。您还可以生成打开的api文件并跟踪它们的更改,但这只会帮助通知人们更改。

 类似资料:
  • 问题内容: 我正在使用Mongoose来管理Mongo数据库。我的连接文件非常简单: 然后在我的app.js中 并且“猫鼬”变量在全球范围内可用。我不想使用全局变量(至少不直接使用)。是否有更好的方法通过单例模式或其他方法在节点之间共享数据库连接变量(我正在使用express.js)? 问题答案: 我只是在app.js文件中执行以下操作: 此时,任何需要访问该模型的文件都可以执行以下操作: 最后,

  • 我试图理解微服务。我想知道如何解决微服务架构中的一对多/多对多关系问题,以及最佳实践是什么。假设我想将学生课程应用程序转换为学生服务,将课程服务和学生服务对话转换为同一数据库中的学生表和课程服务对话课程表。 示例:学生可以注册许多课程,而且许多课程可以有许多学生(多对多关系)。我有2个微服务1:学生服务2:课程服务 学生服务有学生对象 课程服务具有课程对象 我知道学生服务部必须致电课程服务部才能获

  • 当前体系结构: 问题: 我们在前端和后端层之间有一个两步流程。 null 微服务2(MS2)需要验证I1的完整性,因为它来自前端。如何避免对MS1进行新的查询?最好的办法是什么? 我试图优化的流删除了步骤1.3和2.3 流程1: null 流程2: 2.1用户X已在本地/会话存储中存储了数据(MS2_Data) 2.2用户X在MS1上保留数据(MS2_Data+MS1_Data) 2.3 MS1使

  • 我即将开始一个小的个人项目,将公开一个关于我的股票投资组合的API。为了实现这个目标,我必须在一个时间表上从3个API(我的股票经纪人,一个stats API和一个获得股票延长时间价格的API)中获取数据,然后计算某些统计并通过REST服务公开它们,这将是最终的目标。我计划将应用程序分为两个服务。第一个将与外部API通信并将它们的信息存储到数据库中,另一个将计算我需要的统计数据并公开REST服务。

  • 我正在设计一个微服务架构中的评审分析平台。 应用程序如下所示; null null 问题在于,验证服务需要获取site-a的所有评论,应用验证规则并生成错误(如果有的话)。我知道共享数据库模式和实体打破了微服务体系结构。 一个可能的解决方案是 每当验证服务需要对站点进行审查时,它就会请求网关,网关会将请求重定向到审查服务并采取响应。 这种方法的两个可能缺点是 验证服务是否知道网关?是否会带来依赖?

  • 我正在尝试在MATLAB中对图像中的一个物体进行形状分析(特别是)。为此,我找到了边界像素。对于每个边界像素,我使用8邻域理论计算它的邻域。现在我正在计算一个点与它的唯一邻居的切线(取决于我如何选择顺时针或其他方式)。如果每个像素正好有两个邻居,我的算法就能正常工作。对于本图所示的形状(顺序为9 X 15像素)。 但如果一个像素的邻域超过2个,那么我的算法就会混乱。例如,如(顺序为9 X 15像素