微服务集群中的授权架构

2023-12-31

我有一个具有微服务架构的项目(在 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(使用前将#替换为@)

微服务集群中的授权架构 的相关文章

  • SQLAlchemy:覆盖查询中关系定义的“order_by”

    所以 我有一个类似的模型 class Foo model tablename foo id Column Integer primary key True data relationship FooData cascade all dele
  • 使用 numpy 和 matplotlib 绘制总和直方图,而不是计数

    我有一些每行两列的数据 就我而言 工作提交时间和区域 我使用 matplotlib 的 hist 函数生成一个图表 其中 x 轴上按天划分时间 y 轴上按天计数 import numpy as np import matplotlib py
  • python: 将“5,4,2,4,1,0”转换为 [[5, 4], [2, 4], [1, 0]] [重复]

    这个问题在这里已经有答案了 有没有一种 直接 的方法来转换包含 数字到 x y 整数列表中 from 5 4 2 4 1 0 3 0 5 1 3 3 14 32 3 5 to 5 4 2 4 1 0 3 0 5 1 3 3 14 32 3
  • NE、SW 盒内的 GeoDjango

    我正在使用 Google 地图创建一个地理应用程序 并收到 2 个坐标的边界框 东北 西南 我有一个带有 PointField 的模型 from django contrib gis db import models class Place
  • 如何在 PyQt5 GUI 中快速绘制 matplotlib 实时绘图

    几年前 我已经尝试过嵌入现场matplotlib中的情节PyQt5图形用户界面 实时绘图显示从传感器捕获的实时数据流 某些过程 我已经成功了 您可以在此处阅读相关帖子 您自己的 GUI 中的 Matplotlib 动画 https stac
  • 如何测试 Django CreateView?

    我想在 Django 上练习测试 并且我有一个要测试的 CreateView 该视图允许我创建一个新帖子 我想检查它是否可以找到没有发布日期的帖子 但首先我测试带有发布日期的帖子只是为了习惯语法 这就是我所拥有的 import dateti
  • 子进程+多重处理-按顺序执行多个命令

    我有一组命令行工具 我想在一系列文件上并行运行 我写了一个 python 函数来包装它们 看起来像这样 def process file fn print os getpid cmd1 echo fn p subprocess Popen
  • Tkinter Checkbutton 不会更改我的变量

    我正在尝试将 Checkbutton 与函数一起使用 my var 永远不会改变 但它总是调用我的函数 这里是代码 my var False def controllo carta global my var print str my va
  • Python,Tkinter:如何获取可滚动画布上的坐标

    我有一个带有滚动条的 Tkinter 画布 还有一些项目 当我单击它们时 它应该返回坐标 使用Python 这对于窗口中最初可见的对象效果很好 但是 当我向下滚动并且画布上更下方的项目进入视图时 单击时我不会获得它们的画布坐标 而是获得窗口
  • 如何测试 Python readline 完成情况?

    我正在用 Python 编写一个命令行界面 它使用 readline 模块来提供命令历史记录和完成 虽然在交互模式下一切正常 但我想对完成功能运行自动化测试 我天真的第一次尝试涉及使用文件作为标准输入 my app lt command f
  • 在Python 3中从网络下载文件

    我正在创建一个程序 通过读取同一游戏 应用程序的 jad 文件中指定的 URL 从 Web 服务器下载 jar java 文件 我正在使用Python 3 2 1 我已经设法从 JAD 文件中提取 JAR 文件的 URL 每个 JAD 文件
  • Kubernetes 集群中的 Websocket 连接与 nginx-ingress

    我正在尝试在 Kubernetes 集群中运行的服务器上建立一个简单的 Websocket 连接 Websocket 连接能够在我的本地测试计算机上建立 但在使用 nginx ingress 部署到 GKE 后 我无法将客户端连接到服务器
  • 如何使用 pytest 和模拟为使用 Python 的 http.client 库的函数创建单元测试?

    如何使用 pytest 为以下函数编写模拟测试 import http client def get response req type host sub domain payload None headers None body None
  • 如何在 psycopg 中使用 SELECT 查询找到空值?

    我在 python 中使用 psycopg2 库INSERT当我用 None 插入 null 值时 查询效果很好 但是当我想做的时候SELECTnull 值 None 不返回任何值 cur execute SELECT id FROM re
  • python中的蓝牙编程[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有好的Python 蓝牙编程库 我尝试了 PyBluez 但 Eclipse 无法识别模块蓝牙 谁
  • NumPy“记录数组”或“结构化数组”或“recarray”

    NumPy 结构化数组 记录数组 和 记录数组 之间有什么区别 如果有的话 The NumPy 文档 http docs scipy org doc numpy user basics rec html暗示前两个是相同的 如果是 那么该对象
  • 使用 python 在 txt 文件中查找字符串的最佳方法是什么?

    使用 python 在 txt 文件中查找字符串一定有多种方法 但最好的方法是什么 为了速度 为了资源 我的第一个想法如下 file open home socfw src edl outbound monthly txt inputIP
  • 静态文件在生产环境中加载,但在开发环境中不加载

    通常我遇到的这个问题恰恰相反 在我的开发环境中 我的 Django 应用程序不会加载一些静态文件 特别是我自己添加的静态文件 即我添加到我的应用程序中的两个包 admin and ckeditor 都加载得很好 但是我自己创建并链接了两个文
  • 如何在 django 模板中转义 {{ 或 }} ?

    姜戈款待 var 作为其模板中的一些变量 我该如何逃脱 var or or 这样 django 不会将其视为变量 p some text p 打印出来应该一模一样 Django 1 5 介绍 verbatim https docs djan
  • 处理导入模块异常

    Python 中如何处理模块特定的异常 例如 如果我想捕获 python 中 sqlite3 模块抛出的错误 我将在 中放置什么来处理该异常 import sqlite3 try except 答案已经在这里了如何在Python中引用异常类

随机推荐