我对微服务还是很陌生,并且有一些我现在无法解决的基本架构问题。我使用 Quarkus 框架和 quarkus-resteasy 和 quarkus-rest-client 等标准扩展来实现。
场景:
我有一个“持久性”服务示例,我想通过专用 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();
}
}
同时我想有一个微服务DataGenerator
来生成相应的数据并将其传递给Persistence
服务。
我的问题:API 共享
这两个服务都是作为 Maven 项目创建的。根据教程,我发现正确的方法是像这样在项目中声明一个接口(这里称为PersistenceApi
)DataGenerator
@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);
}
}
我在端口 8181 上本地运行,并在项目PersistenceService
中添加了以下条目,以便可以找到该服务。application.properties
DataGenerator
furnace.collection.item.service.PersistenceApi/mp-rest/url=http://localhost:8181
furnace.collection.item.service.PersistenceApi/mp-rest/scope=javax.inject.Singleton
我发现在 my 中声明接口是“错误的” 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
项目中,这对我来说听起来像是“带有额外步骤的整体”,因此在“关注点分离”方面感觉不对。
我尝试了以下方法:
我创建了另一个名为的 Maven 项目PersistenceApi
,它只包含相应的PersistenceApi
. 该PersistenceApi
项目随后作为依赖项包含在“Persistence”和“DataGenerator”项目中。在“持久性”项目中,我实现了上面示例中的服务,并尝试通过@Inject
.
不幸的是,这不起作用。在构建服务时,我收到一条消息PersistenceApi
,即我想@Inject
在DataGenerator
服务中包含的所需依赖项不能以UnsatisfiedResolutionException
.
现在我的问题:
- 我看不出我在这里缺少什么。你可以帮帮我吗?
- 这种与专用 API 项目共享 API 的方式是可行的方式,还是“带有额外步骤的单体”方式真的可行?
先感谢您。