SPA,微服务和Kubernetes(架构问题)



首先,我要说的是,我对 Kubernetes 和微服务架构总体上相当陌生。我还要说,这更像是一个高级架构问题,而不是寻求与技术相关的规范性操作建议。我想我可以弄清楚实现细节,但我不确定有什么机制可以让我到达我想去的地方。

应用概述

在 K8s 集群上运行的简单"电子商务"示例应用程序。SPA 前端,具有用于 API 的 .NET Core 服务。

客户端(前端(

AngularSPA构建并部署到NGinx容器中,该容器将Angular App作为静态站点提供。它在群集上作为LoadBalancer服务运行。

服务(后端(

两个简单的服务在群集中ClusterIP运行。让我们称它们为产品和订单。

问题

部署 SPA 时,它会从用户的浏览器而不是容器向服务发出请求。这些服务未在LoadBalancer配置中运行,因此它们不会在群集外部公开。此处让客户端应用程序与服务通信的最佳做法是什么?具体说来:

  • 我真的需要在外部公开每个微服务吗?
  • 是否有某种代理技术,我可以在其中公开单个<cluster>/api终结点,以路由到适当的后端服务?
  • Angular Universal(又名服务器端渲染(在这里可以发挥作用吗?
  • 我可以查看任何可参考的存储库作为示例?

我搜索了SO并发现了类似的问题,但没有一个确切地问这个问题。如果有人向我指出一个现有的启发我的问题,我很乐意删除这个问题。

我真的需要在外部公开每个微服务吗?

不,你不应该。

是否有某种代理技术,我可以在其中公开单个/api 终结点,以路由到相应的后端服务?

标准方法是使用 nginx 作为代理。

我可以查看任何可参考的存储库作为示例?

你可以查看我的玩具项目:

  • Nginx部分在这里 - https://github.com/taleodor/mafia-vue/tree/master/nginx
  • 部署包装项目 - https://github.com/taleodor/mafia-deployment
  • 写下所有东西如何组合在一起 - https://itnext.io/building-kubernetes-cicd-pipeline-with-github-actions-argocd-and-reliza-hub-e7120b9be870

具体来说,这就是你从上面的玩具项目中引用nginx中的后端api的方式(注意它使用的是websockets,这可能不适合你(:

location /api {
proxy_pass http://backend;
proxy_set_header Host            $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header        X-Forwarded-Proto $http_x_forwarded_proto; # aws version - essentially this sets https schema
# enable WebSockets
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}

一种想法是Angular应用程序,你可以作为静态网站,或者可以部署到另一个CDP中。

是否有某种代理技术,我可以在其中公开单个/api 终结点,以路由到相应的后端服务?

我认为你应该使用 kubernetes 入口(默认为 nginx,但你可以使用 traefik 等(,这里的重点是你只需要使用负载均衡器服务公开 kubernetes 入口,然后你可以使用入口规则路由你的流量。

我不知道你在哪里工作...云或本地。我必须在本地执行此操作,并且我正在使用MetalLb作为负载均衡器。金属磅

我建议您观看这个惊人频道的视频:justmeandopensource

nginx Ingress with metallb

nginx 入口裸机,带有 ha 代理作为负载均衡器

对不起,如果我在这里错过了一些快速回复! :)

最新更新