drools

 

  drools 运行期编译加载 JavaCompiler CICD编译部署(我用的)
编译

ASM

 

选编译器有风险,且编译器未必可用,耗CPU、内存 不耗CPU
可读性 统一约定/强
insert/update/retract 功能 灵活    
属性/优先级/生效时间/过期时间/enable/只挑一个/定时 灵活    
springboot集成 现成    
workbench 现成    
鉴权

本地jar包无

远程basic认证

rsa,用应用公钥加密

借助私钥的安全性

rsa

 

1 asm生成类,类似mybatis之于jdk动态代理 

2 org.drools.core.rule.JavaDialectRuntimeData.PackageClassLoader 

改写loadClass突破双亲委派,先加载外部rule规则,且不加载其他class,findclass不实现

 

1)事实对象类不加载远程jar包,依靠父加载器,都是2557

2)findClass没有实现,调用基类直接抛错

3)该加载器只加载8个rule的class

 

3 ConcurrentHashMap配合fullname ------》 加载类时的锁

4 org.drools.core.io.impl.UrlResource#getInputStream jar包本身不加密,本地直接加载,远程即使有basic认证,如果在传输层发起攻击,可被中间人;

  jar包发布到maven仓库,意味着所有人可以去看;

  原则上事实对象与策略应该分离,策略单独jar包rsa加密;

  原则是只有风控分析师团队有权限访问策略,技术团队不应有权限

5 不当写法容易造成方法区内存泄漏,coding应尽量避免高频加载,优化客户端代码

 

问题:

1 是否可以引入workbench生成的jar包,而不是再写代码定义?

可以,统一由应用所在加载器加载

 

2 为什么它突破了双亲委派

为了避免一些小概率的rule class被父加载器委托的情况,绝对避免改动在运行期没法生效

 

3 它本身突破了双亲委派,意味着外部事实对象怎么传进去的?

1)我想的:运行期生成子加载器Order对象,然后一一反射同步,然后传入子加载器的类的对象

入参时,反射遍历父加载器对象,set子加载器对象

出参时,反向操作

 

2)比我高明:PackageClassLoader不加载Order,依托双亲委派,这样对象就能传进去

 

4 为什么包名成员要一样?

否则import加载时报错,可能加载不到

 

5 主代码与workbench的事实对象必须同时release?

最好可以直接引用,否则会出现不统一,运行期方法区报错

 

6 org.drools.core.common.ProjectClassLoader#internalLoadClass这个加载器干啥的?

不知道,不重要,它夹在AppClassLoader与PackageClassLoader之间

 

7 有没有用asm生成类?

 

 

 

 

参考:

https://zhuanlan.zhihu.com/p/669015974

https://downloads.jboss.org/drools/release/7.6.0.Final/

https://download.csdn.net/blog/column/11651869/123776495

https://cloud.tencent.com/developer/article/2207484

 

posted on 2025-07-20 01:03  silyvin  阅读(29)  评论(0)    收藏  举报