七、API 接口分析功能
七、API 接口分析功能主要内容:
开发抽象公共服务
实现网关核心业务流程
开发管理员接口分析功能
上线分析和发展
梳理网关业务流程一下操作可以复用:
实际情况应该是去数据库中查询是否已分配给用户秘钥(accessKey, secretKey 是否合法)
先根据 accessKey 判断用户是否存在,查到 secretKey
对比 secretKey 和用户传的加密后的 secretKey 是否一致
从数据库中查询模拟接口是否存在,以及请求方法是否匹配(还可以校验参数)
调用成功,接口调用次数 + 1 invokeCount
临时问题:如何获取接口转发服务器的地址思路:网关启动时,获取所有的接口信息,维护到内存的 hashmap 中;有请求时,根据请求的 URL 路径或其他参数(比如 host 请求头) 来判断应该转发到哪台服务器、以及用户校验接口是否存在
抽象公共服务项目名:mofeng-common
目的是让方法、实体类在多个项目之间复用,提高代码复用率。
服务抽取:
数据库中查询是否已分配给用户秘钥(根据 accessKey, 拿到用户信息,返回用户信息,为空表示不 ...
六、Dubbo 框架
六、Dubbo 框架网关业务逻辑问题:网关项目比较纯净,没有操作数据库的包、并且还要调用我们之前写过的代码?复制粘贴维护麻烦
解决:直接请求到其他项目的方法
如何调用其他项目的方法
复制代码、依赖和环境
HTTP 请求(提供一个接口,供其他项目使用)
RPC
把公共的代码打包 JAR 包,其他项目引用(客户端 SDK)
HTTP 请求如何调用?
提供开发一个接口(地址、请求方法、参数、返回值)
调用方使用 HTTP Client 之类的代码包去发送 HTTP 请求
RPC作用:像本地方法一样调用远程方法
对开发者更透明,减少了很多的沟通 成本
RPC 想远程服务器发送请求时,未必要使用 HTTP 请求,比如还可以用 TCP/IP,性能更高(内部服务更适用)
Dubbo 框架(RPC 实现)GRPC、TRPC
阅读官方文档:https://cn.dubbo.apache.org/zh/docs3-v2/java-sdk/quick-start/spring-boot/
两种使用方式:
Spring Boot 代码(注解 + 编程式):写 Java 接口,服务提供者和 ...
三、API 开放平台-接口发布
三、接口发布-下线-调用
开发接口发布、下线的功能(管理员)
前端去浏览接口、查看接口文档、申请签名(注册)
在线调试(用户)
统计用户调用接口的次数
优化系统 - API 网关
开发接口发布/下线功能后台接口:
发布接口(仅管理员可操作)
校验该接口是否存在
判断该接口是否可以调用
修改接口数据库中的状态字段为 1
下线接口(仅管理员可操作)
校验接口是否存在
修改接口数据库中的状态字段为 0
查看接口文档动态路由,用 url 来传递 id, 加载不同的接口信息
申请签名用户在注册成功时,自动分配 accessKey、secretKey
扩展点:用户可以申请更换签名
在线调用123[ {"name":"username", "type":"string"}]
先跑通整个接口流程,再去针对不同的请求头或者接口类型来设计界面和表单,给用户更好的体验。(可以参考 swagger、postman、knife4j)
调用流程
流程:
前端将用户输入的请求参数和要测 ...
API 开放平台设计
API 开放平台第一期项目背景:
前端开发需要用到后端接口
使用现成的系统的功能(http://api.btstu.cn/)
API 接口平台:
防止攻击(安全性)
不能随便调用(限制、开通)
统计调用次数
计费
流量保护
API 接口
项目介绍做一个提供 API 接口调用的平台,用户可以注册登录,开通接口调用权限,用户可以使用接口,并且每次调用会进行统计。管理员可以发布接口、下线接口、接入接口,以及可视化接口的调用情况、数据。
技术选型前端
Ant Design Pro
React
Ant Design Procompoments
Umi
Umi Request (Axios 的封装)
后端
Java Spring Boot
Sring Boot Starter (SDK 开发)
项目计划第一期 —- 初始化展示项目介绍、设计、技术选型
基础项目搭建
接口管理
用户查看接口
第二期 —- 接口调用
继续开发接口管理前端页面
开发调用这个接口的代码
保证调用的安全性(API 签名认证)
客户端 SDK 的开发
管理员接口 发布 与调用
接口文档展示、接口在线调用
第三期 ...
API 开放平台四-网关
四、网关
开发接口调用次数的设计
优化整个系统的架构(API 网关)
网关是什么?
网关的作用
网关的应用场景及实现
结合业务应用网关
接口调用次数统计需求:
用户每次调用接口成功,次数 + 1
给用户分配或者用户自主申请接口调用次数
业务流程:
用户调用接口
修改数据库,调用次数 + 1
设计库表:
哪个用户?哪个接口?
用户 => 接口 (多对多关系)
用户调用接口关系表:
12345678910111213-- 用户调用接口关系表create table if not exists user_interface_info( id bigint auto_increment comment 'id' primary key, userId bigint comment '调用用户 id', interfaceInfoId bigint comment '接口 id', totalNum int d ...
二、API 开放平台-模拟接口
二、API 开放平台-模拟接口模拟接口项目 mofeng-interface提供三个模拟接口
GET 接口
POST 接口(URL 传参)
POST 接口 (Restful)
调用接口几种 HTTP 调用方式:
HttpClient
RestTemplate
第三方库(OKHTTP、Hutool)
Hutool:https://hutool.cn/docs/#/
Http 工具类:https://hutool.cn/docs/#/http/Http%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%B7%A5%E5%85%B7%E7%B1%BB-HttpUtil
API 签名认证本质:
签名签发
使用签名(校验签名)
为什么需要签名认证?
保证安全性,防止恶意调用
如何实现 API 签名认证呢?通过 http request header 头传递参数
参数1: accessKey 调用的标识 userA, userB (复杂、无序、无规律)
参数2: secretKey 密钥 (复杂、无序、无规律),该参数不能放在请求头中
类似于用户名和密码,区别:acces ...
创建 starter 步骤
创建starter步骤1.新建一个 spring boot 初始化项目
2.添加依赖,Lombok, Spring Configuration Processor
Spring Configuration Processor 的作用是自动生成代码提示
3.修改 pom 文件的版本号,并删除 build
4.删除原本自动创建的主类,新建一个类, 并添加需要用到的依赖
5.在 resources 目录下新建 META-INF 目录,并创建 spring.factories 文件,并指定配置类的目录
6.install 打包构建在本地的仓库
7.复制 groupId, artifactId, version,可以在其他项目中添加为依赖
8.在配置文件当中就可以引用 starter 当中设置的属性
刚才在 starter 配置类中定义的属性
可以引入 starter 当中的类或者属性
GateWay 转发请求
五、Gateway 转发请求使用到的特性
路由
负载均衡(需要用到注册中心)
统一鉴权
跨域
统一业务处理(缓存)
访问控制
发布控制
流量染色
接口保护
限制请求
信息脱敏
降级(熔断)
限流:学习令牌桶算法、学习漏桶算法,学习一下 RedisLimitHandler
超时时间
统一日志
统一文档
业务逻辑
用户发送请求到 API 网关
请求日志
(黑白名单)
用户鉴权(判断 accessKey, secretKey 是否合法)
请求的模拟接口是否存在
请求转发,调用模拟接口
响应日志
调用成功,次数 + 1
调用失败,返回一个规范的错误码
具体实现1.请求转发使用前缀匹配断言:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-path-route-predicate-factory
所有路径为: /api/** 的请求进行转发,转发到 http://localhost:8123/api/**
比如请求网关: http://localhost:8090/ ...
组队功能设计
组队功能应用场景需要跟自己一起参加竞赛、做项目、学习,可以发起队伍或者加入别人的队伍
需求分析
用户可以创建队伍,设置队伍的人数、队伍名称(标题)、描述、超时时间 P0队长、剩余的人数
聊天
公开或私密或加密
用户最多创建 5 个队伍
展示队伍列表,根据名称搜索队伍 P0,信息流中不展示已过期的队伍
修改队伍信息 P0~P1
用户可以加入队伍(其他人、未满人、未过期),允许加入多个队伍,但是有上限 P0
是否需要队长同意?筛选审批?
用户可以退出队伍(如果队长退出,权限转移给第二早加入的用户 – 先来先到)P1
队长可以解散队伍 P0
分享队伍 => 邀请其他用户加入队伍 P1
业务流程:(1)生成分享连接(分享二维码)(2)用户访问链接,可以点击加入
系统(接口)设计1.创建队伍用户可以创建队伍,设置队伍的人数、队伍名称(标题)、描述、超时时间 P0队长、剩余的人数
聊天
公开或私密或加密
用户最多创建 5 个队伍
请求参数是否为空
是否登录,为登录不允许创建
校验信息a. 队伍人数 > 1 且 <= 20b. 队伍 ...
数据库表设计
数据库表设计队伍表 team字段:
id 主键 bigint (最简单、连续,放 URL 上比较简短,但缺点是爬虫)
name 队伍名称
decription 描述
maxNum 最大人数
expireTime 过期时间
userId 创建人
status 0 - 公开, 1- 私密, 2 - 加密
password 队伍密码
createTime 创建时间
updateTime 更新时间
isDelete 是否删除
用户-队伍表 user_team关系:
用户加入了哪些队伍?
队伍有哪些用户?
两种实现方式:
建立用户-队伍关系表 teamId userId (便于修改,查询性能高一点,不用全表遍历)
用户表补充已加入的队伍字段,队伍表补充已加入的用户字段(便于查询,不用写多对多连表查询代码,可以直接根据队伍查用户、根据用户查队伍)
字段:
id 主键
userId 用户 id
teamId 队伍 id
joinTime 加入时间
createTime 创建时间
updateTime 更新时间
isDelete 是否删除
为什么需要请求参数包装类?
请求参数名称 ...