【问题标题】:Asp.Net Web Api Versioning with Load Balancer (Layer 4)带负载均衡器的 Asp.Net Web Api 版本控制(第 4 层)
【发布时间】:2014-04-25 22:09:11
【问题描述】:

我目前负责使用 .Net 和 Web Api 开发一个相当复杂的 REST api。

该接口稍后应由各种公共和私人(内部)客户端使用。 我读了很多关于你应该如何对你的 api 进行版本控制的文章,但意见似乎非常不同。

应用程序在多服务器环境中的负载平衡器后面运行。

现在我的问题是,负载均衡器受到严格限制,仅支持第 4 层负载均衡,因此我无法检查传入请求的 URL/标头等以将它们路由到正确版本的应用程序.

我们不想在我们的代码库中使用版本化的 api 控制器,因为我们有很多应该经常更新的外部依赖项,所以我们可能会破坏一些功能。

目前它似乎是使用子域进行版本控制的唯一解决方案,例如

ver1.api.domain.com

有什么反对这种方法的,你有其他解决方案吗?

【问题讨论】:

  • 即使在级别 4 上完成负载平衡...如果目标服务器不支持所需的服务版本,将请求转发到另一台服务器有什么问题?特别是如果磅使用循环赛 IMO 之类的简单方法完成,不会影响性能。
  • 所以我需要设置另一种可以解析的负载均衡器(在第 4 层之后),例如标头将请求转发到正确的服务器。如果可能的话,我想避免这种情况。

标签: c# asp.net rest web-applications asp.net-web-api


【解决方案1】:

这种版本控制方法的问题是所有资源都会有重复的条目,包括未修改的条目。

在我看来,更好的方法是在 Uri 中包含资源的版本。 让我们看一个具体的例子。假设有一个像下面这样的 CarsController:

public class CarsController : ApiController
{
    [Route("cars/{id}")]
    public async Task<IHttpActionResult> Get(int id)
    {

        DoSomething();

        return Ok(result);
    }


}

在第一个版本之后,我们引入了第二个版本的Get方法,我们可以这样做

[Route("cars/{id}/v2")]

public async Task<IHttpActionResult> GetCarsVersion2(int id)
{
    DoSomethingElse();

    return Ok(result);

}

所以现有客户端仍然引用旧的 Uri /Cars/{id},而新客户端可以使用新的 Uri /Cars/{id}/v2。

此外,如果两个版本之间的差异不大,可以重构原始实现以满足新的需求。这反过来又减少了代码重复。

【讨论】:

  • 就版本控制问题而言,这似乎是一个有效的答案。但这仍然不能解决我的第 4 层负载均衡问题。
猜你喜欢
  • 2023-03-14
  • 2021-12-04
  • 2021-12-07
  • 2013-08-26
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
相关资源
最近更新 更多