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

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

  1. 首先贴一下报错信息

Caused by: java.lang.IllegalStateException: <dubbo:service interface="" /> 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的版本

       <dependency> 
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
              <version>2.7.3</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>0.2.4</version>
        </dependency>

  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这个版本没有问题。 所以大家如果也遇到了这个问题,要耐心解决一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值