微服务中REST的URL模式

时间:2018-06-25 14:50:34

标签: rest url design-patterns microservices

我们正在考虑针对我们(主要是RESTful)微服务的最佳URL方案。每个服务都有自己的上下文。特定于标签的逻辑服务(如Instagram)执行与标签相关的所有操作。 一种用户服务,负责所有注册用户的操作,等等。

因此,我们认为我们以/ api开头每个URL,然后以每个服务的上下文开头。在这种情况下,例如/ api / hashtag oder / api / user

问题在于这些服务与“核心”资源具有相同的名称。例如,用户服务具有列出所有用户的资源,因此URL必须类似于/ api / user / user。 标签也一样。该服务中有一个列出所有主题标签的资源。因此,URL必须为/ api / hashtag / hashtag。

现在您遇到了问题:“核心”资源听起来与服务完全一样。我们正在为此寻找一个好的解决方案。有什么最佳实践吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

URL命名的基础是Resource Oriented Architecture(ROA)。即资源层次结构。

让我们以您的问题为例。您有一个用户服务。我假设您以user作为root resource

因此,让我们定义用户的外观。例如,我将采用这种方式。

User

     | - code

     | - name

     | - cars

在这里,我假设用户可以具有代码名称某些汽车(可以不止一个)。

现在让我们看看如何看车。

Car

     | - number

     | - make

     | - model

     | - year

现在您可以为这样的用户定义一个json对象。

{
    "code": "001A",
    "name": "alice",
    "cars": [
        {
            "number": "ab123",
            "make": "toyota",
            "model": "corolla",
            "year": 2015
        },
        {
            "number": "we345",
            "make": "nissan",
            "model": "sunny",
            "year": 2017
        }
    ]
}

因此,如果我想提供一个端点来检索所有用户,我将提供一个这样的端点。

/api/user-service/users

请注意, 用户 (-复数),仅仅是因为我可以拥有多个用户。它将产生这样的响应。

[
    {
        "code": "001A",
        "name": "alice",
        "cars": [
            {
                "make": "toyota",
                "model": "corolla",
                "year": 2015
            },
            {
                "make": "nissan",
                "model": "sunny",
                "year": 2017
            }
        ]
    },
    {
        "code": "001B",
        "name": "bob",
        "cars": [
            {
                "make": "toyota",
                "model": "yaris",
                "year": 2016
            },
            {
                "make": "bmw",
                "model": "318i",
                "year": 2017
            }
        ]
    }
]

如果我们需要一个端点来检索特定用户的数据,我会给出这样的端点。

/api/user-service/users/{user-code}

示例

/api/user-service/users/001A

因此它将产生这样的响应。

{
    "code": "001A",
    "name": "alice",
    "cars": [
        {
            "number": "ab123",
            "make": "toyota",
            "model": "corolla",
            "year": 2015
        },
        {
            "number": "we345",
            "make": "nissan",
            "model": "sunny",
            "year": 2017
        }
    ]
}

如果我们希望端点检索给定用户的所有汽车,则将是这样。

/api/user-service/users/{user-code}/cars

请注意,汽车(-复数)

示例

/api/user-service/users/001A/cars

因此它将产生这样的响应。

[
    {
        "number": "ab123",
        "make": "toyota",
        "model": "corolla",
        "year": 2015
    },
    {
        "number": "we345",
        "make": "nissan",
        "model": "sunny",
        "year": 2017
    }
]

希望您对REST网址命名约定有基本的了解。

答案 1 :(得分:0)

将服务命名为/ api / serviceName / resource是一个好习惯 话虽如此,您的问题是服务名称。我们曾经做的一件事是将Service添加到名称中。说出UserService或OrderService。我也看到过名字是oms(代表订单管理服务)ims等。 您可以拥有订单管理/订单或用户管理/用户。

如果它是内部api,您还可以为服务添加一些代码名称。

或者您也可以放开服务名称。您的路由逻辑可能会膨胀,但对于外部客户端,他们实际上并不在乎与谁交谈。您可以保留/ api / order或/ api / user