当前位置:首页 > 技术文章 > 正文内容

星云中台调用黑洞引擎,一个token还是两个token呢?

arlanguage3个月前 (01-31)技术文章30

背景

在前面星云图形中台设计理念这篇文章中,我们介绍了星云中台所采用的高性能国产图形引擎——黑洞引擎。要实现与黑洞引擎的顺畅对接,首先必须成功获取黑洞引擎的 Token。更重要的是,在用户使用星云中台时,我们需要确保该 Token 始终有效,避免因 黑洞Token 过期而导致的中断和操作失败。

两个token方案

在最初的设计阶段,我们采用了前端保存两个 Token 的方式,即一个第三方系统的token和一个黑洞token。该方式包括以下两个步骤:

第一步:生成两个token。

(1)用户登录嵌套中台的第三方系统(如星云系统)时,首先调用本系统接口生成自身的 Token。

(2)成功生成自身 Token 后,调用中台接口来生成黑洞 Token。该接口会收集必要参数,调用黑洞引擎生成 Token,成功后将 Token 返回给前端。

(3)第三方系统的前端将自身 Token 和黑洞 Token 保存到 Cookie 中。

第二步:使用黑洞token访问黑洞系统。

(1)当前端发起对黑洞系统接口的调用时,首先从 Cookie 中解析黑洞 Token,并将其放入请求 Header 中。

(2)中台的 Nginx 转发请求至黑洞系统。

(3)同时,利用 Nginx 的流量复制功能(通过配置 /mirror),在请求转发到黑洞系统的同时,也将请求转发到中台的刷新 Token 接口。该接口会同时刷新第三方系统的 Token 和黑洞 Token 的有效期,确保它们的生命周期一致。代码如下:

location /blackholeapi/ {
  mirror /mirror;
  proxy_pass https://${engine_addr}/;
}
location  /mirror {
  internal;
  proxy_pass http://${gateway_addr}/bjuserplatform/refreshToken;
}

(4)黑洞系统验证 Token,通过验证后处理用户请求,并返回相应结果。

在初期,我们采用这种方式,虽然能够实现对黑洞系统的访问,并确保两个系统 Token 的生命周期一致,但给前端同学带来了很大困扰。前端不仅需要维护两个 Token,还要根据不同的请求知道该带上哪个 Token。尤其是在移动端接入图形引擎功能时,这一过程需要重复实现。更为关键的是,如果星云中台未来需要对接客户的第三方系统,这样复杂的对接方案,客户是否能够接受呢?

一个token方案

于是,我们开始思考,是否可以让用户始终使用自身系统的 Token,在访问黑洞系统时,通过后端动态获取黑洞 Token,再进行访问。最简单的方案是将黑洞相关操作封装在后端接口中,统一处理。然而,这引发了后端同学的异议——前端本可以直接调用黑洞接口,为什么还要经过后端这一层?而且,多加一层后端调用无疑会影响性能。那么,能否将生成黑洞 Token 的过程移到 Nginx 层呢?Lua 可以实现这个需求,但这会引入新的技术栈,增加运维复杂度。此时,运维团队也觉得在 Nginx 层实现会带来不必要的负担。经过深入查阅资料,我们终于发现了 Nginx 的 auth_request 指令,它能够在 Nginx 层实现鉴权,解决我们的问题。

(1)用户发起对黑洞系统接口的请求。

(2)请求首先经过第三方系统的 Nginx,并被转发至中台的 Nginx。

(3)在中台 Nginx 转发请求至黑洞系统之前,通过 auth_request 指令调用中台的生成黑洞 Token 接口。此调用经过网关(Gateway),对用户携带的第三方 Token 进行认证,认证通过后,才将请求转发至用户服务。用户服务调用黑洞系统接口生成黑洞 Token,并将 Token 返回给 Nginx。这一步,可以简称为“用第三方系统的token换黑洞token”。

(4)中台 Nginx 使用 auth_request_set 指令将生成的黑洞 Token 保存到变量 bh_token 中,然后通过 proxy_set_header 指令将该 Token 设置到请求黑洞系统的 Header 中的 Authorization 字段,之后将请求转发给黑洞系统。代码如下:

location /blackholeapi/ {
  auth_request /auth4Blackhole;
  auth_request_set $blacktoken $sent_http_blackholeToken;
  proxy_set_header  'Authorization' $blacktoken;
  proxy_pass https://${engine_addr}/;
}
location ~ /(auth4Blackhole) {
   internal;
   proxy_pass http://${gateway_addr}/bjuserplatform/$1;
   proxy_connect_timeout 30s;
   proxy_read_timeout  60s;
}

(5)黑洞系统处理转发过来的请求,并返回结果。

采用单一 Token 方案的最大优势在于显著简化了前端的工作流程。前端不再需要同时处理两个 Token,也不必担心两个 Token 生命周期是否保持一致的问题。无论是请求其他后端接口,还是请求黑洞接口,前端只需携带一个统一的 Token,即可完成所有操作。这种简化不仅减少了前端开发的复杂度,还提升了系统的可维护性和可靠性。

此外,单一 Token 方案对于星云中台的对接能力至关重要。它使得外部系统(如客户的第三方系统)能够更加便捷地与星云中台进行对接,避免了复杂的 Token 管理和传递问题,从而提升了整个系统的扩展性和灵活性。这一设计为未来更多的系统集成和合作奠定了坚实的基础。

总结

本文通过星云中台与黑洞系统对接的案例,详细阐述了如何通过 Nginx 的auth_request 指令,在后台隐式地获取第三方系统的 Token。这种方案不仅限于星云中台与黑洞系统的对接,而是一种通用的解决方案,适用于多种第三方系统的对接场景。无论是需要处理复杂身份验证、还是需要多个系统之间共享 Token,这种方式都能显著简化 Token 的管理和生命周期控制,降低集成的复杂度。

我是维搭的小刘,非常期待与您一起深入探讨,共同探索更多的实现方案和技术细节。

扫描二维码推送至手机访问。

版权声明:本文由AR编程网发布,如需转载请注明出处。

本文链接:http://www.arlanguage.com/post/1373.html

分享给朋友:

“星云中台调用黑洞引擎,一个token还是两个token呢?” 的相关文章

2022年从零开始,用一篇博客掌握 nginx 的初级配置

当 nginx 安装之后,默认的配置如下所示(数据来源为宝塔自动生成),本篇博客重点介绍的是配置虚拟机相关内容,即 server 块配置项。 server 块的指令主要用于设置主机和端口, location 块用于匹配网页路径,一个 http 块可以包含多个 server 。基础配置server {...

nginx -> frps -> frpc -> 内网服务器

1. Nginx简介概述Nginx是一个高性能的HTTP和反向代理服务器,也可以作为邮件代理服务器。它以其高并发处理能力、低内存占用和高效的事件驱动模型而闻名。其主要功能包括处理静态文件服务、反向代理、负载均衡等。例如,在处理大量的静态网页请求时,Nginx可以快速地将请求对应的静态文件发送给客户端...

使用Keepalived实现Nginx的自动重启及双主热备高可用

推荐阅读:20年清华架构师耗时整整一百天打造1000+道Java高频面试手册1、概述之前我们使用Keepalived实现了Nginx服务的双机主备高可用,但是有几个问题没有解决,今天一起探讨一下。1)在双机主备机制中,Keepalived服务如果宕了,会自动启用备机进行服务,但Nginx服务如果负载...

Linux系统非root用户下安装Nginx

通常使用Nginx或者Apache作为Web服务器时,默认监听80端口,因此默认会使用root用户去安装,而且,使用yum命令安装时,通常会安装到默认的路径下,默认路径通常是root用户才有执行权限的。如果不需要使用Nginx监听1024以下的端口,且对权限和网络管理比较严格时,能用非root权限解...

Linux下如何用nginx+ffmpeg搭建流媒体服务器

安装ffmpeg安装过程略安装完成后,检查是否安装成功。比如我这里采用向pili推流的方式,将本地的一个mp4视频推流到七牛pili。ffmpeg -re -i /tmp/ffmpeg_test.mp4 -vcodec copy -acodec copy -f flv "rtmp://pil...

PHP日志记录

背景在生产环境中日志的重要性显而易见,能快速定位问题和程序的调优。在LNMP架构中怎么记录好程序中的错误日志。设置error_log记录PHP日志信息#将会向PHP报告发生的每个错误 error_reporting = E_ALL #关闭页面显示才能将错误回写到日志文件 display_err...