ASP.NET Core Api-Gateway 中间件

15

我对API网关还很陌生,有一个理解上的问题。我想把一系列(微)服务放在一个端点后面。

为此,我建立了一个ASP.NET Core应用程序,并添加了ThreeMammals Ocelot包。 通过文档的帮助,我配置了上游和下游。 到目前为止,一切都很好。

sketch

客户端向http://mygateway:4242/s1/{api}发出请求,并从Service1获取JSON或XML响应,就像预期的那样。

对于http://mygateway:4242/s2/{api}也是同样的情况,得到了预期的结果!

我的理解问题出现在Service3上。 当我发送请求到http://mygateway/s3/时,我得到了index.html作为响应。

index.html本身通过link标签要求加载CSS文件'xyz.css'并强制客户端加载该文件。

<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”一无所知。

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

是否可以使用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>

你能分享index.html的代码吗? - Chetan
嗨,Chetan Ranpariya,我已经更新了问题,并附上了index.html的片段。谢谢iBot。 - mMilk
2个回答

14

你的架构设计是错误的!

首先,让我们了解一下API网关。

API网关是一种程序,它位于应用程序编程接口(API)前面,并作为定义的一组微服务的单个入口点。

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

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

总的来说,您的架构应该像这样: enter image description here

一个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文件中。

1
谢谢Roman Marusyk,我会重新考虑我的架构设计想法 :) 我也会看看你建议的选项。问候iBot - mMilk
1
非常感谢Roman Marusyk,您能介绍一下最适合在.Net上使用的API网关吗?我知道如何使用'Ocelot'创建网关,但它是否是.Net上最好的选择? - Shadman
1
@MohammadShadman 对于 .net,您可以使用任何现有的网关。它与 Kong、Traefik、Kubernetes Ingress 和 Azure API Management 都很兼容。我在需要添加一些自定义逻辑的项目中使用了 Ocelot(因为它是用 C# 编写的,非常容易扩展)。否则,我建议使用 Kubernetes Ingress(如果您有一个 k8s 集群)或 Azure API Management(如果您托管在 Azure 上)。对于其他情况,可以使用 Kong 和 Traefik。 - Roman Marusyk

0

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

但最好在网关之前使用SPA或MVC。在大多数情况下,这取决于您将如何使用它。例如,如果您想将其用作域的代理(例如Nginx),那么这是有意义的。

请参阅此优秀文章


你好 Ярослав Виталиевичm,感谢您提供的关于基础路径的提示。这对我控制和可以更改的服务有效。但是,我无法更改的第三方服务将无法使用此方法。 例如,我们购买了一个报告组件,它公开运行在Tomcat服务器上的网站。当我将它们放在api-gateway后面时,就遇到了问题:/ - mMilk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接