# 落玖API **Repository Path**: o122727/luojiu-api ## Basic Information - **Project Name**: 落玖API - **Description**: API开放平台 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2024-07-16 - **Last Updated**: 2025-03-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 接口平台 提供一个API接口调用的平台,用户可以调用接口使用 难点 1.防止攻击 2.不能随便调用 3.计费 4.流量保护 5.API接入 6.统计调用次数 对外的接口 管理员发布接口 - 通过后台管理 发布接口 接口设置 用户前台 调用接口 # 网关 gateway nginx ![image.png](https://cdn.nlark.com/yuque/0/2024/png/40587807/1721032361660-47bd5cbb-cd2f-41ff-847f-a2d62dea6b7a.png#averageHue=%23f7f7f7&clientId=u8922291c-dac0-4&from=paste&height=705&id=u9d2f3ea0&originHeight=881&originWidth=899&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=128627&status=done&style=none&taskId=u2eb80585-a2e9-4118-8975-8ecafe59016&title=&width=719.2) 项目初始化 # 调用http请求的方式 1.httpclient 2.RestTemplate 3.第三方库(okhttp Hutool) # API签名认证 本质;签发前面 校验签名 accessKey:调用的标识 secretKey:密钥 sign :签名 不能在服务器中传递,可能会被拦截发现 加密算法 对称加密,非对称加密,MD5签名 用户参数 + 密钥 =》签名算法 =》不可解密的值 服务器拿相同的参数在进行加密 进行比较 为了防止请求重放 加入nonce随机数,只能用一次 问题:后端要存用过的随机数 加一个 timestamp 时间戳 在时间范围内 nonce 有效 根据时间戳淘汰nonce accessKey:调用的标识 secretKey:密钥 用户请求参数 sign :签名 用户参数 + 密钥 =》签名算法 =》不可解密的值 nonce 随机数 为了防止请求重放 timestamp 时间戳 ## API签名是一个很灵活的设计,具体要哪些参数我们可以根据具体的场景来。 # 为了简化开发者 开发一个简单的SDK 手写starter 开发starter的好处 1.开发者引入之后 可以直接在,application.yml 中写配置,自动创建客户端 ```xml org.springframework.boot spring-boot-configuration-processor true ``` 开发SDK 我们 # 接口计费和保护 1.接口发布下线功能(admin) 2.前端浏览接口,查看接口文档,申请签名(注册),在线调试(用户) 3.优化系统-API网关 4.统计调用次数 ## 发布下线接口 1.发布接口 1.校验接口是否存在 2.判断该接口是否可以调用 3.修改接口在数据库中的字段 为1 4. ## 用户在注册时自动生成ak/sk ![image.png](https://cdn.nlark.com/yuque/0/2024/png/40587807/1721204469323-3fa33e07-b2f5-4197-88af-c36fb8c8065d.png#averageHue=%23fafafa&clientId=u468df198-4737-4&from=paste&height=402&id=ivQzv&originHeight=502&originWidth=806&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=43677&status=done&style=none&taskId=u8d66d40e-b917-4a09-b3c1-0246eb3db03&title=&width=644.8) 1.前端讲请求参数和id发送到平台后端 2.平台后端在调用模拟接口(做一些校验) # 接口调用次数统计 1.用户调用接口后 次数+1 使用AOP来统计调用次数 拦截器()过滤器 通用方法 不使用的问题 a.接口的开发者需要自己调用+1的操作 AOP切面的缺点 1.只存在单个项目中 2.每个团队都要开发自己的模拟接口,都要写一个切面 ## 网关的应用场景 作用 1.路由 2.鉴权 3.跨域 4.缓存 5.流量染色 6.访问控制 7.统一业务处理 8.发布控制 9.负载均衡 10.接口保护 a,限制请求 b.信息脱敏 c、降级(熔断) d.限流 e、超时时间 11.统一日志 12.统一文档 ### 路由 做到请求转发的目的,它会根据用户访问的地址和参数,转发请求到对应的接口 ## 负载均衡 在路由的基础上随机转发到其中的某台服务器 ### 鉴权 判断用户是否有权限操作,无论访问哪个接口,统一判断 ## 跨域 统一处理跨域问题 ## 发布控制 流量分配,灰度发布 先给新接口分配 20%,慢慢增加流量调整比重 ## 网关的分类 1.全局网关(接入层网关):作用是负载均衡、请求日志等,不和业务逻辑绑定 2.业务网关(微服务网关):会有一些业务逻辑,作用是将请求转发到不同的业务/项目/接口/服务 实现 1.Nginx(全局网关)、Kong 网关(API网关,Kong:[https://github.com/Kong/kong)](https://github.com/Kong/kong)),编程成本相对高一点 2.Spring Cloud Gateway(取代了 Zuul)性能高、可以用 Java 代码来写逻辑,适于学习 ## spring cloud gateway 用法 ### 核心概念 1.路由(根据什么条件发送到哪里) 2.断言 3.过滤器对请求进行处理,比如添加请求头,添加请求参数 1.客户端发起请求 2.Handler Mapping:根据断言,去将请求转发到对应的路由 3.Web Handler:处理请求(一层层经过过滤器 4.实际调用服务 ### 两种编程方式 1.编程式(灵活,自由) 2.配置式(方便,规范) 官方文档 [https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/](https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/) ![](https://cdn.nlark.com/yuque/0/2024/png/40587807/1721288031801-09777afa-efa2-4b54-8f45-53ad5dfdf8a4.png#averageHue=%23181818&clientId=ueee4b12d-6e65-4&from=paste&id=u793237db&originHeight=595&originWidth=443&originalType=url&ratio=1.25&rotation=0&showTitle=false&status=done&style=none&taskId=u5a0f33c2-d0e8-4698-bf08-112f8d58811&title=) 远程调用问题 因为网关项目没引入 MyBatis 等操作数据库的类库,如果该操作较为复杂,可以由 backend 增删改查项目提供接口,我们直接调用,不用再重复写逻辑了。 1.HTTP请求(用HTTPClient、用RestTemplate、Feign) 2.RPC(Dubbo) HTTP 请求怎么调用? 1.提供方开发一个接口(地址、请求方法、参数、返回值) 2.调用方使用 HTTP Client 之类的代码包去发送 HTTP 请求 RPC 作用:像调用本地方法一样调用远程方法。 对开发者更透明,减少了很多的沟通成本。 RPC 向远程服务器发送请求时,未必要使用 HTTP 协议,比如还可以用TCP/IP,性能更高。 RPC框架 ![image.png](https://cdn.nlark.com/yuque/0/2024/png/40587807/1721382390637-b0f35e95-cab3-4fc0-8a02-75e4cfc1e04a.png#averageHue=%23fbfbfb&clientId=ua9edd4d3-9b1e-4&from=paste&height=337&id=u3326f063&originHeight=421&originWidth=954&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=66713&status=done&style=none&taskId=ufa78163a-4ebc-469c-a98d-b65d9f48d32&title=&width=763.2) 注册中心只告诉他地址,让他自己去请求 ### 问题 预期是等模拟接口调用完成,才记录响应日志、统计调用次数。 但现实是 chain.filter 方法立刻返回了,直到 filter 过滤器 return 后才调用了模拟接口。原是: chain.filter 是个异步操作,理解为前端的 promise # 公共服务 目的是让方法、实体类在多个项目间复用,重复编写 # 步骤: 1.新建干净的 maven 项目,只保留必要的公共依赖 2.抽取 service 和实体类 3.install 本地 maven 包 4.让服务提供者引入 common 包,测试是否正常运行 5.让服务消费者引入 common 包 # hutool工具包问题 ## 编码问题 在使用hutool的时候,我们使用它会产生乱码问题,建议使用英文 # 依赖问题 我引入了spring boot 3 然后更换为2.7.5 - **修改 **`**pom.xml**`:将 `spring-cloud-starter-gateway-mvc` 替换为 `spring-cloud-starter-gateway`。 依赖有问题 导致无法启动