目前有两个独立的业务系统A和B,都基于Spring Boot
A系统做完某些业务后,会调用B系统的方法。 例如B系统为消息推送系统,提供了一个消息推送的接口。A系统在完成签到业务后调用B推送系统推送消息
//系统A的某项业务示例代码
public void doSomeThing(){
//系统A 某项业务结束,调用B系统的方法
A.doSomeThing();
B.invokeMethod();
}
现在问题是,如果有新的业务需要推送消息那么我们现在的做法:
- 停掉A系统
- 在A系统里面的相关业务再加上一句
B.invokeMethod()
- 然后重新将A打包再上线
如果有新的需求,就周而复始这样的操作
目前我个人考虑,能不能利用配置文件,或者数据库表的配置,配置哪个类的哪个方法,执行完了调用一下B.invokeMethod()
。当有新需求,修改配置文件或者表,利用类似Spring Bus等消息的方式,将改变下发到业务A,业务A再重新加载配置。就类似于Spring Cloud的配置中心。但这种做法,目前没找到解决办法
目前有没有什么方案,或技术能够在运行时动态增加调用方法,来解决这类问题?
你这个情况可以考虑做一个service粒度的aop切面,在切面内部可以拿到当前方法的元数据信息,然后把 是否需要调用b这部分的逻辑封装成一个方法(比如读取数据库配置的方法名匹配等..) 这样子 当你动态的修改了配置后 程序逻辑就能够按你的配置去决定要不要调用B.invokeMethod()了。 当然这种方案需要考虑到 B.invokeMethod() 是否需要细粒度到参数?
或者可以在抽象一层可以用groovy这种动态编译执行的语言嵌入一层。动态修改这部分 重新加载即可。不用重新发布项目。