Rest 微服务中的API设计

Rest 微服务中的API设计,rest,api,microservices,Rest,Api,Microservices,我正在设计一个微服务应用程序,但在RESTAPI设计方面有一些困难 场景:一个包含“客户”和“订单”服务的微服务应用程序,遵循“每个服务的数据库模式” 客户服务具有表示客户资源的基本端点,如: GET/customers,POST/customers,GET/customers/:id等 问题:如何为订单服务设计端点,以获取属于客户的所有订单 我考虑过不同的解决方案,但没有一个真正让我满意 /customers/id/orders-我使用这种解决方案的问题是在不包含任何客户数据的服务中使用“客户

我正在设计一个微服务应用程序,但在RESTAPI设计方面有一些困难

场景:一个包含“客户”和“订单”服务的微服务应用程序,遵循“每个服务的数据库模式”

客户服务具有表示客户资源的基本端点,如:

GET/customers
POST/customers
GET/customers/:id

问题:如何为订单服务设计端点,以获取属于客户的所有订单

我考虑过不同的解决方案,但没有一个真正让我满意

  • /customers/id/orders
    -我使用这种解决方案的问题是在不包含任何客户数据的服务中使用“客户”

  • /orders?customerid=123
    -这可以工作,但我觉得它没有遵循正常的API设计准则


  • 关于微服务体系结构中的API设计是否有任何指导原则?

    在我看来,您正在申请订单,因此您应该申请资源订单。您是客户,因为订单没有保存在客户资源中,所以您不需要扮演任何角色。 如果有的话,订单上有一个对客户的引用。 如果您是基于某个属性查询订单,则应将其作为查询参数传递。 因此,由于您正在请求(获取)资源(订单)并希望筛选它们(基于查询参数中的客户),因此选项2是有意义的。
    这就是我将如何设计它,这就是我这样设计它的原因。

    感谢您的输入@Anunay。但是如果订单上有一些附件怎么办?然后,一个普通的查询将是/customers/123/orders/321/attachments。对于第二种形式(以及您建议的形式),它看起来是这样的:/orders/attachments?customerid=123&ordersid=321?它应该是/order/{orderid}/attachmentid/{attachmentid}。只有这样我们才能获得附件,因为附件在订单资源中。现在,当您不需要对订单进行筛选时,您拥有订单id。当你过滤订单时,你需要重新评估订单资源,这是有效的。事情就是这样的,但是对于定制用例,你可以选择定制搜索,在这种情况下,你可能不得不放弃get,转而使用POST来记录,不是我否决了你的答案。我将把它标记为接受,因为这个问题是一个意见问题,而你声明你的答案是你自己的意见。