ASP.NET核心Api-网关中间件

ASP.NET Core Api-Gateway middleware

我是 API 网关的新手,有一个理解问题。 我也尝试将一系列(微)服务放在端点后面。

为此,我设置了一个 ASP.NET 核心应用程序并添加了包 ThreeMammals Ocelot。 在文档的帮助下,我配置了上游和下游。 到目前为止,还不错。

客户端向 http://mygateway:4242/s1/{api} 发出请求,例如,按预期从 Service1 获得 JSON 或 XML 响应。

http://mygateway:4242/s2/{api} 的行为与预期结果相同!

我的理解问题在于 Service3。 当我向 http://mygateway/s3/ 发送请求时,我收到 index.html 作为响应。

index.html 本身需要 CSS-File 'xyz.css' 通过 link-tag 并强制客户端加载文件。

<head>
  <link rel="stylesheet" type="text/css" href="xyz.css">
</head>

在这种情况下,客户端发送到 "mygateway" 的请求 URL 是 http://mygateway:4242/xyz.css 而不是 http://mygateway:4242/s3/xyz.css 所以响应是 404 未找到,因为 "mygateway" 对 "xyz.css"[= 一无所知21=]

我该如何解决这个路由(?)问题?

能不能用ocelot中间件解决这个问题?或者我是否需要使用 SinglePageApplication (SPA) 的服务 (Service3) 的其他内容?

也许将 SPA 放在网关后面是不可能的还是错误的? 我希望你能给我一些提示,以访问网关后面的 SPA 或 MVC 网站。

谢谢 iBot


更新: 附上index.html的代码。我认为这是直截了当的。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Title</title>
    <base href="/" />

    <link rel="stylesheet" type="text/css" href="dist/xyz.css">

</head>
<body>
    <div id="appContainer"></div>
    <script src="dist/xyz.js" asp-append-version="true"></script>
</body>
</html>

你可以尝试写<base href="/s3/" />而不是<base href="/" />

但是在网关之前最好使用SPA或者MVC。在大多数情况下,这取决于您将如何使用它。例如,如果你喜欢像你域的代理(例如 Nginx)一样使用它,这是有道理的。

See this good article about it.

你的架构设计错了!

首先,让我们找出 API 网关是什么。

An API Gateway is programming that sits in front of an application programming interface (API) 并充当已定义微服务组的单一入口点。

使用 API 网关的一个主要好处是它们允许开发人员根据用例以多种方式封装应用程序的内部结构。这是因为,除了满足直接请求外,网关还可用于调用多个后端服务并聚合结果。

好的,名称“API 网关”向我们表明它主要用于 API 服务! SPA 或 MVC 应用程序不是后端服务。你不应该把你的前端应用程序放在 api 网关后面。

一般来说,您的架构应该如下所示:

API 网关是所有客户端的单一入口点。 SPA 是您服务的客户端,应通过 API 网关调用它。如果您的应用程序有多个客户端应用程序,那么在识别多个 API 网关类型时,这可能是一个主要的支点,这样您就可以为每个客户端应用程序的需求提供不同的外观。这种情况是一个名为 “Backend for Frontend” (BFF) 的模式,其中每个 API 网关可以为每个客户端应用程序类型提供不同的 API。

如果您不想构建合适的架构怎么办?

  1. 您可以配置重定向。它类似于指定 API 网关的默认服务。然后所有转到 http://mygateway:4242/ 的客户端将重定向到 http://mygateway:4242/s3/
  2. Ocelot 允许中间件注入。因此,您可以注入您的自定义中间件,您将在其中检查哪个请求以及将其重定向到何处。
  3. 使用 CDN 存储所有 css 和其他内容。
  4. 将 css 内联到 html 个文件中。