一个基于缓存的业务链路日志记录设计方案

2023-05-16

前言

        一个简单的全接口日志设计文档,先分享设计文档,后面分享核心设计代码。

1 .对外接口设计原则

1.1.基本原则

对外接口要遵守的基本原则:
1、 开闭原则
2、 依赖倒置原则
3、 单一职责原则
4、 接口隔离原则
5、 迪米特发则(最少知道原则)
6、 里氏替换原则
7、 合成/复用原则(组合/复用原则)
以上原则还可以进行组合、剪裁,根据实际情况搭建接口框架、技术选型。

1.2.设计原则

本次设计方案按照基本原则剪裁,对外提供的API接口遵循以下设计原则:
1、 安全性
2、 幂等性
3、 数据规范统一

2.对外接口架构

2.1.接口交互流程设计
在这里插入图片描述

对外接口的交互流程设计如上:
接口请求在安全方面除了apiKey、apiSecret权限校验,再增加有效token校验。

2.1.1.安全性机制上扩展

1、 客户端黑白名单 (可以提到运维级别做基本的ip限制)
2、 客户端加强版黑白名单 (设计黑白名单、限制拒绝请求时长等)
3、 请求限流
4、 https协议,优先采用post请求
5、 请求参数增加签名防伪
6、 防止重放攻击 (业务数据)
扩展机制可以剪裁,同时实现可以采用配置文件方式实现,也可以采用统一接口管理。
从长久考虑,为方便以后运维,服务治理,接口记录、日志查看,统一接口管理方式更合适,而且是一劳永逸,后期甚至可以做到轻运维,接口日志查看、接口异常分析也更方便。

2.1.2.幂等性处理机制

        对接口统一增加幂等机制,防止恶意请求占用资源,避免资源浪费、影响性能。
同时可以考虑与客户端黑名单、接口限流机制做结合,对具体异常接口做监控、记录异常日志、设置接口限流策略,设置实时生效。

2.2.接口整体流程设计

在这里插入图片描述

以上是一个概要流程图,具体个流程细节节点与架构设计、表设计、技术选型有关。后面实现可见各分项实习的细节。

2.3.对外接口架构

在这里插入图片描述

        前期整体架构设计时就明确了BASE的统一对接地位,相当于我们的网关层。现在的对外接口架构设计是在原整体设计上扩展架构,出入口统一走BASE,BASE增加一层“路由”逻辑,主要负责接口请求全链路的相关认证、限流、路由等机制。接口实现由园xxx、生xxx、安xxx具体实现。

3.三智对外接口实现设计

3.1.机制技术实现选型

3.1.1.授权认证机制

1、静态授权:
apiKey + apiSecret方式
配合授权管理:负责apiKey、apiSecret的分配、授权有效期等基本管理
2、动态授权:
根据静态授权信息apiKey /apiSecret获取动态有效期的token,第三方请求BASE的接口携带token。
3.1.2.权限机制
1、有效token校验
2、验证接口是否开放
配合接口管理:负责接口相关信息配置,包括接口url、是否开发、版本信息,以及简单的限流策略设置等。

3.1.3.防伪机制

1、请求参数按照约定规则计算sign
2、前端按照约定生成jwt令牌,请求时携带,后端验证令牌

3.1.4.限流机制

1、配合接口配置信息,匹配限流策略做相关校验 (计数器限流)
2、配合黑白名单管理信息,做请求抛弃返回提示信息
3、令牌桶限流,使用redis-reactive或guava

3.1.5.幂等机制

基于redis简单实现(非绝对严谨):
配合sign实现,sign作为key放redis,并设置过期时长。如果key存在,则认为是重复提交。

3.2.机制模块设计

        这块的设计应该是属于一个支撑的界面配置的设计,内部实现,时间来不及,没有资源可以先不提供界面。这里的接口日志与业务日志有交叉,可以扩展支撑业务的日志。

3.2.1.接口管理

        负责配置接口信息,新增、修改的信息实时缓存。
3.2.1.1.表结构设计
主键、接口名称、接口提供方、接口controller、接口url、方法名、请求类型、版本、业务类型、接口类型、接口状态、接口描述、开启开始时间、开启结束时间、请求限制频率(1s次数)、是否删除
3.2.1.2.界面设计
待补充

3.2.2.黑名单管理

        负责配置接口请求来源的黑名单ip,可设置限制策略。
3.2.2.1.表结构设计
主键、ip、限制类型(允许\拒绝)、开始时间、结束时间、是否删除
3.2.2.2.界面设计
待补充

3.2.3.接口日志管理

        记录接口请求日志、出参、入参、方法补充内容。同时从日志提取接口到接口管理,然后在接口管理补充相应配置信息即可接入权限使用。
3.2.3.1.表结构设计
主键、接口id(接口信息表主键)、请求ip、入参、返回数据、耗时、请求来源、业务接口补充(说明)、请求时间
3.2.3.2.界面设计
待补充

3.3.机制详细设计

3.3.1.授权认证设计流程

此流程为授权认证机制、授权机制、接口防伪机制3个机制合并流程。
在这里插入图片描述

3.3.2.限流设计流程

在这里插入图片描述

1、配合接口配置信息、黑名单、做异常请求拦截
2、削峰限流(保障性能,如果接口是必须支持,可以去掉)

3.3.3.幂等设计流程

在这里插入图片描述

4.对外接口使用

4.1.入参规范

序号 规范名称 内容 备注
1 请求协议 https/http 推荐https
2 接口类型 Post/get 优先post
3 传参 Headers + body(json) 禁止路径传参方式
4

4.2.接口规范约定

BASE提供接口文档、负责接口配置等工作。
接口url约定:
所有接口都不禁止使用路径传参,例如:/传参1/传参2
接口url除域名、ip、上下文外,固定以baseOpenApi/开头
权限传参放在headers:
token:请求BASE活得接口请求授权token
sign:约定生成,md5值,传参按照key的自然顺序排序组成字符串生成md5值。
Jwt:约定生成,具体格式:标准载荷 + 自定义载荷(请求方apiKey、apiSecret、token),RS256非对称加密
业务传参放在body:
以json形式,具体根据接口文档。

4.3.出参规范

以json对象返回,BASE可提供统一泛型对象。

出参key 出参valu 类型 说明
code 200 数字 200表示成功,其他均表示异常,具体异常原因见message
data 接口返回数据 Json串
message 信息 String SUCCESS表示成功,其他字符串为接口返回

示例格式如下:
{
“code”: 200,
“data”: {
“countId”: “”,
“current”: 1,
“optimizeCountSql”: true,
“orders”: [],
“pages”: 0,
“records”: [],
“searchCount”: true,
“size”: 2,
“total”: 0
},
“message”: “SUCCESS”
}

5.日志体系方案设计

在这里插入图片描述

日志体系配合缓存,实现从请求进入系统,到进入业务接口,再到出业务接口,返回数据全流程的监控。
业务接口中实现可取本次请求日志,补充相关信息重新放入缓存,接口后置事件时做最好日志设置异步执行记录接口日志。

5.1.日志设计流程

对于日志的保存有2个设计思路,一个AOP切面+缓存+自动任务,一个是AOP切面+缓存+kafka消息队列。
2种方案理论上都没有问题,唯一就是对业务接口开放了补充日志内容的过程,可能导致插入数据库的sql执行报错,这个就需要在保存到数据库前做一定的格式、字段长度等校验,保证数据库执行成功。否则可能会导致日志缓存积压、kafka消息队列积压。

5.1.1.切面缓存设计

在这里插入图片描述

5.1.2.切面缓存消息队列设计

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一个基于缓存的业务链路日志记录设计方案 的相关文章

  • 用C语言求n阶魔方阵

    给出n值 xff0c 输出n阶魔方阵 xff08 每一行 xff0c 每一列和对角线之和都相等 xff09 1放在第一行中间从2开始以后的数按以下规则 xff1a 每个数比前一个数行数减一 xff0c 列数加一当上一个数行数为1 xff0c
  • 解决 System has not been booted with systemd as init system (PID 1). Can‘t operate.

    docker 容器使用systemctl 以ubuntu做为参考 拉取容器 直接拉取 使用 docker pull ubuntu 直接拉取 通过Dockerfile拉取 Dockerfile 基础镜像 FROM ubuntu 18 04 b
  • SQLServer批量更新、批量插入数据

    https blog csdn net fengkang511 article details 51778984 utm medium 61 distribute pc aggpage search result none task blo
  • 使用powershell 开启或关闭NLA

    关闭NLA 96 span class token variable registryPath span 61 span class token string 34 HKLM SYSTEM CurrentControlSet Control
  • SVN异常之svn:E230001 Server SSL certificate verification failed

    起因 某一天上班 xff0c 使用idea更新代码 xff0c 发现出现如下问题 xff1a Error svn E230001 Unable to connect to a repository at URL 39 https xxx x
  • 在Linux下,禁止某一个显示屏的输出

    今天接到了一个任务 xff0c 实现显示屏的关和开 理了下思路 xff1a 1 需求 xff1a 实现终端的开关屏 xff0c 要求仅仅是终端的屏幕关掉了 xff0c 但是系统仍旧在跑 xff0c 可以用遥控器唤醒 2 方向 xff1a 2
  • 十分钟搞懂字符编码

    编码方式描述ANSI编码常见于window xff0c 与windows操作系统所面向的国家地区有关在简体中文Windows操作系统中 xff0c ANSI 编码代表 GBK 编码在繁体中文Windows操作系统中 xff0c ANSI 编
  • python数字运算

    加法 num1 span class token operator 61 span span class token builtin input span span class token punctuation span span cla
  • k8s集群运维之master节点无法调度问题

    k8s集群创建完成后 xff0c 在部署应用的时候发现master节点无法部署pod 解决步骤如下 查看节点名称 master01 k8s git span class token punctuation span master span
  • Debian 9安装Clion 2018

    现在去官网直接下载 https www jetbrains com clion 解压缩 tar zxvf CLion 2018 1 5 tar gz cd clion 2018 1 5 bin clion sh CLion是收费 的 xff
  • 从用户email信息分析是否为qq邮箱并截取qq号的sql语句

    思路 xff1a 1 email是qq邮箱 2 qq邮箱也可以自己注册的 xff0c 39 64 39 前面有可能是随意填写的字符串 xff0c 过滤 39 64 39 前面不是数字的 3 截取符合邮箱 39 64 39 前面部分即为qq号
  • 解决Ubuntu虚拟机NAT不能上网的几种方法

    vmware安装ubuntu虚拟机后 xff0c 网络经常抽风 也不知道具体是什么原因导致的 有时候开机就不能上网 xff0c 有时候 xff0c 是突然不能上网 这个时候 xff0c 尝试重启虚拟机后者电脑 xff0c 看看能否解决 或者
  • 显示https不安全的原因及解决办法

    很多人在部署了https证书之后 xff0c 有的时候仍然会出现https 不安全 的提示 xff0c 这就比较纳闷了 明明说部署了https证书会受到浏览器的信任的 xff0c 怎么还会出现这种情况 xff1f 安信SSL帮大家分析一下原
  • 小程序input输入限制小数位数

    小程序input组件本身没有自带这个校验属性 xff0c 但有一个maxlength属性 xff0c 可以通过是否输入了小数点来动态计算设置maxlength的方法达到限制输入的目的 保留一位小数 lt view class 61 34 l
  • js数组对象去重

    removeID span class token operator 61 span span class token punctuation span arr span class token punctuation span span
  • 解决echarts刷新不重绘

    切换筛选条件重新查询时候Echart不重新绘制 需要绘制之前初始化Echart echarts span class token punctuation span span class token function init span sp
  • 判断是否有值,0也是有值的情况

    span class token operator span span class token function isNaN span span class token punctuation span span class token f
  • 基于高德地图SDK进行搜索

    高德地图SDK使用地址http lbs amap com 地图设置 define GDMAPKEY 64 34 key 34 import 34 ViewController h 34 import lt MapKit MapKit h g
  • Microsoft Visual C++ Build Tools.exe安装包损坏

    Python3安装支持库的过程中经常会遇到 Microsoft Visual C 14 0 is required 此时就需要安装Visual C build tools生成工具 在运行build tool安装时 提示安装包损坏 翻墙也无效

随机推荐

  • debian图形界面安装

    安装GNOME中文桌面环境 安装基本的X系统 apt get install x window system core 安装GNOME桌面环境 apt get install gnome 到现在为止 xff0c 我们已成功安装完成gnome
  • Qt 调试时 程序异常结束

    在调试时 xff0c 关闭窗口 xff0c 应用程序输出窗口提示 Qt 调试时 程序异常结束 21 20 48 程序异常结束 21 20 48 The process was ended forcefully 21 20 48 G proj
  • c#webservice的简单示例

    是webservice 就概念上来说 xff0c 可能比较复杂 xff0c 不过我们可以有个宏观的了解 xff1a webservice就是个对外的接口 xff0c 里面有 函数可供外部客户调用 xff08 注意 xff1a 里面同样有客户
  • 实现常规厂家&品牌&型号业务对接物联网平台(snack3加json赋能)

    前言 之前介绍过通过snack3快速对接物模型 xff0c 不知道大家还有没有影响 记得还留了一个作业给大家想想 xff0c 就是这么兼容多型号 多版本 xff0c 这次就来跟大家分享下这么集成多型号 一 物模型文件调整 上次是利用snac
  • 组合OSS服务实现打包业务文件zip下载

    前言 实现文件打包成zip下载 xff0c 支持zip包含目录 文件 废话不多说 xff0c 直接上码 一 设计思路 后端组织文件 xff0c 打包成zip上传到OSS存储返回文件名称给前端前端根据返回的文件名称 xff08 url xff
  • Spring Boot + Disruptor = 王炸!!

    01 背景 工作中遇到项目使用Disruptor做消息队列 对你没看错 不是Kafka 也不是rabbitmq Disruptor有个最大的优点就是快 还有一点它是开源的哦 下面做个简单的记录 02 Disruptor介绍 Disrupto
  • Dbeaver连接ES问题一站解决

    前言 最近几天一直做ES的TPS测试 xff0c 每次看数据ES的数据都在嫌麻烦 xff08 在postman指定索引通过url请求查看数据 xff09 最后决定还是整整Dbeaver连接ES 一 当前境况 1 ES版本比较老 xff0c
  • Dbeaver连接TDengine时序数据库

    前言 还是结合上一阶段的工作 xff0c 为TPS满足合同里的要求 xff0c 预研数据库切换为TDengine 所以查看数据的工具我得能连上去看 xff0c 习惯了Dbeaver xff0c 所以先把Dbeaver整的能连接使用 一 Db
  • idea+ApifoxUploader+Apifox真是内外双修,香

    前言 最近部门为整合后端组 前端组 测试组 需求组 产品组等组之间的工作流程 xff0c 旨在提高协调与高效 xff0c 其中之一就是希望开发组 xff08 后端 前端 xff09 开发的接口能及时更新 xff0c 测试组能做接口测试 xf
  • SpringBoot3+最新MybatisPlus+Mysql与TDengine双数据源

    前言 昨天写的idea 43 Apifox uploader插件 43 apifox新年第一天上班就上榜了 xff0c 真是不错 今天来补一篇 xff0c 本来应该是在前一篇之前发的 实际上就是最新的springBoot集成最新的mybat
  • 业务平台扩展支持TDengine时序数据库方案

    1 场景与架构 1 1业务架构 这里涉及项目隐私 xff0c 架构图不方便公开 大致情况就是 xff1a 应用层的园区畅行 生态宜居 安全守护是我方要交付的系统 平台层的物联网感知中台是我方平台 1 2数据架构 从数据架构看 xff0c 园
  • 物联网平台+业务平台基本架构设计与优化想法

    前言 目前的交付底座有点老 xff0c 而且集成的有点杂 xff0c 计划是要升级下 xff0c 先说想法 xff0c 看领导做不做 1 业务平台定位 我们的愿景 xff1a 通过物联平台赋能 xff0c 让数据产生价值 为客户提供可视化的
  • Qt 正则表达式匹配失败的一个原因

    在Qt中做正则表达式时 xff0c 遇到一个很坑爹的问题 xff0c 还是经验不足导致 在正则表达式中 xff0c 有很多需要元字符 xff0c 是需要使用普通字符加转义符号搭配使用的 比如 w xff0c s 对于这类字符 xff0c 在
  • C++对象模型(整理)

    C 43 43 对象模型 1 何为C 43 43 对象模型 xff1f C 43 43 对象模型可以概括为以下2部分 xff1a 语言中直接支持面向对象程序设计的部分 面向对象程序设计部分 xff1a 如构造函数 析构函数 虚函数 继承 x
  • MybatisPlus多表查询之零sql编写实现

    1 前言 年初节奏还没有快起来 xff0c 适合做做技术前瞻 xff0c 无论是对个人还是团队都是好事 真要说分享 xff0c 其实感觉也没啥好分享的 xff0c 就像接手新项目一样 xff0c 代码都是自己看 xff0c 别人讲的再多 x
  • 物联网设备流水入库TDengine改造方案

    1 存储机制改造 针对提出的流水查询需求 xff0c 结合设备上报数据讨论后 xff0c 初步定以下几种方案 1 1 ES gt TDengine 1 ES入库有延时 2 ES没有提供数据监听API xff08 不能主动监听 xff0c 实
  • SpringBoot3集成Kafka优雅实现信息消费发送

    前言 首先 xff0c 你的JDK是否已经是8 43 了呢 xff1f 其次 xff0c 你是否已经用上SpringBoot3了呢 xff1f 最后 xff0c 这次分享的是SpringBoot3下的kafka发信息与消费信息 一 场景说明
  • SpringBoot3集成TDengine自适应裂变存储

    前言 首先很遗憾的告诉大家 xff0c 今天这篇分享要关注才可以看了 原因是穷啊 xff0c 现在基本都是要人民币玩家了 xff0c 就比如chatGPT copilot xff0c 这些AI虽然都是可以很好的辅助编码 xff0c 但是都是
  • Github Copilot编码神剑

    前言 今天跟大家分享的其实是现在比较火的Github copilot xff0c 另外 xff0c 就是分享下它的优雅使用 其实知道用这个以后 xff0c 瑟瑟发抖 xff0c 感觉就要失业了 不过真正用过后 xff0c 其实发现这要完全取
  • 一个基于缓存的业务链路日志记录设计方案

    前言 一个简单的全接口日志设计文档 xff0c 先分享设计文档 xff0c 后面分享核心设计代码 1 对外接口设计原则 1 1 基本原则 对外接口要遵守的基本原则 xff1a 1 开闭原则 2 依赖倒置原则 3 单一职责原则 4 接口隔离原