我有一个具有微服务架构的项目(在 Docker 和 Kubernetes 上),2 个主要应用程序是使用 AIOHTTP 和 Django 用 Python 编写的(还有 Ingress 代理、静态文件服务器,还有一些是用 NginX 制作的)。我想将这些 Python 应用程序拆分为单独的较小的微服务,但为了实现这一目标,我可能还应该将身份验证移至单独的应用程序中。但我该怎么做呢?
也许我还应该补充一点,我问的不是特定的身份验证方法,如 OAuth、JWT 等,而是关于集群架构内部的依赖关系和职责划分。
在我看来,一个不错的解决方案是 Ingress NginX 代理服务器的一些插件,或者之前的微服务,这样我的 Python 身份验证代理就不会关心方法目的地,比如一些中间件,只需读取标头/cookie,检查访问令牌或者sessionId,如果访问有效则设置userId,并进一步传递请求。
下面介绍了一个简短且简化的架构:
这是我的想象,少提一些复杂的联系:
但我不确定这是否合理。此外,这种方法会减少 K8s Ingress 的优势,K8s Ingress 为从 bash 更新路径表提供了令人惊叹的接口,但据我所知,不允许在它之前运行任何请求处理程序,所以我必须运行自定义 NginX 代理,无需良好的 K8s 集成。
那么,还有哪些其他可能的架构解决方案呢?
我只能想象创建一个请求处理程序,它执行所有授权并将请求传递给其他微服务(或通过 RPC),这些微服务不关心身份验证,但我不认为这通常是完美的解决方案。
Theory
嗯,在网上查了很多资料,咨询了一年半,找到了。有一种架构模式叫做API网关,它描述了集群中的一个入口点,这就是Kubernetes 入口确实如此,以及我在问题中的想象。一般情况下,它是代理服务器,它是集群微服务的唯一入口点,它可以执行缓存、DDoS 保护、它可以支持不同的 API 协议、操作 URI、管理 API 节流、货币化并执行身份验证我需要。因此,集群内部的微服务通信期间不需要进行身份验证,因为所有必需的参数、标识符都将在请求中呈现。
执行
在 Kubernetes 中,NginX 入口相当流行,它还支持Basic Auth和OAuth2,这不是一个完美的解决方案,但至少是一些东西。 Kubernetes 有替代的 Ingress 解决方案:孔大使、Traefik,它提供了更多的功能(尽管 Kong 也基于 NginX)。
在 Java 和 Spring 的世界里Spring云网关它的存在就是为了解决此类问题,就像 K8s Ingress 一样,允许使用 YAML 描述路径表,但它是可扩展的,允许轻松嵌入任何身份验证方法的自定义代码。
此外,大多数云平台都提供了自己的API网关服务,具有或多或少的功能,包括谷歌云 https://cloud.google.com/api-gateway/docs, Red Hat https://www.redhat.com/en/topics/api/what-does-an-api-gateway-do, AWS https://aws.amazon.com/ru/api-gateway/, Yandex 云 https://cloud.yandex.ru/services/api-gateway。然而,它们似乎缺乏身份验证方法,就像扩展的机会一样,尽管它们与这个问题没有太大关系。
To read
您可以在此处找到有关 API 网关模式及其实现的更多信息:
- microservices.io:API 网关模式 https://microservices.io/patterns/apigateway.html
- RedHat:API 网关有什么作用? https://www.redhat.com/en/topics/api/what-does-an-api-gateway-do
- kubernetes.github.io:NginX Ingress 外部 OAUTH
验证 https://kubernetes.github.io/ingress-nginx/examples/auth/oauth-external-auth/
- learnK8S.io:Kubernetes API 网关 https://learnk8s.io/kubernetes-ingress-api-gateway
- cloud.spring.io:Spring 云网关 https://cloud.spring.io/spring-cloud-gateway/reference/html/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)