Api在微服务设计中命名

时间:2015-11-14 19:34:07

标签: rest microservices

假设有两个微服务代表资源订单(/订单)和客户(/客户)。我的要求是获得客户的所有订单。 如果它是一个单片应用程序,我会将我的uri建模为/ customers / {id} / orders。这将触及客户资源并进行内存服务调用以获取相应的订单。 现在,在微服务的情况下,这是不可能的。那么,获得订单的唯一方法是进行远程服务调用还是有更好的方法呢? 我们可以使用representation / ordersByCustomers / {customerid}创建另一个资源吗?

2 个答案:

答案 0 :(得分:2)

您可以将一些查询参数作为过滤器传递(这是我见过的最常见的方式)。例如

/orders?customerId=123

我认为很清楚,您要检索按客户ID过滤的所有客户订单。以同样的方式添加分页或其他过滤器。

要记住的重要一点是,您需要order资源,因此URL应保持不变。我提到这一点,因为这对我来说是最难改变的......考虑资源而不是远程调用。

答案 1 :(得分:1)

一般情况下,您应该注意使用与您建议的端点大致相似的端点:

/ordersByCustomers/{customerid}

为什么呢?因为这通常不是RESTful(即使在微服务环境中)并且使消费者难以理解API。如果您需要orderByWhatever怎么办?您是否每次需要一组新数据时都会引入新的端点?尽量避免那些固执己见的终点。

@Augutsto建议完全正确。如果你害怕在GET请求中有一个复杂的逻辑,那么你就可以打破REST规则。我的意思是介绍:

POST /orders/filter/

所有过滤逻辑都将在请求体中传递 - 因此它也更容易携带复杂的逻辑。