在微服务中添加一个项目,参考另一个

Adding an item in a microservice, with reference to another one

上下文

我有两个微服务:

实际上,对我来说(告诉我我错了)使用 hateoas 将用户信息存储到计费数据中是个好主意。那么我们可以"walk through it"在API的响应中加上一个超链接对吗?

我们可以获得类似的东西:

billing:{
// some informations
   _links:{
     owner:"http://80.80.80.80:7000/users/123456789"
   }
}

问题

How should I do, to create a new billing ? In fact, when somebody post a new billing on the microservice, he sends the user too. Does it mean that I need to have a UserEntity in my Billing service AND my User Service ? So the billing service will be able to marshall the request, meaning code duplication between the two services ? Or should I do something else ?

计费服务需要的用户不是用户服务中的同一用户。通常,用户的身份是所有消费者需要 post 新的账单。如果计费服务需要用户的更多信息,可以向用户服务查询。这里可能有一些代码重复,但代码在每个服务中扮演不同的角色,这意味着它们可以在不相互干扰的情况下发展。有些问题可以在这里进一步解释:, Handling duplication of domain logic using DDD and CQRS

Then, is this the role of the front end (API consumer) to make 2 requests (one for billing, and one for the user related to the billing) to get the ressource ? Or should the BillingService get the User before responding to the front ?

我认为让 API 消费者浏览 link 带来了最大的灵活性。如果消费者对所有者的详细信息不感兴趣怎么办?

I have seen in an article, that it's a good thing to use amqp / bus when dealing with microservice, to know if a ressource exists, or to check if it exists. Now we need a service container/registry to dynamically discover other services. In my case I use Zookeeper. But how can I do to tell Zookeeper "give me the location of the service(s) related to the ressource with hateoas links : http://80.80.80.80:7000/users/123456789" ? Am I missing an important information in my hateoas schema ?

这个不太明白。如果消费者已经有了像“http://80.80.80.80:7000/users/123456789”这样的link,它就可以直接访问资源。它为什么要问动物园管理员?我认为动物园管理员帮助计费服务 assemble 所有者的 URI。例如,计费服务告诉 zookeeper "Give me the location of the service related to user resource".

另一种解决方案是将所有必要信息存储在两种服务中。例如,如果您需要账单中的用户数据,那么只需将所有数据也存储在账单数据存储中即可。您将通过队列(订阅/发布)在两种服务之间进行同步。这有利也有弊,但如果您想接收特定账单的数据,最终您会得到一个 同步 http 调用。