在微服务中添加一个项目,参考另一个
Adding an item in a microservice, with reference to another one
上下文
我有两个微服务:
- 管理用户(CRUD操作)的用户
- 管理计费信息的计费,并引用用户
实际上,对我来说(告诉我我错了)使用 hateoas 将用户信息存储到计费数据中是个好主意。那么我们可以"walk through it"在API的响应中加上一个超链接对吗?
我们可以获得类似的东西:
billing:{
// some informations
_links:{
owner:"http://80.80.80.80:7000/users/123456789"
}
}
问题
我应该怎么做,才能创建新的账单?事实上,当有人 post 对微服务进行新的计费时,他也会向用户发送。这是否意味着我需要 在我的计费服务和我的用户服务中有一个 UserEntity?所以计费服务将能够编组请求,这意味着两个服务之间的代码重复?或者我应该做点别的吗?
那么,前端(API消费者)的作用是发出2个请求(一个用于计费,一个用于与计费相关的用户)以获取资源?还是 BillingService 应该在响应前台之前获取 User?
我在一篇文章中看到,在处理微服务时使用amqp / bus是个好东西,可以知道一个资源是否存在,或者检查它是否存在。现在我们需要一个服务 container/registry 来动态发现其他服务。就我而言,我使用 Zookeeper。但是我该怎么做才能告诉 Zookeeper "give me the location of the service(s) related to the ressource with hateoas links : http://80.80.80.80:7000/users/123456789" 呢?我是否在我的 hateoas 模式中遗漏了重要信息?
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 调用。
上下文
我有两个微服务:
- 管理用户(CRUD操作)的用户
- 管理计费信息的计费,并引用用户
实际上,对我来说(告诉我我错了)使用 hateoas 将用户信息存储到计费数据中是个好主意。那么我们可以"walk through it"在API的响应中加上一个超链接对吗?
我们可以获得类似的东西:
billing:{
// some informations
_links:{
owner:"http://80.80.80.80:7000/users/123456789"
}
}
问题
我应该怎么做,才能创建新的账单?事实上,当有人 post 对微服务进行新的计费时,他也会向用户发送。这是否意味着我需要 在我的计费服务和我的用户服务中有一个 UserEntity?所以计费服务将能够编组请求,这意味着两个服务之间的代码重复?或者我应该做点别的吗?
那么,前端(API消费者)的作用是发出2个请求(一个用于计费,一个用于与计费相关的用户)以获取资源?还是 BillingService 应该在响应前台之前获取 User?
我在一篇文章中看到,在处理微服务时使用amqp / bus是个好东西,可以知道一个资源是否存在,或者检查它是否存在。现在我们需要一个服务 container/registry 来动态发现其他服务。就我而言,我使用 Zookeeper。但是我该怎么做才能告诉 Zookeeper "give me the location of the service(s) related to the ressource with hateoas links : http://80.80.80.80:7000/users/123456789" 呢?我是否在我的 hateoas 模式中遗漏了重要信息?
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 新的账单。如果计费服务需要用户的更多信息,可以向用户服务查询。这里可能有一些代码重复,但代码在每个服务中扮演不同的角色,这意味着它们可以在不相互干扰的情况下发展。有些问题可以在这里进一步解释:
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 调用。