应用启动间断性偶发dubbo:service interface not allow null! 问题解决

应用启动间断性偶发dubbo:service interface not allow null! 问题解决

  • 首先贴一下报错信息
  • 问题关键环境
  • 问题分析
  • 问题解决

  1. 首先贴一下报错信息

Caused by: java.lang.IllegalStateException:  interface not allow null!
	at org.apache.dubbo.config.ServiceConfig.checkAndUpdateSubConfigs(ServiceConfig.java:308)
	at org.apache.dubbo.config.ServiceConfig.export(ServiceConfig.java:369)
	at org.apache.dubbo.config.spring.ServiceBean.export(ServiceBean.java:336)
	at org.apache.dubbo.config.spring.ServiceBean.onApplicationEvent(ServiceBean.java:114)
	at org.apache.dubbo.config.spring.ServiceBean.onApplicationEvent(ServiceBean.java:60)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:403)
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:409)
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:360)
	at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:897)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:553)
	at org.springframework.cloud.context.named.NamedContextFactory.createContext(NamedContextFactory.java:136)
	at org.springframework.cloud.context.named.NamedContextFactory.getContext(NamedContextFactory.java:101)
	at org.springframework.cloud.context.named.NamedContextFactory.getInstance(NamedContextFactory.java:145)
	at org.springframework.cloud.openfeign.FeignClientFactoryBean.get(FeignClientFactoryBean.java:224)
	at org.springframework.cloud.openfeign.FeignClientFactoryBean.feign(FeignClientFactoryBean.java:85)
	at org.springframework.cloud.openfeign.FeignClientFactoryBean.getTarget(FeignClientFactoryBean.java:261)
	at org.springframework.cloud.openfeign.FeignClientFactoryBean.getObject(FeignClientFactoryBean.java:251)
	at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:171)
	... 110 common frames omitted



  1. 问题关键环境

dubbo用了2.7.3的版本,feign starter用了0.2.4的版本

        
            org.apache.dubbo
            dubbo
              2.7.3
        
        
        
            org.springframework.cloud
            spring-cloud-starter-openfeign
            0.2.4
        

  1. 问题分析

根据错误日志可以看出FeignClientFactoryBean 工厂bean获取对象的时候发布了ContextRefreshedEvent事件; 而dubbo 的serviceBean 实现了ApplicationListener监听器,所以dubbo serviceBean也可以监听到ApplicationEvent事件就会触发 dubbo 服务的暴露, 而这个时候,bean可能还没有初始化,就会报第一条所列的错误信息。
由于spring bean 初始化过程bean的顺序并不一定一样,所以就会出现当dubbo service bean 先初始化时就不会报错,当feign FeignClientFactoryBean 先于duobbo service bean 初始化时就会报第一条所列的错误。导致应用能不能启动成功全看运气的尴尬局面
怎么解决呢?
思路一: 把 dubbo service bean 扫描初始化的优先级提高,但是这个业务bean 保证顺序应该也是难保证的
思路二: 升级dubbo 版本, dubbo service bean 监听ApplicationEvent 实现服务暴露, 而ApplicationEvent 事件在spring启动过程中,发先可能很多框架都在发布ApplicationEvent事件,容易造成监听到错误信息(噪音太多)导致误判

  1. 问题解决

按照思路二升级dubbo版本,升级dubbo版本到2.7.9版本就可以解决了该问题。
2.7.9的版本dubbo service bean 不再实现ApplicationListener,所以自然就没有这个问题了

附: 其实升级dubbo版本的过程中也试了好几个版本,虽然可以解决和feign组件的兼容性问题,但出现了和其他框架(如nacos)兼容性问题,只有2.7.9这个版本没有问题。 所以大家如果也遇到了这个问题,要耐心解决一下

你可能感兴趣的:(dubbo)