没更新文章的这些天一直在写hades项目(Java轻量级规则引擎),这两天发布了个新的版本v1.0.4。
可能有新的同学就会想问了:什么是规则引擎呀?
项目背景:业务开发逻辑变更频繁,一点小的修改都要发布系统,灵活度不够。对于一些非核心流程又频繁改动的部分是否可以用动态脚本替代? 核心功能:Java应用无须发布上下线,动态变更业务逻辑,对象实例均交由Spring管理 不适用场景:脚本依赖运行环境不存在的SDK和对象
在v1.0.3版本,我已经实现了核心的逻辑。可以通过分布式配置中心自带的后台,去手动增加/修改/删除配置进而实现脚本逻辑动态编译,最后注册到Spring iOC容器中。
而在v1.0.4版本,我写了个后台hades-web去对接分布式配置中心(目前仅支持nacos,因为apollo没有提供现成修改配置的接口,有点麻烦)。有了界面了以后,我又加上了条件逻辑(规则可视化):在页面上配置参数的信息,根据配置生成Java代码。
<!--如果你用apollo,则引入该dependency,建议用最新的版本-->
<dependency>
<groupId>io.github.ZhongFuCheng3y</groupId>
<artifactId>hades-apollo-starter</artifactId>
<version>1.0.4</version>
</dependency>
<!--如果你用nacos,则引入该dependency,建议用最新的版本-->
<dependency>
<groupId>io.github.ZhongFuCheng3y</groupId>
<artifactId>hades-nacos-starter</artifactId>
<version>1.0.4</version>
</dependency>
在接入hades的项目配置文件中(如:application.properties)填写hades相关的配置信息
nacos分布式配置中心示例:
nacos.config.server-addr=austin-nacos:8848
nacos.config.username=nacos
nacos.config.password=nacos
nacos.config.namespace=hades
nacos.config.enabled=true
# hades param you should write
hades.enabled=true
hades.config-name=hades
apollo分布式配置中心示例:
app.id=hades
apollo.bootstrap.enabled=true
apollo.meta=austin-apollo
# hades param you should write
hades.enabled=true
hades.config-name=hades
目前后端部署仅支持使用nacos的小伙伴,hades有对应配置页面,将hades的前端和后端部署起来会方便使用些。
后端是SpringBoot应用,入口:com.java3y.hades.HadesApplication,前端是amis低代码平台,点击前端Git仓库进行部署。
后端的模块是在hades-web,对应的配置文件在application.properties,按自身情况自行修改:
# hades param you should write
hades.enabled=true
hades.config-name=hades
# nacos
nacos.config.enabled=true
nacos.config.server-addr=austin-nacos:8848
nacos.config.username=nacos
nacos.config.password=nacos
nacos.config.namespace=hades
1、可选择直接添加Java代码,注意不要用lombok和lambda,groovy是不认的。

2、如果是轻量级的逻辑,也可以直接在界面上配置逻辑,比如对字符串和数值的判断。当提交了之后,会根据条件自动生成对应Java代码,注册到iOC容器中

3、添加规则完后,能在规则列表中看到对应内容,并将其脚本注册到Spring iOC容器中,供客户端使用

完全可以只通过分布式配置中心的后台,手动去创建配置,来实现效果。步骤如下:
1、在对应的分布式配置中心创建hades主配置(配置名是hades.config-name的值),配置内容如下:
{
"instanceNames": [
"com.java3y.hades.domain.HadesParam"
],
"updateTime": "2023年3月20日10:26:0131"
}
注:hades所有的配置内容在分布式配置中心默认均为txt格式。hades会监听以上配置的变更,当新增或修改了Groovy脚本时,需要手动更新该配置。
2、新建Groovy脚本,apollo需要跟主配置在同appId下,nacos在同namespace下。Groovy脚本跟Java代码99%相同(不写lambda和lambda即可)

客户端使用HadesClient获取对象或执行方法
@RequestMapping("/test")
private void test() {
// 获取脚本对象,用接口接收
SendSmsService sendSmsService = hadesClient.getInterfaceByName("com.java3y.hades.example.apollo.demo.TencentSmsService");
sendSmsService.send();
// 获取GroovyObject对象
GroovyObject groovyObject = hadesClient.getGroovyObjectByName("com.java3y.hades.example.apollo.demo.TencentSmsService");
groovyObject.invokeMethod("send", null);
log.info("groovy object:{}", groovyObject);
// 直接执行脚本对应的方法,得到返回值
Object execute = hadesClient.execute("com.java3y.hades.example.apollo.demo.TencentSmsService", "send", null);
System.out.println("result" + execute);
}