前言
对于数据开发人员来说,把数据通过api的方式提供出去,往往是数据开发的最后一公里。对于一个数据开发人员来说,通过自己写java或者其他代码提供数据服务往往比较困难,但是写SQL对他们来说是so easy,所以需要有一个工具通过SQL的方式快速提供API。搜索几方,发现已经有比较成熟的开源方案。
一、相关开源产品
Dataway https://www.hasor.net/doc/display/dataway
Magic-API ssssssss-team
Rocket-API-Platform rocket-api-platform: 服务端面向SQL开发API的低代码平台。来源于rocket-api,可以实现在页面上动态管理多数据源配置可以用于作统一的数据接口平台
功能 | Magic-api | Dataway | Rocket-api |
开源协议 | MIT License | Apache-2.0 License | Apache-2.0 License |
数据源支持 | 支持关系型数据库,redis,mongodb,es插件方式支持,其他可以扩展;支持多数据源 | 关系型数据库;支持多数据源 | 关系型数据库,Mongodb,ClickHouse,其他可以扩展;支持多数据源 |
鉴权 | 支持 | 支持 | 无 |
脚本支持 | 支持java导入,支持自定义脚本语言 | DataQL | 支持groovy语法 |
stars | 2.4 | 1.1k | 1.2k |
3个对比,功能基本上都差不多;Magic-API对权限这块相对完善,脚本支持相对强大,所以选择Magic来搭建
二、Magic-API搭建
- 新建一个SpringBoot项目,依赖Web和JDBC
2.添加依赖包
pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.yft.cloud</groupId>
<artifactId>yft-magic-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>yft-magic-api</name>
<description>project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.ssssssss</groupId>
<artifactId>magic-api-spring-boot-starter</artifactId>
<version>1.4.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.23</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>10.2.0.2.0</version>
</dependency>
<dependency>
<groupId>net.sourceforge.jtds</groupId>
<artifactId>jtds</artifactId>
<version>1.3.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.增加配置
application.properties
server.port=9999
#配置web页面入口
magic-api.web=/magic/web
#配置文件存储位置。当以classpath开头时,为只读模式
magic-api.resource.location=/data/magic-api
#默认数据源
spring.datasource.url=jdbc:mysql://ip:3306/magic
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=app
spring.datasource.password=app
#登入鉴权
# 登录用的用户名
magic-api.security-config.username=admin
# 登录用的密码
magic-api.security-config.password=123456
4.编译启动
mvn clean package
编译目录下来 ~\yft-magic-api\target
java -jar yft-magic-api-0.0.1-SNAPSHOT.jar
5.文档信息
官方演示例子:magic-api
官方文档:magic-api
6.问题
1>编译的时候报 Input length = 1
解决方案:Springboot部署出现Input length = 1 或者Input length =2问题,导致maven install不成功_峰子_狂人的博客-CSDN博客
2>部署服务器出现这个的时候是因为编码的问题,
那么在idea中打开settings–Editor-File Econdings,设置yml为UTF-8,
如果还是不行,那么就将yml内容复制,把application.yml删除,再重新创建改文件,将内容放进去。
properties文件同理
三、Docker环境
1 准备工作
编译magic-api-plugin 项目 mvn clean package
把编译的包引入pom.xml,路径按实际情况修改
<dependency>
<groupId>org.d8s</groupId>
<artifactId>magic-api-plugin-security-starter</artifactId>
<version>1.1.1</version>
</dependency>
pom.xml 增加,利用 dockerfile-maven-plugin 来制作Docker镜像
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.13</version>
<executions>
<execution>
<id>default</id>
<goals>
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
</executions>
<configuration>
<repository>${project.artifactId}</repository>
<tag>${project.version}</tag>
<buildArgs>
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
更新修改对应的版本
<dependency>
<groupId>org.ssssssss</groupId>
<artifactId>magic-api-spring-boot-starter</artifactId>
<version>1.7.5</version>
</dependency>
跟pom.xml同级目录创建Dockerfile文件
FROM java:8
#ARG JAR_FILE
RUN mkdir -p /opt/soft/magic/logs
#RUN mkdir -p /opt/soft/magic/config
#ADD src/main/resources/application.yml /opt/soft/magic
ADD target/yft-magic-api-0.0.1-SNAPSHOT.jar /opt/soft/magic/yft-magic-api.jar
#ADD target/lib /opt/soft/magic/lib
#ADD target/config /opt/soft/magic/config
#RUN cd /opt/soft/magic
ENTRYPOINT ["java","-jar","/opt/soft/magic/yft-magic-api.jar"]
EXPOSE 9999
2 镜像生成:
2.1 修改配置文件
修改配置文件:src/main/resources/application.yml 或者 application.properties
主要是数据库信息 spring.datasource.xxxx
2.2 镜像生成
如果需要外部加载jar包
手工下载 ojdbc6-11.2.0.3.jar,保存在一个目录(自动下载不过来) ;没有用到oracle就去掉
mvn install:install-file -Dfile=/opt/tici/yft-magic-api/ojdbc6-11.2.0.3.jar -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.3 -Dpackaging=jar dockerfile:build -Dmaven.test.skip=true
不需要外部加载jar包
mvn clean package [dockerfile:build] -Dmaven.test.skip=true
3 镜像启动
docker network create --subnet=172.16.0.0/24 mynetwork
docker run -itd --net mynetwork --ip 172.16.0.2 -p 9999:9999 yft-magic-api:0.0.1-SNAPSHOT
四、鉴权配置
整体配置入口 magic-plugin
magic-plugin:
denyGroupPath: system # 系统分组
localIp: "127.0.0.1,localhost" #全局白名单,目前没有开启
auth:
enable: true
encryIndex: 9
users:
admin: 123456
dev: 123456
denyOptions:
admin:
dev: DELETE
openauth:
enable: true
limiter:
enable: true
permits:
per:
second: 20
iplimit:
enable: true
custauth:
enable: true
- 登入
1.1 系统配置
没有在数据库配置,直接在配置文件中配置用户
magic-plugin:
auth:
enable: true #开启验证
users:
admin: 123456 #用户:密码对,可以添加多个
dev: 123456
denyOptions:
admin: #用户:权限
dev: DELETE
# 权限列表
NONE,
SAVE,
VIEW,
DELETE,
DOWNLOAD,
UPLOAD,
PUSH,
LOCK,
UNLOCK;
2.Token鉴权
每个用户 生成一个token,并且需要配置相应的role,匹配才能访问
2.1 系统配置
magic-plugin:
custauth:
enable: true
2.2 后端配置
2.3 接口配置
3.验签
需要匹配 参数+sign,控制到具体参数,参数变化就访问不了
3.1 系统配置
openauth:
enable: true
3.2 后端配置
3.3 接口
原则上路径变量、请求body 都需要验证,目前基本也没什么用到,未测试,建议暂不使用
4.黑白名单
对每个api可以配置黑白名单,如果设置了白名单,以白名单为准来限制;如果白名单没有设置,以黑名单为准限制;不能两个都不设置,如果启用至少要设置一个。
4.1 系统配置
iplimit:
enable: true
4.2 后端配置
多个IP以逗号分割,目前只能控制具体ip,子网掩码还未支持。
4.3 接口配置
无需配置
5.限流
5.1 系统配置
limiter:
enable: true
5.2 后端配置
apache-jmeter-5.4.1测试工具 使用Jmeter进行http接口性能测试 - FeMiner - 博客园
这块配置效果测试有一定效果,但是还是不太清楚这几个参数
参数解释:
令牌速率:20
预热期:1
预热期单位:分
该接口每分钟产生令牌数20?
获取令牌的最大等待时间:获取令牌桶中一个令牌,最多等待3秒
5.3 接口配置
无需配置