上一篇文章《推荐一个低代码的后端开发平台-DBAPI》我们介绍了低代码平台DBAPI的简单使用。由于是演示环境,因此在演示的时候我们使用的是docker安装部署,在真实的环境中,建议使用安装包的方式进行部署,这样子可控性更强。
前面我们说了这个低代码平台比较适合企业内部的数据分析平台这样的业务上的解决方案,但是试想一下,这里所有的查询每次都要走数据库,那查询量多了之后,是不是对数据库的压力比较大啊?常见我们的做法就是把数据缓存到redis中去,这个DBAPI也可以这么来做。只是他是以插件的方式来实现的,下面我们来编写一个DBAPI的缓存插件。
一、创建一个maven项目
在DBAPI里面,这个缓存是一个插件,因此我们需要自定义插件,这边需要单独编写一个项目然后打jar包之后放入DBAPI的环境中去。这里我们新创建一个maven项目,并且引入如下依赖:
<dependencies>
<!-- build dependencies -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>com.gitee.freakchicken.dbapi</groupId>
<artifactId>dbapi-plugin</artifactId>
<version>3.1.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.gitee.freakchicken.dbapi</groupId>
<artifactId>dbapi-plugin</artifactId>
<version>3.1.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8</version>
</dependency>
</dependencies>二、编写一个类,继承自com.gitee.freakchicken.dbapi.plugin.CachePlugin这个类
完整代码如下:
package com.dbapi.plugin.cache;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.gitee.freakchicken.dbapi.common.ApiConfig;
import com.gitee.freakchicken.dbapi.plugin.CachePlugin;
import com.gitee.freakchicken.dbapi.plugin.PluginConf;
import lombok.extern.slf4j.Slf4j;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* 这里我们实现使用redis进行缓存,方便查询类的业务进行数据缓存
*
* @author Administrator
*
*/
@Slf4j
public class RedisCache extends CachePlugin {
private JedisPool pool;
/**
* 插件名称,配置sql的时候,页面上选择的时候显示的就是这个名称
*/
@Override
public String getName() {
return "redis缓存插件";
}
/**
* 插件描述,配置sql的时候,页面上选择的时候显示的就是这个描述
*/
@Override
public String getDescription() {
return "把sql的结果缓存到redis中";
}
/**
* 插件参数描述,配置sql的时候,页面上选择的时候显示的就是这个描述
*/
@Override
public String getParamDescription() {
return null;
}
/**
* 插件初始化方法,实例化插件的时候执行,永远只会执行一次, 一般是用来创建连接池
*/
@Override
public void init() {
log.info("准备初始化redis的配置");
JedisPoolConfig jcon = new JedisPoolConfig();
jcon.setMaxTotal(200);
jcon.setMaxIdle(50);
jcon.setTestOnBorrow(true);
jcon.setTestOnReturn(true);
String password = PluginConf.getKey("redis.password");
if (StringUtils.isNotBlank(password)) {
log.info("初始化redis带有密码");
this.pool = new JedisPool(jcon, PluginConf.getKey("redis.ip"),
Integer.parseInt(PluginConf.getKey("redis.port")), 100, password,
Integer.parseInt(PluginConf.getKey("redis.db")));
} else {
log.info("初始化redis没有密码");
this.pool = new JedisPool(jcon, PluginConf.getKey("redis.ip"),
Integer.parseInt(PluginConf.getKey("redis.port")), 100, null,
Integer.parseInt(PluginConf.getKey("redis.db")));
}
log.info("jedis pool初始化成功");
}
/**
* 缓存设置
*
* @param config api配置
* @param requestParams request参数
* @param data 要缓存的数据
*/
@Override
public void set(ApiConfig config, Map<String, Object> requestParams, Object data) {
// redis缓存时间
String expireTime = config.getCachePluginParams();
Jedis jedis = null;
try {
jedis = pool.getResource();
String key = "api-" + config.getId();
String hashKey = "";
for (Object o : requestParams.values()) {
hashKey += o.toString() + "-";
}
jedis.hset(key, hashKey, JSON.toJSONString(data));
log.info("存储缓存的数据:key :{} hashkey:{} data:{} expireTime:{}",
new Object[] { key, hashKey, JSON.toJSONString(data), expireTime });
// 设置过期时间,过期时间从插件参数传过来
if (StringUtils.isNoneBlank(expireTime)) {
jedis.expire(key, Integer.parseInt(expireTime));
}
} catch (Exception e) {
log.error("设置缓存失败", e);
} finally {
if (jedis != null) {
jedis.close();
}
}
}
/**
* 清除所有缓存,API修改、删除、下线的时候会触发清除缓存
*/
@Override
public void clean(ApiConfig config) {
Jedis jedis = null;
try {
jedis = pool.getResource();
String key = "api-" + config.getId();
log.info("准备删除的redis key是:{}",key);
jedis.del(key);
} catch (Exception e) {
log.error(e.getMessage(), e);
} finally {
if (jedis != null) {
jedis.close();
}
}
}
/**
* 查询缓存
*
* @param config api配置
* @param requestParams request参数
* @return
*/
@Override
public Object get(ApiConfig config, Map<String, Object> requestParams) {
Jedis jedis = null;
try {
jedis = pool.getResource();
String key = "api-" + config.getId();
String hashKey = "";
for (Object o : requestParams.values()) {
hashKey += o.toString() + "-";
}
String hget = jedis.hget(key, hashKey);
log.info("根据key:{} hashkey:{} 获取到的结果是:{}",new Object[] {key,hashKey,hget});
List<JSONObject> list = JSON.parseArray(hget, JSONObject.class);
return list;
} catch (Exception e) {
log.error("查询缓存失败", e);
return null;
} finally {
if (jedis != null) {
jedis.close();
}
}
}
}集成这个类之后,我们他里面有完整的声明周期方法,这里我们使用的是redis的缓存,因此根据声明周期方法编写redis相关的代码即可。详情的逻辑见上文的注释。
三、添加SPI注册
在这里,DBAPI是用的SPI的模式来注册插件的,因此我们需要根据SPI的规则,把当前的RedisCache给添加到注册信息里面去。详细步骤如下:
在src/resources目录下创建一个META-INF的文件夹 在src/resources/META-INF目录下创建一个services的文件夹 在src/resources/META-INF/services目录下创建一个名称为:com.gitee.freakchicken.dbapi.plugin.CachePlugin的文件 把RedisCache类的完整路径填写到上面第三步的文件里面去
四、添加build,把当前的maven项目打包成jar包
这里首先我们在maven的pom.xml文件里面添加如下的build信息
<build>
<resources>
<!--plugin.properties配置文件不打进jar包,dbApi框架已经自带这个文件 -->
<resource>
<directory>src/main/resources/</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>false</stripVersion>
<includeScope>runtime</includeScope>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>然后使用mvn install命令,可以看到target下面已经把当前项目打包成jar了。
但是这个包很小,没有把依赖包打进去,我们可以在target目录下看到lib文件夹,这里面就是依赖包
五、把jar包复制到DBAPI平台
上面我们的插件写好了,然后也打包了,这里我们把上面第四步看到的4个jar包放到服务器的DBAPI平台的 ${DBAPI_HOME}/lib/文件夹下
然后我们再重新启动下DBAPI
六、登录DBAPI平台,添加插件
上面我们已经完成了重启,这里的话,我们登录上DBAPI平台,可以在API配置里面看到具体的插件,点击: API->创建API
点击高级配置
在缓存这里我们就能看到对应的缓存插件了。这里我们修改下之前的getUserInfoByUserId这个接口
七、测试API是否有缓存
我们还是拿之前的getUserInfoByUserId这个接口进行测试
此时我们在服务器的日志里面就能看到对应的redis缓存使用情况了。
到此为止,我们在DBAPI上使用redis缓存的插件就成功了。
备注:
1、这里插件的话,编写完了,一定要记得做SPI的注册。
2、这里的jedis,在pom里面的scope值是provider,也就是不需要打包jedis,因此DBAPI里面自带有jedis,如果我们再放一个其他版本的jedis包到DBAPI的lib目录下,那么启动的时候会直接报错,产生jedis的版本冲突。
3、DBAPI的插件只会在启动的时候初始化一次,后续不会再进行任何初始化了。
4、如果DBAPI是集群部署的话,那么需要把插件放到每一个DBAPI节点的lib下。
5、只要插件进行更新或者需要重新加载插件的情况下,就一定要做DBAPI的重启。
最后按照惯例,附上本案例的源码,登录后即可下载




















还没有评论,来说两句吧...