使用函数计算构建健壮、高并发、稳定的第三方 Token 缓存服务

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介: 本服务作为获取其它服务商 Api Token 的桥梁,提供 Token 的获取和缓存等功能,并内嵌灵活的配置以覆盖大部分的从其他服务商获取 Token 的场景。

使用 Serverless 构建第三方 Token 缓存服务

通常地,第三方平台 API 认证采用 OIDC 协议,应用需要携带 Token 访问资源 API,资源服务 API 会通过拦截器查验 Token 中的 scope 字段是否包含特定的权限项目,从而决定是否返回资源。第三方平台通常会对 Token 的获取限制频率。

本服务作为获取其它服务商 Api Token 的桥梁,提供 Token 的获取和缓存等功能,并内嵌灵活的配置以覆盖大部分的从其他服务商获取 Token 的场景。

项目使用阿里巴巴出品的函数计算开发框架 MidwayJs 进行函数开发、构建、发布,支持腾讯云、阿里云等多个云服务提供商部署,本服务的开源地址:https://github.com/Geeeeeeeeeek/serverless-token-server

特性

  • Serverless 部署,零成本部署和运维
  • 灵活的服务商配置、自定义密钥存储、Token 等信息通过 mysql 进行持久化
  • 缓存官方返回的数据,在有效时间内复用
  • 防集中过期导致的爆发性请求

服务拓扑

graph.png

graph TB
App(使用 Token Server 服务的外部应用) --> token-server-cache
Admin(Token Server 管理端) --> token-server
App --> token-server(serverless-token-server)
token-server-cache --token,expires_in--> App
token-server --token,expires_in--> App

token-server-cache(serverless-token-server-cache) ---> token-server
token-server --> cache{Cache}
cache --hit--> Database((Datebase))
cache --miss--> Upstream
cache --token,expires_in--> token-server
Upstream --token,expires_in--> Database

classDef box stroke:#333,stroke-width:4px;
classDef orange fill:#f96,stroke:#333,stroke-width:4px;
class cache orange
class Upstream box

测试结果(ab 测试、监控指标、费用预估)

1.使用 ab 测试工具并发设置 300,连续请求 5s,粗略得到 QPS 为 1700:

  • 为什么设置并发数为 300,因为阿里云函数计算默认最大并发为 300

ab

2.阿里云函数计算监控指标:

  • 请求次数约 1 万次
  • 函数并发实例 250 个
  • 函数错误次数 0 次

faas

3.函数计算费用预估

  • 1 万次函数调用费用预估约 1.39 元

cost

支持平台(已验证)

企业微信 API-企业内部开发

curl -H 'Content-Type: application/json' --data-binary '
{
  "id": "qywx_qynbkf",
   "config": {
           "url": "https://qyapi.weixin.qq.com/cgi-bin/gettoken",
           "method": "GET",
           "arguments": [
               {
                   "name": "corpid",
                   "place": "url",
                   "value": "$key_1"
               },
               {
                   "name": "corpsecret",
                   "place": "url",
                   "value": "$key_2"
               }
           ],
           "token_path": "access_token",
           "content_type": "json",
           "expires_in_path": "expires_in"
           }
}
' /api/realm

微信公众号 API-微信公众号开发

  • 创建平台信息
curl -H 'Content-Type: application/json' --data-binary '
{
  "id": "wxgzh",
   "config": {
           "url": "https://api.weixin.qq.com/cgi-bin/token",
           "method": "GET",
           "arguments": [
               {
                   "name": "appid",
                   "place": "url",
                   "value": "$key_1"
               },
               {
                   "name": "secret",
                   "place": "url",
                   "value": "$key_2"
               },
               {
                   "name": "grant_type",
                   "place": "url",
                   "value": "$key_3"
               }
           ],
           "token_path": "access_token",
           "content_type": "json",
           "expires_in_path": "expires_in"
           }
}
' /api/realm

RoadMap

🚀 表示已经实现的功能,👷 表示进行中的功能,⏳ 表示规划中的功能,🏹 表示技术方案设计中的功能。

功能 状态 发布版本
上游服务商并发限制,超时设计 👷 进行中
token 控制台管理页面(react) 🏹 设计中
日志记录 🏹 设计中
支持固定 token 模式 ⏳ 规划中
serverless 函数计算部署 🚀 已完成 V1.0
token 获取、缓存机制 🚀 已完成 V1.0
realm 服务商、secret 应用密钥 crud 管理 🚀 已完成 V1.0

使用方式(API 文档)

1.查看是否有对应的 Token 上游提供服务商信息

Request

  • Method: GET
  • URL: /api/realm

Response

  • Body
{
  "data": {
      "list": object[]
      "total": number
  },
  "success": "ok"
}

2.新建 Secret

Request

  • Method: POST
  • URL: /api/secret
  • Data:
{
  "realm": "wxgzh", // Token 上游服务提供商 id
  "key": "wxgzh_secret", // 获取本 Token Server 的 Token 唯一标识
  "key_1": "******************",
  "key_2": "******************",
  "key_3": "client_credential"
}

Response

  • Body
{
  "realm": "wxgzh",
  "key": "wxgzh_secret",
  "key_1": "******************",
  "key_2": "******************",
  "key_3": "client_credential"
}

示例(以微信公众号 API 为例)

curl -H 'Content-Type: application/json' --data-binary '
{
    "realm": "wxgzh",
    "key": "wxgzh_secret",
    "key_1": "******************",
    "key_2": "******************",
    "key_3": "client_credential"
}
' /api/secret

3.获取 Token

Request

  • Method: GET
  • URL: /api/token
  • Data:
{
  "realm": "wxgzh", // Token 上游服务提供商 id
  "key": "wxgzh_secret", // 获取本 Token Server 的 Token 标识
  "flush": false // 强制刷新 token,立即从上游服务商获取最新的 token
}

Response

  • Body
{
  "token": "***",
  "expires_in": 7200000, // 毫秒级单位
  "source": "database"
}
相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
4月前
|
缓存 Java 数据库连接
mybatis复习05,mybatis的缓存机制(一级缓存和二级缓存及第三方缓存)
文章介绍了MyBatis的缓存机制,包括一级缓存和二级缓存的配置和使用,以及如何整合第三方缓存EHCache。详细解释了一级缓存的生命周期、二级缓存的开启条件和配置属性,以及如何通过ehcache.xml配置文件和logback.xml日志配置文件来实现EHCache的整合。
mybatis复习05,mybatis的缓存机制(一级缓存和二级缓存及第三方缓存)
|
14天前
|
人工智能 Serverless API
尽享红利,Serverless构建企业AI应用方案与实践
本次课程由阿里云云原生架构师计缘分享,主题为“尽享红利,Serverless构建企业AI应用方案与实践”。课程分为四个部分:1) Serverless技术价值,介绍其发展趋势及优势;2) Serverless函数计算与AI的结合,探讨两者融合的应用场景;3) Serverless函数计算AIGC应用方案,展示具体的技术实现和客户案例;4) 业务初期如何降低使用门槛,提供新用户权益和免费资源。通过这些内容,帮助企业和开发者快速构建高效、低成本的AI应用。
58 12
|
5月前
|
缓存 NoSQL 网络协议
【Azure Redis 缓存】Lettuce 连接到Azure Redis服务,出现15分钟Timeout问题
【Azure Redis 缓存】Lettuce 连接到Azure Redis服务,出现15分钟Timeout问题
【Azure Redis 缓存】Lettuce 连接到Azure Redis服务,出现15分钟Timeout问题
|
5月前
|
缓存 NoSQL Java
【Azure Redis 缓存】示例使用 redisson-spring-boot-starter 连接/使用 Azure Redis 服务
【Azure Redis 缓存】示例使用 redisson-spring-boot-starter 连接/使用 Azure Redis 服务
|
1月前
|
运维 Serverless 测试技术
通义灵码 x 函数计算:构建高效开发流程,加速项目交付
本方案基于通义大模型的通义灵码,提供代码生成、补全、优化及单元测试生成等能力,提升编码效率和质量。结合云效和函数计算 FC 进行代码管理、持续集成、部署发布,加速项目交付,为开发者提供智能编码、CI/CD、部署上线体验,加快产品迭代速度。
|
2月前
|
缓存 NoSQL 中间件
redis高并发缓存中间件总结!
本文档详细介绍了高并发缓存中间件Redis的原理、高级操作及其在电商架构中的应用。通过阿里云的角度,分析了Redis与架构的关系,并展示了无Redis和使用Redis缓存的架构图。文档还涵盖了Redis的基本特性、应用场景、安装部署步骤、配置文件详解、启动和关闭方法、systemctl管理脚本的生成以及日志警告处理等内容。适合初学者和有一定经验的技术人员参考学习。
238 7
|
3月前
|
缓存 弹性计算 NoSQL
新一期陪跑班开课啦!阿里云专家手把手带你体验高并发下利用云数据库缓存实现极速响应
新一期陪跑班开课啦!阿里云专家手把手带你体验高并发下利用云数据库缓存实现极速响应
|
4月前
|
Cloud Native 关系型数据库 Serverless
基于阿里云函数计算(FC)x 云原生 API 网关构建生产级别 LLM Chat 应用方案最佳实践
本文带大家了解一下如何使用阿里云Serverless计算产品函数计算构建生产级别的LLM Chat应用。该最佳实践会指导大家基于开源WebChat组件LobeChat和阿里云函数计算(FC)构建企业生产级别LLM Chat应用。实现同一个WebChat中既可以支持自定义的Agent,也支持基于Ollama部署的开源模型场景。
759 26
|
3月前
|
存储 缓存 NoSQL
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
79 4
|
3月前
|
缓存 NoSQL Ubuntu
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
66 3