# 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%,亏我还浪费了大把时间在这部署上面 ![image-20230911122300182](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956020.png) ## 功能介绍 > 这里就主要介绍后端提供的功能吧,前端就不过多介绍了(前端无非就是发请求、样式调整,逻辑性的东西不是很多,如果前端大佬看到了我这句评价,别喷我,我只是对于本项目前端的一个看法,并不是对所有的前端项目是这个看法,我就一个前端小菜鸡(●'◡'●),也就只会发发请求、改改样式,然后就是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这个是有所标记的 ![image-20230911135703892](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956022.png) ![接口调用时序图](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956023.png) 当然对于接口的信息,我对于接口的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登录 ### 前台演示 - **登录注册页面** ![image-20230911122647641](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956024.png) ![image-20230911183010897](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956025.png) ![image-20230911183211858](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956026.png) ![image-20230912143052946](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956027.png) ![image-20230912151904810](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956028.png) ![image-20230912151938440](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956029.png) ![image-20230912143110173](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956030.png) ![image-20230911183450727](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956031.png) ![image-20230911214424004](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956032.png) ![image-20230911183426712](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956033.png) ![image-20230911184447978](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956034.png) ![image-20230911221048851](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956035.png) ![image-20230911234631957](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956036.png) - **接口商店** ![image-20230911215719298](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956037.png) - **个人中心** ![image-20230911215735046](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956038.png) - **接口管理** ![image-20230911220819800](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956039.png) ![image-20230911220835656](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956040.png) ### 后台演示 > 后端好像也没什么好演示的,这里就大致展示一下项目的目录结构吧(●'◡'●),同时也展示一下在线客户端页面🤣 - 后端在线接口文档 ![image-20230911184149738](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956041.png) ![image-20230911184231630](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956042.png) - RabbitMQ在线客户端 ![image-20230911184107516](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956043.png) ![image-20230911184132933](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956044.png) - 宝塔面板在线客户端 ![image-20230911154110375](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956046.png) ![image-20230911183950237](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956047.png) ## 技术选型 ### 前端技术选型 | 技术 | 说明 | 文档 | | --------------------------- | --------------- | ------------------------------------------------------------ | | `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 是真好用,越用越爽😄简直是我这种前端小菜鸡的最爱 ![image-20230911162247925](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956048.png) ### 后端模块介绍 ![image-20230911161749307](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956049.png) - **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) ![image-20230912155034752](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956050.png) ![image-20230912155040948](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956051.png) - **Step2**:登录网站 http://api-hub.xn--torp68ch8h18h1jp.top/ 在个人中心获取你的 accessKey 和 SecretKey,在项目的配置文件中引用 ![image-20230912162739905](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956052.png) ```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 行** ![image-20230912194336503](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956053.png) 源代码行数为 **3778** 占比 **52%**,注释行数为 **2498** 占比 **34%**,代码与注释的占比为 5:3,这个比例我也不知道合不合理w(゚Д゚)w ![image-20230912194619402](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956054.png)   开发api-hub项目对我的提升。api-hub项目的核心业务逻辑是借鉴了之前写的 Redis练手项目,让我对 Redis有了更加熟练的使用,同时也提高了我对接口优化的思路,比如:同步转异步、常用数据加缓存、高并发下的限流、setnx保障幂等性……也重新熟悉了缓存穿透、缓存击穿、缓存更新不一致性问题的常见解决方案,掌握了Dubbo、Nacos等微服务组件的基本使用。   有待提高的地方。当前项目并没有应用SQL优化技巧,这一点我感觉我现在还停留在纸上谈兵的境界,还没有实战过,虽然常见的SQL优化我也都有所了解,并且自己也跟着B站黑马老师进行过SQL语句的调优,但是还没有在自己项目中实战过,顶多就算一个 limit 优化,但是自己项目中的数据也比较少,完全达不到 limit 优化的门槛 w(゚Д゚)w,希望以后能够在公司里实战吧 最后,如果您觉得本项目对你有所帮助,欢迎打赏(●ˇ∀ˇ●) ![image-20230911220420787](https://gitee.com/aghp/typora-img/raw/master/api-hub/202309121956055.png) [^1]: 比较完整:是我的个人理解,就算指具有比较完整的前后端交互流程