我们计划采用微前端,我们的项目是在 Asp.Net Core MVC 中,我们希望在其中拥有多个应用程序,每个应用程序由不同的团队拥有,他们可以独立开发、测试和部署。我正在寻找的是,如果前端的每个组件都有自己的 URL,因为我们希望组件可以独立部署,单独的 URL 意味着它是自己的服务器和主机环境,那么我们如何管理跨多个组件的会话?如果有人可以指导微前端考虑,那也很棒:
- 安全
- 独立可部署组件
- 在组件之间传递事件或共享数据
- 按母版页编排组件
我们计划采用微前端,我们的项目是在 Asp.Net Core MVC 中,我们希望在其中拥有多个应用程序,每个应用程序由不同的团队拥有,他们可以独立开发、测试和部署。我正在寻找的是,如果前端的每个组件都有自己的 URL,因为我们希望组件可以独立部署,单独的 URL 意味着它是自己的服务器和主机环境,那么我们如何管理跨多个组件的会话?如果有人可以指导微前端考虑,那也很棒:
你的问题非常开放。我们在过去一年实施了微前端,所以这就是我们的做法。这绝不是做微前端的“唯一方法”。如果您还没有看过这些,它们值得一读,因为它们涵盖了设计微前端时出现的最常见的架构模式:
这些模式大致分为两类:
从技术上讲,您可以添加第三个:
我们实现了#2,上面链接的 Project Mosaic 也这样做了。我们的设计与马赛克架构略有不同。以下是我们的应用程序的工作方式:
我们有一个商店描述要渲染的模板。我们为此使用 Redis,但这可以是您想要的任何数据存储。模板包含:
一个。应沿其呈现模板的路线(这是一个正则表达式)
湾。模板中的“区域”,应该被渲染。它们包含一个 id 和一个等级,以便负责渲染的服务可以正确地对模板进行排序
C。模板中的“资源”,应该被渲染。这些包含将放置在 DOM 上的脚本和链接标签。
d。父模板(如果有)以及父模板上应呈现子模板的区域
我们有一个服务器端应用程序,它识别给定路由的正确模板,并为该路由构造 DOM 的 JSON 表示。
我们有客户端应用程序,它将 DOM 的部分表示形式维护为虚拟 DOM,将服务器端应用程序返回的 JSON 表示形式渲染到虚拟 DOM 中,虚拟 DOM 用于最终将 DOM 的实际更改渲染为路由变化。
客户端应用程序还负责使用 History API 侦听更改,并查询后端以获取沿给定路由对 DOM 表示的更新。
我们从我们开发的通用模板构建我们的微前端。完成后,我们上传到 CDN,并使用上述模板资源中的 CDN 地址沿适当的路线呈现前端。
这就是我们前端应用程序的设计方式。我们使用 Kubernetes,并利用编写自定义控制器,与自定义资源定义配对来轻松部署我们的前端。但是,您可以简单地使用任何数据存储来执行此操作,不需要 Kubernetes。
关于用户会话、身份验证等。这是我们的设置:
授权服务器
一个。提供登录页面
湾。成功登录后在本地存储中设置 JWT 令牌
用于拦截请求的客户端应用程序,从本地存储fetch
中插入Authorization
带有 JWT 令牌的标头
Traefik 反向代理的ForwardAuth功能,用于检查Authorization
to 中的 JWT:
一个。验证用户的会话
湾。识别用户
C。查找用户及其权限
数据存储 (Redis) 为给定路由建立授权要求。这与上面描述的模板非常相似。此数据存储中包含的授权信息包括:
一个。需求所属的路由(作为正则表达式)
湾。应应用的适用权限
同样,在此我们创建了一个自定义控制器和自定义资源定义,以轻松创建和删除对我们的应用程序的授权要求。但是,这不是必需的。
当请求通过反向代理时,会调用 auth 服务器,检查用户的令牌,查找他们的配置文件,查找路由的应用程序要求,并与授予用户的权限进行比较。如果检查成功,则返回到 Traefik 的响应是 OK,如果不是,则401 Not Authorized
traefik 拒绝该请求。
这一切都处于相当高的水平。但是,这对我们来说实际上是一个非常好的设计,因为我们只有几个地方处理了授权,而开发人员在编写他们的前端(或后端)时不必关注授权,因为我们也使用微服务后端架构)。
希望这会有所帮助。