Java 正在寻找与quarkus共享微服务之间接口的最佳方式

Java 正在寻找与quarkus共享微服务之间接口的最佳方式,java,maven,quarkus,quarkus-rest-client,Java,Maven,Quarkus,Quarkus Rest Client,我对微服务还是很陌生,有一些基本的架构问题我现在还不能解决。 我使用Quarkus框架和标准扩展,如Quarkus resteasy和Quarkus rest客户端来实现 场景: 我有一个“持久性”服务的示例,我希望通过专用Maven项目中的REST调用从外部填充数据 @Path("/api/persistence") @Products(MediaType.APPLICATION_JSON) public class Persistence{ @Inject

我对微服务还是很陌生,有一些基本的架构问题我现在还不能解决。 我使用Quarkus框架和标准扩展,如Quarkus resteasy和Quarkus rest客户端来实现

场景:

我有一个“持久性”服务的示例,我希望通过专用Maven项目中的REST调用从外部填充数据

@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();
    }
}
同时,我希望有一个microservice
DataGenerator
,它生成相应的数据并将其传递给
持久化
服务

我的问题:API共享

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

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

    @POST
    @Transactional
    public Response create(PostDto post) ;
    
}
然后通过@Inject将此接口集成到
数据生成器
服务中,从而实现以下示例性服务

@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);
    }
}
我在端口8181上本地运行了
PersistenceService
,并在
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
项目中使用它们,我必须在我的
DataGenerator
项目中包含
Persistence
项目作为一个依赖项,这听起来像是一个“带有额外步骤的整体”,因此在“关注点分离”方面感觉是错误的

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

不幸的是,这不起作用。当我构建服务时,我得到一条消息,即我希望通过
@Inject
数据生成器
服务中包含的所需依赖项
PersistenceApi
,不能以
未满足的解决方案异常
的形式注入

现在我的问题是:

  • 我看不出我缺少什么。你能帮我吗
  • 这种与专用API项目共享API的方式是可行的,还是“带额外步骤的整体式”方法真的是可行的

  • 提前谢谢。

    这是微服务的常见问题。就像Eberhard Wolff在《微服务:Grundragen flexibler Softwarearchitekturen》一书中(我看到你也是德国人)一样,我认为微服务应该具有相同的耦合,就像开发它们的团队和开发它的组织一样(看一看)。因此,大多数独立团队的服务应该独立开发,并且在更新时一个服务的api更改不应该影响另一个服务

    如果你在你的团队中开发这两种服务,那么我认为你可以用你现在的方式将它们结合起来,因为你不必与其他团队一起工作,也不会有巨大的开销请注意,您将被迫同时发布这两项服务。如果这对您来说总是可以的话,那么节省您的时间,按照您的方式来做,如果不了解API版本控制:

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

    查看不同(=服务)方式的域驱动设计以及耦合结果。如果没有API版本控制,您将被迫建立合作关系,并且需要一起发布。也许你更喜欢客户供应商,甚至是墨守成规的人


    要测试两个服务之间的兼容性,请查看消费者驱动的契约和。您还可以生成开放式api文件并跟踪其更改,但这只会有助于通知用户更改。

    这是微服务的常见问题。就像Eberhard Wolff在《微服务:Grundragen flexibler Softwarearchitekturen》一书中(我看到你也是德国人)一样,我认为微服务应该具有相同的耦合,就像开发它们的团队和开发它的组织一样(看一看)。因此,大多数独立团队的服务应该独立开发,并且在更新时一个服务的api更改不应该影响另一个服务

    如果你在你的团队中开发这两种服务,那么我认为你可以用你现在的方式将它们结合起来,因为你不必与其他团队一起工作,也不会有巨大的开销请注意,您将被迫同时发布这两项服务。如果这对您来说总是可以的话,那么节省您的时间,按照您的方式来做,如果不了解API版本控制:

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

    查看不同(=服务)方式的域驱动设计以及耦合结果。如果没有API版本控制,您将被迫建立合作关系,并且需要发布toget