微服务中 REST 的 URL 模式

Mat*_*rno 3 rest url design-patterns microservices

我们正在考虑适合我们(大部分)RESTful 微服务的最佳 URL 方案。每个服务都有自己的上下文。针对主题标签(例如 Instagram)特定逻辑的服务可以完成与主题标签相关的所有操作。完成注册用户等所有处理的用户服务。

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

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

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

谢谢你!

Sup*_*hne 6

url 命名背后的基本原理是面向资源的架构(ROA)。即资源层次结构。

让我们从你的问题中举一个例子。您有用户服务。我假设您将user其视为root resource.

那么让我们定义一下用户是什么样的。举个例子,我会这样认为。

User

     | - code

     | - name

     | - cars
Run Code Online (Sandbox Code Playgroud)

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

现在让我们看看如何看到一辆车。

Car

     | - number

     | - make

     | - model

     | - year
Run Code Online (Sandbox Code Playgroud)

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

{
    "code": "001A",
    "name": "alice",
    "cars": [
        {
            "number": "ab123",
            "make": "toyota",
            "model": "corolla",
            "year": 2015
        },
        {
            "number": "we345",
            "make": "nissan",
            "model": "sunny",
            "year": 2017
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

/api/user-service/users
Run Code Online (Sandbox Code Playgroud)

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

[
    {
        "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
            }
        ]
    }
]
Run Code Online (Sandbox Code Playgroud)

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

/api/user-service/users/{user-code}
Run Code Online (Sandbox Code Playgroud)

例子

/api/user-service/users/001A
Run Code Online (Sandbox Code Playgroud)

所以它会产生这样的响应。

{
    "code": "001A",
    "name": "alice",
    "cars": [
        {
            "number": "ab123",
            "make": "toyota",
            "model": "corolla",
            "year": 2015
        },
        {
            "number": "we345",
            "make": "nissan",
            "model": "sunny",
            "year": 2017
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

如果我们想要一个端点检索给定用户的所有汽车,那就像这样。

/api/user-service/users/{user-code}/cars
Run Code Online (Sandbox Code Playgroud)

请注意,汽车(--复数)

例子

/api/user-service/users/001A/cars
Run Code Online (Sandbox Code Playgroud)

所以它会产生这样的响应。

[
    {
        "number": "ab123",
        "make": "toyota",
        "model": "corolla",
        "year": 2015
    },
    {
        "number": "we345",
        "make": "nissan",
        "model": "sunny",
        "year": 2017
    }
]
Run Code Online (Sandbox Code Playgroud)

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