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
浙公网安备 33010602011771号