【问题标题】:Nested resources and microservices: how to avoid monoliths?嵌套资源和微服务:如何避免单体应用?
【发布时间】:2020-04-10 18:17:21
【问题描述】:

我想检索一个人的地址详细信息。

根据 REST 规范,我必须有以下路径:

GET /person/<person id>/address/<address id>

现在,假设我想检索电子地址,我会:

GET /person/<person id>/address/<address id>/electronic/<elec id>

等等。 虽然在 REST 方面很好,但它可能会导致一种单一的方法,因为 openapi 生成器(但也是实现它的人)会创建一个单独的微服务来处理多种数据。

还有什么方法可以处理这种情况? 我在想:

1-反转逻辑

GET /addresses/<person id>/<address id>
GET /electronicAddresses/<person id>/<address id>/<electronic address>

2- 使用标头/查询字符串参数并留给单个服务

GET /addresses/<address id>?person_id=
GET /electronicAddress/<elec id>?person_id

我能提供一些实用的指导吗?我觉得内部资源方法最终会爆炸......

【问题讨论】:

    标签: spring-boot rest design-patterns microservices openapi-generator


    【解决方案1】:

    如果我的理解正确,您希望分解您的 API 并将其映射到微服务架构,例如 addressperson 的情况。

    如果是这样,请考虑 addressperson 是如何独立的,因此将有两个服务:Person serviceAddress service。哪些将有下一个 API:

    GET /persons/{person_id}
    GET /addresses/{address_id}
    

    现在的问题,如何获取某人的地址,因为所有地址 API 都没有任何人相关的请求参数。答案是:进行两次 API 调用

    因此,在第一个请求中,客户端通过person_id 检索人员数据,其中应包含对地址实体的一些引用,例如:address_id。现在通过第二个请求,客户端可以通过从个人数据中解析的address_id 检索个人地址。

    【讨论】:

    • 所以根本没有嵌套 API?
    • 您在此处使用嵌套 API,如您在 #2 中所述。 -?personId=...,这样可以做得更好。由于对于 Address 实体,personId 只是一个字段,所以您可以将其用作请求参数过滤器,不违反 REST。
    • 但是,不要使用#1。第二个好多了。
    猜你喜欢
    • 2015-04-10
    • 2011-06-17
    • 2013-01-04
    • 2016-05-07
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 2021-12-18
    相关资源
    最近更新 更多