【问题标题】:API design to allow client to pick serverAPI 设计允许客户端选择服务器
【发布时间】:2022-01-09 10:25:07
【问题描述】:

我有以下基本架构:

出于我不想进入的原因,如果客户端愿意,我希望允许客户端从任一服务器获取数据。如果他们不关心,那么负载均衡器将为他们做出决定。

是否有设计 API 请求的最佳实践?

我想出了几个选择:

  • 添加可选的查询字符串参数:
example.com?server=1
  • 添加一个可选的请求标头(不确定是否存在现有标头,或者我是否应该创建一个自定义标头):
example.com -H "Server-ID: 1"

【问题讨论】:

    标签: rest http request load-balancing


    【解决方案1】:

    只需为您允许客户端直接调用它的服务器创建公共域名,然后配置 DNS,以便它可以根据 HTTP 请求的域名将请求路由到它们或负载均衡器。

    例如,您的服务器可能有以下域名:

    • api.example.com 用于负载均衡器
    • api-server1.example.com for Server1
    • api-server2.example.com for Server2

    然后让客户端通过在API调用中配置对应的域名来选择使用哪些服务器。

    现实生活中的一个例子是Mixpanel API。你可以看到他们有两种服务器让API客户端通过不同的域名来选择使用哪一种。

    【讨论】:

    • 这种使用单独域名的实现的一个缺点是 OP 需要多个 SSL 证书或通配符证书。另一方面,也有优势。使用多个子域,浏览器可以建立更多的并发连接。
    • 是或否。另一方面,优点是 OP 不需要配置负载均衡器来了解如何解释 API 请求的设计,因此它需要将请求路由到特定服务器
    【解决方案2】:

    很抱歉,您可以访问负载平衡器的代码吗? 因为如果这样做,您可以让负载均衡器询问用户。

    如果是网站,负载均衡器可能会返回一个简单的单选表单,用户必须在其中选择自动、服务器 1 或服务器 2。 Auto 将导致负载均衡器自行决定。

    如果是应用程序,则应用程序可以在服务器 1、2 和自动之间自动询问用户。 不过,为了获得最佳 UI/UX 实践,默认情况下应选择/选中“自动”。

    如果您没有太多控制权,也许可以使用较少的系统资源将用户引导到服务器,然后发送表单?

    但它似乎是另一回事。我觉得提到“获取”一词,您的客户端后端代码将与服务器通信?

    在这种情况下,这真的无关紧要,因为用户不必记住任何东西。它可能是 1204829 的子域。yourdomain.extension 等等。 不过我不会推荐这样的东西:

    POST example.com
    some headers:some values
    
    `
    {
    "server":1
    //other data
    }
    `
    

    我之所以这么说是因为服务器(或负载平衡器)将收到的最后一件事是 POST 请求的正文。

    所以是的,子域更好,因为这是服务器将收到的第一件事。然后是 URL 参数,然后是标题,然后是正文(在最常见的 GET 请求中不存在)。 我已经把我知道的都告诉你了,希望你能得出结论!

    问题是,你为一件非常小的事情担心太多了。 没关系。只需专注于制作该应用!

    【讨论】:

      【解决方案3】:

      我最终通过 HTTP 标头实现了这一点:

      GET example.com                    # server 1 or 2 (load balancer decides)
      GET example.com -H "Server-ID: 1"  # routes to server 1
      GET example.com -H "Server-ID: 2"  # routes to server 2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-18
        • 2019-09-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多