Java 正在寻找与quarkus共享微服务之间接口的最佳方式
我对微服务还是很陌生,有一些基本的架构问题我现在还不能解决。 我使用Quarkus框架和标准扩展,如Quarkus resteasy和Quarkus rest客户端来实现 场景: 我有一个“持久性”服务的示例,我希望通过专用Maven项目中的REST调用从外部填充数据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
@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();
}
}
同时,我希望有一个microserviceDataGenerator
,它生成相应的数据并将其传递给持久化
服务
我的问题: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
,不能以未满足的解决方案异常
的形式注入
现在我的问题是:
提前谢谢。这是微服务的常见问题。就像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