在大数据中,Flink任务一般都不是基于Spring框架和Dubbo框架的,但很多业务系统采用Dubbo架构,当需要调用业务系统的接口获取数据时,就出现Flink调用Dubbo的情况了。
由于Flink架构的特殊性,按照普通的Java项目引入Dubbo架构是不行的,在本地调测可能没有问题,但一定部署到生产环境,一般都会报错。
这是因为Flink架构是分布式的,正常情况下,包含一个Client端,一个jobManager和多个TaskManager,每个TaskManager还包含多个Task。引入Dubbo框架,实际启动在Client端,而执行在jobManager或者TaskManager,这两个不在同一个jvm上,这种方案不合理。
所以一般是通过配置文档获取一个Spring Context,但由于Flink是分布式,就可能会在一个JVM上启动多个Spring Context,这是会报错的。解决方案是采用单例模型来封装Spring Context,确保每个JVM只有一个Spring Context,可以在算子函数的open方法通过单例来获取相应的bean。
另外还有一个问题,在Flink中调用dubbo,往往在本地跑main方法是没有问题了,一旦打包发布到flink集群,就会出现找不到spring,或者dubbo配置文件异常之类的错误。这是没有添加maven的Transformer配置,没有把spring相关配置、依赖打包到jar中。