通过 spring boot 部署了一个数据组的server,运行在生产系统。这个数据组的server的主要承接了flink中传递过来的事件消息,该事件消息实际上是要由不同的业务消费方来消费。最终的设计方案是,数据组的server的这个服务暴露spi的接口,由不同的业务消费方实现该spi提供相应的jar包,server中注入不同业务消费方实现的spi的bean,从而达到不同业务消费方只消费自己感兴趣的事件消息。
在数据组的这个server中,定义这样的一个interface,也就是对外提供的spi
/** 事件消息消费器,实现此接口用来消费flink中的事件消息 */
public interface FlinkEventsConsumer {
/**
* 消费flink中的事件消息
*/
void consume(List<FlinkEvent> flinkEventList);
}
再在数据组的这个server中,定义FlinkEventsHandler的component,server启动后会向spring注入这个FlinkEventsHandler的bean
@Component
@AllArgsConstructor
public class FlinkEventsHandler {
//构造器注入bean,会将spring容器上下文中的所有接口的实现类扫描到
private final List<FlinkEventsConsumer> flinkEventsConsumers;
public void handlerEvents(List<FlinkEvent> flinkEvents) {
for (var flinkEventsConsumer : flinkEventsConsumers) {
flinkEventsConsumer.consume(flinkEvents);
}
}
}
上面代码中,我们通过构造器注入了实现了FlinkEventsConsumer这个interface的所有bean,一批flinkevent的事件消息送上来,分别交给不同的bean来处理,每个bean内部处理的逻辑,只处理这批数据中自己感兴趣的事件消息,比如订单组实现了consume这个spi,内部只关心交易相关的事件消息。
最重要的一点,因为数据组的server是要注入实现了spi的各个业务组消费的实现类的,所以componentscan一定要将业务方实现了spi的包路径扫描到
@Configuration
@ComponentScan({"com.xxx.xxxx.xxxxx", ""})
public class EventHandlerConfiguration {}
server端的代码就是以上这些,然后我们要将server端的这个FlinkEventsConsumer interface 打好包对外提供出去。
业务接入方,需要将FlinkEventsConsumer这个interface的jar包引入到自己的项目中,实现这个FlinkEventsConsumer中提供的spi接口consume,拿订单组实现consume这个spi为例
package com.alibaba.tmall.trade.handler
@Service
public class TradeFlinkEventsHandler implements FlinkEventsConsumer{
@Override
public void consume(List<FlinkEvent> flinkEventList) {
//todo 处理感兴趣的flinkEventList
}
}
交易组的同学实现完成后,需要将TradeFlinkEventsHandler打个jar包对外提供出去。
最终在数据组server端,引入这个交易组打的jar包,同时将com.alibaba.tmall.trade.handler 加入到@ComponentScan中
在数据组的server启动后,就能够将TradeFlinkEventsHandler这个bean注入到spring中,处理flink中的事件消息。
再举个例子,后续售后组也需要来消费flink中的事件消息,那么售后组的同学也要同样来实现consume这个spi
package com.alibaba.tmall.aftersale.handler
@Service
public class AftersaleFlinkEventsHandler implements FlinkEventsConsumer{
@Override
public void consume(List<FlinkEvent> flinkEventList) {
//todo 处理感兴趣的flinkEventList
}
}
实现完成后,售后组的同学需要将AftersaleFlinkEventsHandler打个jar包对外提供出去。
后续数据组的server端,引入这个售后组打的jar包,同时将com.alibaba.tmall.aftersale.handler 加入到 @ComponentScan中
在数据组的server 重新发布启动后,就能够将AftersaleFlinkEventsHandler这个bean同样也注入到spring中,处理flink中的感兴趣的事件消息。