API 开放平台四-网关
四、网关
- 开发接口调用次数的设计
- 优化整个系统的架构(API 网关)
- 网关是什么?
- 网关的作用
- 网关的应用场景及实现
- 结合业务应用网关
接口调用次数统计
需求:
- 用户每次调用接口成功,次数 + 1
- 给用户分配或者用户自主申请接口调用次数
业务流程:
- 用户调用接口
- 修改数据库,调用次数 + 1
设计库表:
哪个用户?哪个接口?
用户 => 接口 (多对多关系)
用户调用接口关系表:
1 | -- 用户调用接口关系表 |
步骤:
- 开发基本的增删改查(给管理员用)
- 开发用户调用接口次数 + 1 的功能(service)
问题:
如果每个接口的方法都写调用次数 + 1, 过于麻烦
致命问题:接口开发者需要自己去添加统计代码
使用 AOP 切面的优点:独立于接口,在每个接口调用后次数 + 1
AOP 切面的缺点:只存在单个项目中,如果每个团队都要开发自己的模拟接口,那么都要写一个切面
网关
网关的作用
- 路由
- 负载均衡
- 统一鉴权
- 跨域
- 统一业务处理(缓存)
- 访问控制
- 发布控制
- 流量染色
- 接口保护
- 限制请求
- 信息脱敏
- 降级(熔断)
- 限流:学习令牌桶算法、学习漏桶算法,学习一下 RedisLimitHandler
- 超时时间
- 统一日志
- 统一文档
路由
起到转发的作用,比如有接口 A 和接口 B, 网关会记录这些信息,根据用户访问的地址和参数,转发请求到对应的接口(服务器/集群)
/a => 接口 A
/b => 接口 B
负载均衡
在路由的基础上
/c => 服务 A / 集群 A (随机转发到其中的某一个机器)
uri 从固定地址改成 lb:xxxx
统一处理跨域
网关统一处理跨域,不用在每个项目里单独处理
GateWay 处理跨域:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#cors-configuration
发布控制
灰度发布,比如上线新接口,先给新接口分配 20% 的流量,老接口 80%, 再慢慢调整比例
流量染色
给请求(流量)添加一些标识,一般是设置请求头中,添加新的请求头
全局染色:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#default-filters
统一接口保护
- 限制请求:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#requestheadersize-gatewayfilter-factory
- 信息脱敏:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-removerequestheader-gatewayfilter-factory
- 降级(熔断):https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#fallback-headers
- 限流:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-requestratelimiter-gatewayfilter-factory
- 超时时间:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#http-timeouts-configuration
- 重试(业务保护):https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-retry-gatewayfilter-factory
统一业务处理
把每个项目中都要做的通用逻辑放到上层(网关),统一处理,比如本项目的次数统计
统一鉴权
判断用户是否有权限进行操作,无论访问什么接口,都统一验证权限,避免重复写验证权限操作。
访问控制
黑白名单,比如限制 DDOS IP
统一日志
统一的请求、响应信息记录
统一文档
将下游项目的文档进行聚合,在一个页面统一查看
可以使用 knife4j : https://doc.xiaominfo.com/docs/middleware-sources/aggregation-introduction
网关的分类
- 全局网关(接入层网关): 作用是负载均衡、请求日志等,不和业务逻辑绑定
- 业务网关(微服务网关): 存在一些业务逻辑,作用是将请求转发到不同的业务/项目/接口/服务
参考文章:https://blog.csdn.net/qq_21040559/article/details/122961395
实现网关
- Nginx (全局网关)、Kong 网关 (API 网关, Kong: https://github.com/Kong/kong), 编程成本相对高点
- Spring Cloud GateWay (取代了 Zuul ) , 性能高、可以用 Java 代码来写逻辑,适合学习
网关的技术选型:https://zhuanlan.zhihu.com/p/500587132
Spring Cloud GateWay 用法
官网:https://spring.io/projects/spring-cloud-gateway/
官方文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/
核心概念
路由(根据什么条件,转发到哪里去)
断言:一组规则、条件, 用来确定如何转发路由
过滤器: 对请求进行一系列的处理, 比如添加请求头、添加请求参数
请求流程:
- 客户端发起请求
- Handler Mapping: 根据断言,将请求转发到对应的路由
- Web Handler: 处理请求(一层层经过过滤器)
- 实际调用服务
两种配置方式
- 配置式(方便、规范)
- 简化版
- 全称版
- 编程式(灵活、相对麻烦)
开启日志
1 | logging: |
断言
- After 在 xx 时间之后
- Before 在 xx 时间之前
- Between 在 xx 时间之间
- 请求类别
- 请求头(包含 cookie)
- 查询参数
- 客户端地址
- 权重
过滤器
基本功能:对请求头、请求参数、响应头的增删改查
- 添加请求头
- 添加请求参数
- 添加响应头
- 降级
- 限流
- 重试
引入:
1 | <dependency> |