# Apitool **Repository Path**: jq1109lvr/apitool ## Basic Information - **Project Name**: Apitool - **Description**: Apitool接口平台 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-09-21 - **Last Updated**: 2023-10-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Apitool ## 项目名称 Apitool接口平台 ## 项目简介 **Apitool**:一个提供API接口供开发者调用的网站。 用户可以注册登录。用户可以浏览接口并调用,并且每次调用会进行统计。 管理员可以发布接口、下线接口、修改接口信息。 实现可视化接口的调用情况,比如前三名调用最多的接口可视化。 ## 业务功能 - 普通用户:注册登录、浏览接口、使用接口。 - 管理员发布接口、下线接口、新增接口、修改接口信息。 - 可视化接口调用接口。 **架构图:** **![image-20230922173033247](https://cdn.jsdelivr.net/gh/Eliaukgit/tuchuang/img/image-20230922173033247.png)** ## 技术选型 ### 前端 - React 18 - Ant Design Pro 5.x脚手架 - Ant Design & Procomponents组件库 - Umi 4前端框架 - OpenAPI前端代码生成 ### 后端 - Java Spring Boot 2.7x 框架 - MySQL 8.x版本 - Mybatis-Plus 及 Mybatis X 自动生成 - API签名认证(Http调用) - Spring Boot Starter(SDK开发) - Dubbo 分布式(RPC、Nacos) - Spring Cloud Gateway 微服务网关 - Swagger + Knife4j接口文档生成 - Hutool、Apache Common Util、Gson等工具库 ## 项目模块 - apitool-frontend-master :项目前端,前端项目启动具体看readme.md文档 - apitool-common :公共封装类(如公共实体、公共常量,统一响应实体,统一异常处理),我们需要将其打包,在其他项目引用。 - apitool-back :项目主要的后端,接口管理平台,主要包括用户、接口相关的功能 - apitool-gateway :为网关服务,**涉及到网关限流,统一鉴权,统一日志处理,接口统计,接口数据一致性处理** - api-interface:为接口服务,提供可供调用的接口,调用的接口就放在这个模块里面 - apitool-client-sdk:提供给开发者的SDK,相当于一个客户端发起请求调用,调用后被网关拦截鉴权等,符合要求放行后调用接口。 ## 项目展示 - 登录页 ![image-20230922180313944](https://cdn.jsdelivr.net/gh/Eliaukgit/tuchuang/img/image-20230922180313944.png) - 注册页 ![image-20230922180350838](https://cdn.jsdelivr.net/gh/Eliaukgit/tuchuang/img/image-20230922180350838.png) - 首页 ![image-20230922180432864](https://cdn.jsdelivr.net/gh/Eliaukgit/tuchuang/img/image-20230922180432864.png) - 接口管理页 ![image-20230922180513704](https://cdn.jsdelivr.net/gh/Eliaukgit/tuchuang/img/image-20230922180513704.png) - 新增接口页 ![image-20230922180606629](https://cdn.jsdelivr.net/gh/Eliaukgit/tuchuang/img/image-20230922180606629.png) - 修改接口页 ![image-20230922180636860](https://cdn.jsdelivr.net/gh/Eliaukgit/tuchuang/img/image-20230922180636860.png) - 接口分析页 显示前三名 ![image-20230922180718944](https://cdn.jsdelivr.net/gh/Eliaukgit/tuchuang/img/image-20230922180718944.png) ## 快速上手 ### 后端 1. 将各模块配置修改成你自己本地的端口、账号、密码 2. 执行sql语句创建项目需要的数据库表(放在apitool-back模块下的sql包里) 3. 启动Nacos、Mysql、Redis.......没用到Redis就可以在apitool-back的application.yml中注释掉Redis 4. 将公共服务 api-common 以及客户端 SDK(apitool-client-sdk) 安装到本地仓库 (使用maven包管理工具install到本地仓库) 5. 按顺序启动服务 服务启动顺序参考: 在启动前一定先要把上面第三步的两个模块打包到本地仓库,不然在其他模块引入时是找不到的,因为本地仓库并没有这两个依赖。 1. apitool-back 2. apitool-gateway 3. apitool-interface ### 前端 环境要求 Node.js >= 16 ![image-20230922175641103](https://cdn.jsdelivr.net/gh/Eliaukgit/tuchuang/img/image-20230922175641103.png) 安装依赖: ``` yarn ``` 启动: package.json文件下 ```react "start:dev": "cross-env REACT_APP_ENV=dev MOCK=none UMI_ENV=dev max dev", ``` ## 知识补充 ### 1.Node.js - [Node.js官网](https://nodejs.org/zh-cn) - [Node.js安装](https://blog.csdn.net/weixin_44893902/article/details/121788104?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168830138516800222823395%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168830138516800222823395&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-121788104-null-null.142^v88^koosearch_v1,239^v2^insert_chatgpt&utm_term=nodejs%E5%AE%89%E8%A3%85%E5%8F%8A%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE&spm=1018.2226.3001.4187) 在 Node.js 之前,JavaScript 只能运行在浏览器中,作为网页脚本使用,为网页添加一些特效,或者和服务器进行通信。有了 Node.js 以后,JavaScript 就可以脱离浏览器,像其它编程语言一样直接在计算机上使用,想干什么就干什么,再也不受浏览器的限制了。 Node.js 不是一门新的编程语言,也不是一个 JavaScript 框架,它是一套 JavaScript 运行环境,用来支持 JavaScript 代码的执行。用编程术语来讲,Node.js 是一个 JavaScript 运行时(Runtime)。 ### 2.npm npm 是 [Node.js](https://nodejs.org/zh-cn) 的包管理工具,用来安装各种 Node.js 的扩展。 npm 是 JavaScript 的包管理工具,也是世界上最大的软件注册表。有超过 60 万个 JavaScript 代码包可供下载,每周下载约 30 亿次。npm 让 JavaScript 开发人员可以轻松地使用其他开发人员共享的代码。 ### 3.yarn - [yarn官网](https://yarnpkg.com/) - [yarn安装](https://blog.csdn.net/weixin_40808668/article/details/122606543?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168830157416800184147656%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168830157416800184147656&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-122606543-null-null.142^v88^koosearch_v1,239^v2^insert_chatgpt&utm_term=yarn%E5%AE%89%E8%A3%85&spm=1018.2226.3001.4187) Yarn是facebook发布的一款取代npm的包管理工具。 ### 3. Spring Boot Spring Boot 是一个用于简化创建独立的、基于生产级别的 Spring 应用程序的框架。它通过提供默认的配置和约定大于配置的方式,简化了 Spring 应用程序的开发过程,减少了开发者的配置工作。 Spring Boot 使用了一种名为 "约定优于配置" 的方式,它提供了一些默认配置和常用的依赖项,可以快速启动和运行应用程序。Spring Boot 还提供了自动配置和快速集成的能力,可以方便地集成其他常用框架和技术。 ### 4. MyBatis 和 MyBatis-Plus - [MyBatis 官网](https://mybatis.org/mybatis-3/zh/index.html) - [MyBatis-Plus 官网](https://mp.baomidou.com/) MyBatis 是一个持久层框架,用于将 Java 对象与数据库之间进行映射。它提供了简单且强大的 SQL 映射功能,可以通过 XML 配置或注解来实现对象与数据库表的映射关系,从而实现对数据库的增删改查操作。 MyBatis-Plus 是对 MyBatis 的增强,它提供了更加便捷的操作方法和功能。MyBatis-Plus 可以自动生成常用的增删改查 SQL,大大简化了编码工作。它还提供了分页查询、条件构造器、乐观锁、性能分析等功能,提高了开发效率和代码质量。 ### 5. MySQL 数据库 MySQL 是一种开源的关系型数据库管理系统(RDBMS),被广泛应用于各种 Web 应用程序和软件开发项目。它具有稳定、高效、易用等特点,并支持大规模数据存储和高并发访问。 MySQL 使用 SQL(Structured Query Language)作为其查询语言,可以进行复杂的数据库操作,包括数据的增删改查、事务管理、用户权限控制等。 ### 6.Hutool工具类库 [Hutool官方](https://hutool.cn/) Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。 Hutool中的工具方法来自每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当; Hutool是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug。 ### 7.网关 为了让用户调用+1的代码复用,一般有拦截器、过滤器、AOP切面等实现方式。但是缺点是只存在于单个项目中,如果每个团队都开发自己的接口,需要重复实现自己的AOP切面。所以我们需要在网关实现! **网关学习资料** 作用: 1.路由:[https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories](https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories) 2.负载均衡 3.统一鉴权 4.跨域 [https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#cors-configuration](https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#cors-configuration) 5.统一业务处理(缓存) 6.访问控制 (黑白名单) 7.发布控制(灰度发布) [https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-weight-route-predicate-factory](https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-weight-route-predicate-factory) 8.流量染色(给请求头添加一些字段,标明来源)[https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-addrequestheader-gatewayfilter-factory](https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-addrequestheader-gatewayfilter-factory) 9.接口保护 - 限制请求 [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/#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/#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/#fallback-headers) - 限流(令牌桶算法、漏桶算法,RedisLimitHandler可以了解一下)[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/#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/#http-timeouts-configuration) - 重试 [https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-retry-gatewayfilter-factory](https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-retry-gatewayfilter-factory) 10.统一日志 11.统一文档,建议用[https://doc.xiaominfo.com/docs/middleware-sources/aggregation-introduction](https://doc.xiaominfo.com/docs/middleware-sources/aggregation-introduction) 技术选型:[https://zhuanlan.zhihu.com/p/500587132](https://zhuanlan.zhihu.com/p/500587132) - Nginx(全局网关)、Kong网关(API网关,Kong:[https://github.com/Kong/kong),](https://github.com/Kong/kong),)编程成本相对高 - Spring Cloud Gateway(取代了Zuul)性能高、可以用Java代码来写逻辑,适于学习 本项目网关使用 Spring Cloud Gateway,官方文档如下。 ![image-20230922182506585](https://cdn.jsdelivr.net/gh/Eliaukgit/tuchuang/img/image-20230922182506585.png) 两种配置方式,先用配置式,不能满足要求再用编程式。 - 编程式(麻烦但是灵活)[https://spring.io/projects/spring-cloud-gateway/#samples](https://spring.io/projects/spring-cloud-gateway/#samples) - 配置式(简单) 建议开启网关的级别为trace,方便在开发的过程中代码调试。 ```xml logging: level: org: springframework: cloud: gateway: trace ``` ### 8.Dubbo框架 (RPC 实现 ) **怎么调用其他项目的方法?** 1. 复制代码、依赖、环境。 2. HTTP请求(提供一个接口。供其他项目调用) 3. RPC 4. 把公共的代码打个jar包,其他项目去引用(客户端SDK) **HTTP请求怎么调用?** 1. 提供方开发一个接口(地址、请求方法、参数、返回值)。 2. 调用方使用HTTP Client之类的代码包去发送HTTP请求。 **RPC** 作用:像调用本地方法一样去调用远程方法。 和直接HTTP调用的区别: 1. 对开发者更透明,减少了很多沟通成本。 2. RPC向远程服务器发送请求时,未必要使用HTTP协议,比如还可以使用TCP/IP,性能更高。(内部服务器更适合) **RPC调用模型** ![image-20230922183618808](https://cdn.jsdelivr.net/gh/Eliaukgit/tuchuang/img/image-20230922183618808.png) Dubbo框架是RPC的一种实现框架,其他的RPC框架还有如 GRPC、TRPC。 [Dubbo官方文档](https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/quick-start/) 整合Nacos注册中心:https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/registry/nacos/ 服务调用项目和提供者尽量引入相同的依赖和配置 ```xml org.apache.dubbo dubbo 3.0.9 com.alibaba.nacos nacos-client 2.1.0 ``` # 致谢 如果你喜欢这个项目,请给一个星星⭐支持并在Gitee上关注该项目。 欢迎访问 [Gitee 项目地址](https://gitee.com/jq1109lvr/user-rights) 获取最新代码和更多信息。 作者:Eliaukjq 邮箱:3131917861@qq.com