# api-hub-be
**Repository Path**: aghp/api-hub-be
## Basic Information
- **Project Name**: api-hub-be
- **Description**: 一个免费开源、简单易用的API接口服务平台(后端)
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 0
- **Created**: 2023-06-21
- **Last Updated**: 2024-04-10
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# api-hub项目介绍文档
## 前言
> api-hub项目是一个集成市面上各种免费好用接口的项目,项目名hub是我对Github开源平台的致敬,项目的创建之初是能够成为一个集成各类有趣、有用,且提供免费接口调用服务的平台。目前项目已经算是大致完成了,项目的主要功能接口调用功能也都完成了,后续还将继续完善(以后的完善目标在[未完待续](#未完待续)部分中有写)
>
> - **项目代码仓库地址**
>
> - 项目前端代码仓库:https://gitee.com/aghp/api-hub-fe
> - 项目后端代码仓库:https://gitee.com/aghp/api-hub-be
>
> - **项目访问地址**
>
> - 项目在线访问地址:http://api-hub.知识汲取者.top/
> - 后端接口在线文档地址:http://api-hub.知识汲取者.top/api/doc.html
> - RabbtiMQ在线客户端地址:http://api-hub.知识汲取者.top/rabbitmq/
> - Nacos在线客户端地址:https://api-hub.知识汲取者.top/nacos
> - 宝塔面板在线客户端地址:https://api-hub.知识汲取者.top:30239/bt/login
>
> PS:各位大佬,请你不要拿我这个小破站来做压力测试,我这给开发这个网站纯粹就算个人爱好,如果想做压测的可以下载项目本地运行压测,本人也是直接拿着本地的项目做的压测的(详情见 [api-hub压测记录文档](https://blog.csdn.net/qq_66345100)),因为网站服务器是白嫖的,性能不是特别好,还请大佬手下留情,我还想撑一短时间,过段时间服务器就要过期了
>
> - **博客地址**:[知识汲取者的博客](https://blog.csdn.net/qq_66345100)
>
> - **致谢**
>
> - https://api.uomg.com/#about
> - http://api.btstu.cn/
>
> 在这里十分感谢上面两个网站,网站提供的部分接口服务是直接移植他们的,最后也十分感谢 [Nero]() 兄弟,前端部分是参考了 Nero 的前端界面写的
==**注意**==:由于服务器配置太低了,带不动,上线后经常出现CPU飙升100%的情况,~~所以项目已经下线了~~┭┮﹏┭┮ 。没办法,我已经把各种参数设置的相当的低了,还是会出现经常性的CPU飙升100%,亏我还浪费了大把时间在这部署上面

## 功能介绍
> 这里就主要介绍后端提供的功能吧,前端就不过多介绍了(前端无非就是发请求、样式调整,逻辑性的东西不是很多,如果前端大佬看到了我这句评价,别喷我,我只是对于本项目前端的一个看法,并不是对所有的前端项目是这个看法,我就一个前端小菜鸡(●'◡'●),也就只会发发请求、改改样式,然后就是CV一下其它人写好的组件🤣)
1. **登录功能**:包括账号密码登录、第三方平台(含Github、Gitee、QQ、微博)授权登录。
对于第三方授权登录,单独开发了一个SDK:[auth-login-sdk](https://gitee.com/aghp/auth-login-sdk),该 SDK 参考了 [JustAuth](https://www.justauth.cn/) 开源项目,其中通过应用 **适配器模式** 抽象出一个 AuthRequest 类实现对各大平台接口的统一,应用 **模板方法模式** 实现重复代码(比如通用请求的发送、通用URL前缀的拼接)的抽取,大大提高项目的可维护性,应用 **工厂模式** + **单例模式** 实现统一的各平台实现类对象的获取操作,并且利用 SpringBoot提供的 SpringContext 类根据对应的 BeanName 获取对应的 实现类,大大简化了对象的创建与获取操作,同时应用 **建造者模式** 提供更加灵活的对象创建
2. **注册功能**:用户输入账号密码、输入验证码即可完成注册。
对于验证码的获取,单独开发了一个SDK:[sms-email-sdk](https://gitee.com/aghp/sms-email-sdk),该 SDK 参考了 [SMS4J](https://gitee.com/dromara/sms4j) 开源项目,其中通过 **适配器模式** 抽象出一个通用的 SmsEmailRequest 类实现对给平台提供的 SMS 服务和 Email 服务接口进行统一(当然 Email 服务SpringBoot已经进行了统一,主要是对 SMS 服务接口进行统一),应用 **模板方法模式** 实现重复代码的抽取,大大简化项目中的重复性代码,同时也应用了 **单例默认**+**工厂模式** 实现统一的各平台实现类对象的获取操作,同时利用 SpringBoot 提供的自定义 starter 功能,提高配置设置的简便性和可维护性。
同时对于短信验证码的发送,我利用了RabbitMQ实现了异步发送,减少了程序阻塞的时间,提高了系统的性能,同时在发送之后利用 setnx 标记一下要发送验证码的手机或邮箱,**一定程度上防止了消息重复消费**的可能
3. **登录拦截功能**:通过利用 **JWT + 登录拦截器**实现登录拦截功能,对于系统首页,只有登录用户才能访问,提高系统的安全性,同时**自定义授权注解**,对于一些特定的接口(比如用户信息的查询、用户信息的修改)只有管理员可以访问
4. **退出功能**:用户登陆系统后,可以直接点击右上角头像进行退出
5. **文件上传下载功能**:后端提供了一个统一的文件上传接口,该接口实现了**分片上传**、**断点续传**、**单文件上传**等常见功能。
对于文件上传和下载,单独开发了一个 SDK:[file-storage-sdk](https://gitee.com/aghp/file-storage-sdk),整合里目前市面上主流的 OSS服务,比如阿里云、腾讯云、七牛云,同时也支持本地存储,后续还将整合 Mino 文件存储服务,同时提供了对OSS文件的增、删、改、查、批量操作
6. **用户信息的CRUD**:即对用户信息的新增、删除(根据id删除、批量删除)、修改(根据id修改)、查询(根据id查询、分页条件查询),当然这个功能仅对管理员开发!
7. **接口信息的CRUD**:即对接口信息的新增、删除(根据id删除、批量删除)、修改(根据id修改)、查询(根据id查询、分页条件查询),当然这个功能仅对管理员开发!
8. **忘记密码功能**:用于输入账号、新密码、验证码即可完成项目的注册。
9. **接口限流功能**:对于重要接口,比如接口调用功能、获取短信验证码、登录功能进行一个限流,防止用户恶意刷量导致系统瘫痪,也能一定程度防止 Ddos 攻击,防止不必要是损失。
对于接口限流的实现,单独开发了一个SDK:[request-limiter-sdk](https://gitee.com/aghp/request-limiter-sdk) ,主要集成了常见的几种限流算法,比如:固定窗口计数器限流算法、滑动窗口计数器限流算法、漏桶限流算法、漏桶限流算法,同时也整合了谷歌 Guava工具包提供的比较出名的先流泪 RateLimiter ,最后利用 **策略模式** 实现算法实现类的任意切换,大大提高了项目的灵活性和可维护性
10. **接口调用功能**:这个功能借鉴了 [dianping](https://gitee.com/aghp/dianping) 项目中对于秒杀那一块的逻辑,属于整个项目的核心业务了,并且这个是接口是唯一横跨整个项目(包括了 api-hub-admin、api-hub-gateway、api-hub-interfas)的,前后对这个接口进行了多次压测优化,关于本项目压测方面的记录可以参考 api-hub压测文档 ,其中利用 **乐观锁**(基于CAS机制实现)防止并发下的超卖问题,添加 Redis 缓存,对于接口基本信息查询,**采用缓存空对象接口了缓存穿透问题**,同时**采用双写方案解决数据不一致行问题**(更加侧重读性能),对于接口是否存在的判断我利用 path 和 method 字段的唯一性来判断,并且缓存到 Redis ,**采用读写穿透方案保障数据的一致性问题**(更加侧重写性能),对于接口调用次数的扣减,我单独封装一个 lua 脚本,确保操作的原子性,同时利用RabbitMQ实现异步实现数据库的更新,大大减轻数据库的压力
下面是一个大致的流程图(画的比较简陋O(∩_∩)O),但是请求大致的走向以及操作的数据源是Redis还是MySQL这个是有所标记的


当然对于接口的信息,我对于接口的path-method信息利用了**全量同步**实现了数据预热,防止发生缓存穿透的风险,因为这一块的数量比较小所以就直接项目启动时进行全量同步,对于接口的基本信息,由于数据比较多,我就直接利用了 **增量更新**,利用 Scheduled 注解设置一个定时任务,每隔三分钟进行一次定时更新,但是存在一个弊端,有一定的数据延迟!!!如果我对接口信息进行了修改,恰巧当前正好的新的三分钟的开始,会导致接口信息无法查询,当然这个概率还是出现的比较少的,因为接口信息只能由管理员修改,管理员一般发布后的接口都是很少去变动的。对于接口的判断服务,我采用 Dubbo 实现内部服务之前的调用,让 api-hub-gateway 项目能够直接调用 api-hub-admin提供的服务
11. **第三方调用功能**:每一个用户都分配了一个 accessKey 和 secretKey,用户通过在自己的项目中引入 api-feign-sdk 依赖,即可实现对自己开通接口的调用服务,该依赖已经打包发布到Mavne中央仓库了,可以直接引用
```xml
io.gitee.aghp
api-feign-sdk
0.0.1
```
对于 api-feign-sdk ,我通过利用SpringBoot提供的自定义 starter 功能,实现方便快捷的配置加载,该依赖的主要作用就是对 请求进行签名。api-hub-gateway 网关模块内部编写了一个拦截器,会拦截对接口的所有请求,只有认证通过之后才能够访问接口,提高安全性,同时内部也对所有认证成功的请求进行一个流量染色,防止直接跳过网关请求接口,进一步提高接口的安全性
这个功能也算是比较核心的功能了,流程图先省略了,后面补上(后面后时间我会将这所有功能的流程图补上(●ˇ∀ˇ●))……
## 项目演示
==在使用 API Hub 项目前建议先看一看下面这些小提示**(●'◡'●)**==
**温馨提示**:
1. **项目访问起来可能比较慢**,需要您耐心等待一会。因为项目部署的服务器是白嫖阿里云的,是 ESC 2核2G的云服务器,内存比较小,能运行我这个项目也是十分万幸了,项目环境我下载了很多东西,比如:JDK、宝塔、Nginx、RabbitMQ、Nacos、Redis、MySQL、Docker、前端项目文件、后端项目文件(关一个Nacos注册中心+MySQL就占了 1G多┭┮﹏┭┮),这些东西加起来就直接就把内存撑满了,并且还需要占据运行内存,我是运行这些服了 JVM 参数都设置相当小了,不然一运行服务器 CPU 就直接100%,卡的动都动不了,感兴趣的可以看一下这篇我的踩坑记录:[Docker运行Nacos容器,过一会就报错`UnsatisfiedDependencyException`_知识汲取者的博客](https://blog.csdn.net/qq_66345100/article/details/132379203?spm=1001.2014.3001.5501) 、[阿里云ESC服务器CPU一直处于100%该如何排查?_知识汲取者的博客](https://blog.csdn.net/qq_66345100/article/details/132397863?spm=1001.2014.3001.5501)
2. 虽然项目中我使用了腾讯云OSS服务,但是项目中的常见图片,比如**项目封面图片、项目logo、项目默认头像第一次访问会很慢**,因为看到网上好多都因为OSS流量被盗刷导致网站”破产了“,看到有人说自己设置了防盗链、流量限制也没用,主要是腾讯云OSS服务欠费了不会自动关停,会一直欠下去,这就导致如果你被不怀好意的人盯上了,一下就欠费成千上万。我也有点担心,所以我这些常用图片都是直接采用公共图床服务,公共图床肯定没有服务的腾讯云OSS快😫,所以大家初次访问可能有些图片加载不出来,可以尝试着多刷新几次页面
比如:[关于我阿里云OSS被盗刷20TB流量 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/411600294)
3. 对于第三方授权登录,如果是新浪微博登录,由于**新浪微博对图片添加了防盗链**,所以登陆成功后,点击个人中心是会发现头像加载失败
如果是 Github 登录,会出现,由于我在在项目内部已经配置了代理,但是因为授权是需要在浏览器进行页面跳转的,所以也可能会出现失败,**如果你想使用Github登录,最好还是开启代理进行登录**,当然我也并不是说一定要开代理才能进行Github登录,这个要靠缘分,就比如平常我们大部分时候也是能够直接访问Github的,但是如果使用Github登录成功后,你没有开启代理,个人中心的头像可能也会出现加载失败,这个需要多刷新几次,毕竟Github服务器在国外。当然我还是推荐大家使用 Gitee或者QQ登录
### 前台演示
- **登录注册页面**













- **接口商店**

- **个人中心**

- **接口管理**


### 后台演示
> 后端好像也没什么好演示的,这里就大致展示一下项目的目录结构吧(●'◡'●),同时也展示一下在线客户端页面🤣
- 后端在线接口文档


- RabbitMQ在线客户端


- 宝塔面板在线客户端


## 技术选型
### 前端技术选型
| 技术 | 说明 | 文档 |
| --------------------------- | --------------- | ------------------------------------------------------------ |
| `HTML` | 网页结构 | https://developer.mozilla.org/zh-CN/docs/Web/HTML |
| `CSS` | 网页样式 | https://developer.mozilla.org/zh-CN/docs/Learn/CSS |
| `React v18.2.0` | 前端框架 | https://react.docschina.org/ |
| `NodeJS v16.13.0` | 前端依赖的环境 | https://nodejs.org/en |
| `Type Script v5.2.2` | JS的超集 | https://www.tslang.cn/ |
| `ant design pro v5.2.2` | 前端脚手架 | https://pro.ant.design/zh-CN/ |
| `ant design pro-components` | 前端UI框架 | https://procomponents.ant.design/ |
| `spark-md5 v3.0.2` | 计算文件的md5值 | https://www.npmjs.com/package/spark-md5 |
| `Axios0.17.0` | 前端HTTP框架 | [https://github.com/axios/axios](https://gitee.com/link?target=https%3A%2F%2Fgithub.com%2Faxios%2Faxios) |
| `echarts v5.4.2` | 数据可视化组件 | https://echarts.apache.org/zh/index.html |
前端项目的所有依赖:
```json
"dependencies": {
"@ant-design/icons": "^4.8.0",
"@ant-design/pro-components": "^2.3.57",
"@ant-design/use-emotion-css": "1.0.4",
"@umijs/renderer-react": "^4.0.70",
"@umijs/route-utils": "^2.2.2",
"antd": "^5.2.2",
"classnames": "^2.3.2",
"echarts": "^5.4.2",
"echarts-for-react": "^3.0.2",
"lodash": "^4.17.21",
"moment": "^2.29.4",
"omit.js": "^2.0.2",
"prismjs": "^1.29.0",
"rc-menu": "^9.8.2",
"rc-slider-captcha": "^1.2.0",
"rc-util": "^5.27.2",
"react": "^18.2.0",
"react-dev-inspector": "^1.8.4",
"react-dom": "^18.2.0",
"react-helmet-async": "^1.3.0",
"react-simple-code-editor": "^0.13.1",
"spark-md5": "^3.0.2"
}
```
### 后端技术选型
| 技术 | 说明 | 文档 |
| ---------------------- | --------------------- | ------------------------------------------------------------ |
| `JDK1.8` | Java8 | https://www.java.com/zh-CN/ |
| `SpringBoot2.5.0` | Web应用开发框架 | [https://spring.io/projects/spring-boot](https://gitee.com/link?target=https%3A%2F%2Fspring.io%2Fprojects%2Fspring-boot) |
| `SpringSecurity` | 认证和授权框架 | [https://spring.io/projects/spring-security](https://gitee.com/link?target=https%3A%2F%2Fspring.io%2Fprojects%2Fspring-security) |
| `MyBatisPlus3.4.3` | ORM框架 | [http://www.mybatis.org/mybatis-3/zh/index.html](https://gitee.com/link?target=http%3A%2F%2Fwww.mybatis.org%2Fmybatis-3%2Fzh%2Findex.html) |
| `MyBatisGenerator` | 数据层代码生成器 | [http://www.mybatis.org/generator/index.html](https://gitee.com/link?target=http%3A%2F%2Fwww.mybatis.org%2Fgenerator%2Findex.html) |
| `Redis6.2.6` | 缓存数据 | [https://redis.io/](https://gitee.com/link?target=https%3A%2F%2Fredis.io%2F) |
| `MySQL8.0.27` | 持久化存储数据 | https://www.mysql.com |
| `SpringCloud` | 微服务框架 | https://spring.io/projects/spring-cloud/ |
| `Rabbitmq` | 消息队列 | https://www.rabbitmq.com/ |
| `Nacos` | 注册中心 | https://nacos.io/zh-cn/docs/quick-start.html |
| `OSS` | 对象存储 | [https://github.com/aliyun/aliyun-oss-java-sdk](https://gitee.com/link?target=https%3A%2F%2Fgithub.com%2Faliyun%2Faliyun-oss-java-sdk) |
| `SMS` | 短信服务 | https://www.aliyun.com/product/sms |
| `Dubbo``Lombok1.8.24` | RPC框架Java语言增强库 | https://cn.dubbo.apache.org/zh-cn/[https://github.com/rzwitserloot/lombok](https://gitee.com/link?target=https%3A%2F%2Fgithub.com%2Frzwitserloot%2Flombok) |
| `PageHelper` | MyBatis物理分页插件 | [http://git.oschina.net/free/Mybatis_PageHelper](https://gitee.com/link?target=http%3A%2F%2Fgit.oschina.net%2Ffree%2FMybatis_PageHelper) |
| `Swagger-UI2.0.2` | API文档生成工具 | [https://github.com/swagger-api/swagger-ui](https://gitee.com/link?target=https%3A%2F%2Fgithub.com%2Fswagger-api%2Fswagger-ui) |
| `Knife4j3.0.3` | API文档生成工具 | https://doc.xiaominfo.com/ |
| `Validation-api` | 参数校验 | https://beanvalidation.org/ |
| `FastJson1.2.23` | 序列化反序列化 | https://github.com/alibaba/fastjson/ |
| `Jwt0.9.0` | JWT登录支持 | http://jboot.com.cn/docs/jwt.html |
| `Hutool` | Hutool工具包 | https://gitee.com/dromara/hutool |
| `Apache Commons Lang3` | 工具包 | https://commons.apache.org/proper/commons-lang/ |
后端项目的所有依赖:
```xml
8
8
UTF-8
1.8
0.0.1
0.0.1
0.0.1
0.0.1
0.0.3
0.1.2-SNAPSHOT
0.0.1
0.0.4
2.7.2
2021.0.7
3.5.2
3.0.3
2.9.1
3.1.1
5.8.8
0.9.1
3.10.1
3.3.0
com.ghp
api-hub-admin
${api-hub-admin.version}
com.ghp
api-hub-gateway
${api-hub-gateway.version}
com.ghp
api-hub-common
${api-hub-common.version}
com.ghp
api-hub-interfas
${api-hub-interfas.version}
io.gitee.aghp
api-feign-sdk
${api-feign-sdk.version}
io.gitee.aghp
auth-login-sdk
${auth-login-sdk.version}
io.gitee.aghp
file-storage-sdk
${file-storage-sdk.version}
io.gitee.aghp
sms-email-sdk
${sms-email-sdk.version}
io.gitee.aghp
request-limiter-sdk
0.0.1
org.springframework.boot
spring-boot-dependencies
${spring-boot.version}
pom
import
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
com.baomidou
mybatis-plus-boot-starter
${mybatis-plus.version}
com.github.xiaoymin
knife4j-spring-boot-starter
${knife4j.version}
cn.hutool
hutool-all
${hutool-all.version}
io.jsonwebtoken
jjwt
${jwt.version}
```
## 组织架构
> 这一部分的**业务流程图**、**组织结构图**、**系统架构图**,后续将会陆续补充,敬请期待中(●'◡'●)……
略……o((>ω< ))o
### 前端组织结构
略……o((>ω< ))o
### 后端组织架构
略……o((>ω< ))o
## 模块介绍
### 前端模块介绍
前端就一个模块,后端管理页面和前台用户界面共享,通过配置动态路由实现不同角色展示不同页面,话说这个ant desgin 是真好用,越用越爽😄简直是我这种前端小菜鸡的最爱

### 后端模块介绍

- **api-hub-be**:项目父模块,用于对依赖进行版本控制
- **api-hub-admin**:项目管理模块,也是项目的主要模块,为前端模块提供了接口,对内部的 api-hub-gateway 也提供了服务接口,起到一个承上启下的作用
- **api-hub-gateway**:网关模块,提供了对于接口请求的一个认证,包括黑白 IP 名单控制、流量染色、签名认证
- **api-hub-interfas**:提供接口服务,内部或是调用本项目自带的服务接口,要么是调用互联网上其它免费的接口服务
## 项目环境搭建与运行
### 前端项目搭建与运行
```shell
npm i
npm run dev
```
启动成功后,即可在浏览器中访问`http://localhost:8000/`
### 后端项目搭建与运行
1. 首先确保有Java8的环境
2. 下载,使用IDEA打开
3. 刷新Maven加载依赖(如果没有配置镜像,依赖加载可能会很慢)
4. 将 SQL 文件导入你的数据库,SQL文件在项目中有
5. 将配置文件中 MySQL、Redis、RabbitMQ、Nacos等 host、username、password等属性配置成你自己的即可
需要注意的是,一定要先启动服务提供方(api-hub-admin),然后启动服务消费方(api-hub-gateway),否则会启动失败
6. 启动成功后,即可访问在线接口文档`http://localhost:8101/api/doc.html`
如果前台也已启动,则可以直接访问前端页面了
## 项目部署
> 详情请参考我的【[api-hub项目部署文件](https://blog.csdn.net/qq_66345100)】,现在还未发布,等过段时间发布。项目后端相关服务都是直接采用 Docker 化容器部署,通过编写 Dockerfile、 DockerCompose、Shell脚本,实现一条指令自动化部署,相较于传统部署大大减轻了部署负担、节约了部署时间,前端采用了宝塔部署,宝塔提供可视化面板以及响应的简化操作,能够节约很多时间,同时管理前端项目、修改Ngxin配置文件也很方便
## 如何使用本项目提供的接口服务
==**注意**==:由于我这个项目目前设置了IP黑白名单,目前白名单只有我的服务器IP能够调用,如果你想调用本项目提供的接口服务,可以联系我,我可以将您添加到白名单中,后续等项目逐渐完善后,我就会开放整个项目提供的接口,这样大家就都能够快乐的调用了,同时项目我也会逐渐添加一些我收集的有用、有趣的接口
- **Step1**:引用 api-feign-sdk 依赖
```xml
io.gitee.aghp
api-feign-sdk
0.0.3
```
当然也支持直接下载到本地,下载地址:
该依赖版本可能会不定期进行更新,最新版可以直接到Maven中央仓库进行搜索下载:[Maven Central (sonatype.com)](https://central.sonatype.com/?smo=true)


- **Step2**:登录网站 http://api-hub.xn--torp68ch8h18h1jp.top/
在个人中心获取你的 accessKey 和 SecretKey,在项目的配置文件中引用

```yaml
api:
feign:
access-key: xxxx
secret-key: xxxx
```
- **Step3**:调用接口
```java
// 在你想要使用的地方注入
@Resource
prvate ApiClient apiClient;
// 调用接口
responseResult = apiClient.invokeInterface(requestParams, url, method);
```
## 未完待续
项目整体算是开发完成了,但是我还想新增一些功能,同时对现有功能进行优化
- **现有功能优化**
1. 利用双Token自动续期实现无感知刷新。(重要)
目前项目中使用的是单Token登录校验,这样存在一个问题,当 token 过期了,用户会被强制下线,这个对用户体验不太好
2.
……
- **预期新增功能**
1. 对普通用户开放一个接口提交通道。(重要)
当前项目只有管理员才能够发布接口,对于普通用户只能调用接口和开通接口,无法进行发布接口,这显然是违背了我项目的初心的,我项目的初心是为了打造一个人人都可以共享接口的平台。但是需要注意的是如果新增了接口提交通过,需要添加一个接口审核
2. 记住我功能。(不重要)
这个功能算是很简单的了,我也不太打算增加了O(∩_∩)O,因为目前浏览器好像就自带了这个功能,属于
……
这里暂且先列举这些吧,后续慢慢优化补充,然后不断迭代更新这个项目,当然如果你有更好的注意或者想法欢迎与我交流(●'◡'●)
这是我的邮箱:3254213612@qq.com
## 结语
> 截至目前为止,这算是我第二个部署上线的项目,第一个是 [blog: 博客管理系统 (gitee.com)](https://gitee.com/aghp/blog) ,也是第四个比较完整的项目了,之前开发过比较完整[^1]的项目有:[reggie-take-out](https://gitee.com/aghp/reggie-take-out)((SpringBoot练手项目))、[hm-dianping](https://gitee.com/aghp/dianping)((Redis练手项目))、[aggregate-search-platform-be](https://gitee.com/aghp/aggregate-search-platform-be)((ElasticSearch练手项目))、[intelligent-bi-be](https://gitee.com/aghp/intelligent-bi-be)等,此外在开发这个项目期间,我自己也开发了许多方便好用的 SDK,比如:[auth-login-sdk](https://gitee.com/aghp/auth-login-sdk)(整合常见的第三方授权登录)、[sms-email-sdk](https://gitee.com/aghp/sms-email-sdk)(整合常见的第三方SMS服务和Email服务)、[file-storage-sdk](https://gitee.com/aghp/file-storage-sdk)(整合常见的OSS服务)、[request-limiter-sdk](https://gitee.com/aghp/request-limiter-sdk)(整合常见是限流算法)
api-hub项目开发总时间跨度是一个半月,开发期间遇到了很多很多bug,这里就不一一列举了,感兴趣的,可以参考【[api-hub项目开发踩坑记录](https://blog.csdn.net/qq_66345100)】,虽然遇到 bug 是一件令人苦恼的事情,但是这些东西在我看来也是十分珍贵的,它就是你的开发经验、它就是检测你对知识的熟练程度,能够让我对某些知识有更加深刻的认知,当然遇到 bug 在开发项目中是不可避免的,重点是我们要学会总结 bug,通过这些 bug 锻炼自己解决 bug 的能力,通过这些 bug 提高我们对一些知识的重视(感兴趣的可以关注我博客的 [Bug记录专栏](https://blog.csdn.net/qq_66345100/category_11873192.html?spm=1001.2014.3001.5482),这个专栏记录了我平常开发中遇到的各种bug,同时附带了对bug产生原因的分析和bug的解决方案)
整个项目总计 **8753 行**,其中 Java 代码共 **7278 行**、Lua 脚本 **62 行**

源代码行数为 **3778** 占比 **52%**,注释行数为 **2498** 占比 **34%**,代码与注释的占比为 5:3,这个比例我也不知道合不合理w(゚Д゚)w

开发api-hub项目对我的提升。api-hub项目的核心业务逻辑是借鉴了之前写的 Redis练手项目,让我对 Redis有了更加熟练的使用,同时也提高了我对接口优化的思路,比如:同步转异步、常用数据加缓存、高并发下的限流、setnx保障幂等性……也重新熟悉了缓存穿透、缓存击穿、缓存更新不一致性问题的常见解决方案,掌握了Dubbo、Nacos等微服务组件的基本使用。
有待提高的地方。当前项目并没有应用SQL优化技巧,这一点我感觉我现在还停留在纸上谈兵的境界,还没有实战过,虽然常见的SQL优化我也都有所了解,并且自己也跟着B站黑马老师进行过SQL语句的调优,但是还没有在自己项目中实战过,顶多就算一个 limit 优化,但是自己项目中的数据也比较少,完全达不到 limit 优化的门槛 w(゚Д゚)w,希望以后能够在公司里实战吧
最后,如果您觉得本项目对你有所帮助,欢迎打赏(●ˇ∀ˇ●)

[^1]: 比较完整:是我的个人理解,就算指具有比较完整的前后端交互流程