接入nacos 之后,想把所有的配置丢上去。
启动程序是:
@EnableDiscoveryClient @RestController @ComponentScan(basePackages = {"com.lkk"}) @MapperScan(basePackages = {"com.lkk.ppm.doc.service.dao"}) @ImportResource(locations = {"classpath:dubbo.xml"}) @EnableTransactionManagement @Import({Settings.class, WebConfig.class}) @SpringBootApplication(exclude = {SecurityAutoConfiguration.class}) @EnableWebMvc @Slf4j public class DocApplication {
bootstrap.yml文件是:
spring: application: name: llk_discuss_app profiles: active: ${PROFILE_ACTIVE:local} cloud: nacos: discovery: server-addr: ${NACOS_SERVER_ADDR:192.168.11.196:8848} namespace: ${NACOS_CONFIG_NAMESPACE:1f3c60b6-3e28-44eb-9798-7f7eeeff6a8d} #group: ${NACOS_CONFIG_GROUP:llk} config: server-addr: ${NACOS_SERVER_ADDR:192.168.11.196:8848} file-extension: yaml namespace: ${NACOS_CONFIG_NAMESPACE:1f3c60b6-3e28-44eb-9798-7f7eeeff6a8d} group: ${NACOS_CONFIG_GROUP:llk} ext-config[0]: data-id: llk_stateflow_toggle.yaml group: ${NACOS_CONFIG_GROUP:llk} refresh: true
dubbo.xml 文件是:
<dubbo:registry address="${NACOS_ADDR:nacos://127.0.0.1:8848}" file="erdp_discuss_app.cache"/> <dubbo:service interface="com.llk.ppm.discuss.domain.service.ELDiscussService" ref="discussService"/> <dubbo:reference id="peopleService" interface="com.llk.platform.system.domain.service.ELPeopleService"/>
...
错误是
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'peopleService': FactoryBean threw exception on object creation; nested exception is java.lang.NumberFormatException: For input string: "8848}" at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:178) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:101) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1644) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getObjectForBeanInstance(AbstractAutowireCapableBeanFactory.java:1174) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:257) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:251) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.addCandidateEntry(DefaultListableBeanFactory.java:1322) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1288) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1098) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1062) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:581) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE] ... 30 common frames omitted Caused by: java.lang.NumberFormatException: For input string: "8848}" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[na:1.8.0_201] at java.lang.Integer.parseInt(Integer.java:580) ~[na:1.8.0_201] at java.lang.Integer.parseInt(Integer.java:615) ~[na:1.8.0_201] at com.alibaba.dubbo.common.URL.valueOf(URL.java:239) ~[dubbo-2.6.5.jar:2.6.5] at com.alibaba.dubbo.common.utils.UrlUtils.parseURL(UrlUtils.java:68) ~[dubbo-2.6.5.jar:2.6.5] at com.alibaba.dubbo.common.utils.UrlUtils.parseURLs(UrlUtils.java:137) ~[dubbo-2.6.5.jar:2.6.5] at com.alibaba.dubbo.config.AbstractInterfaceConfig.loadRegistries(AbstractInterfaceConfig.java:191) ~[dubbo-2.6.5.jar:2.6.5] at com.alibaba.dubbo.config.ReferenceConfig.createProxy(ReferenceConfig.java:378) ~[dubbo-2.6.5.jar:2.6.5] at com.alibaba.dubbo.config.ReferenceConfig.init(ReferenceConfig.java:333) ~[dubbo-2.6.5.jar:2.6.5] at com.alibaba.dubbo.config.ReferenceConfig.get(ReferenceConfig.java:163) ~[dubbo-2.6.5.jar:2.6.5] at com.alibaba.dubbo.config.spring.ReferenceBean.getObject(ReferenceBean.java:67) ~[dubbo-2.6.5.jar:2.6.5] at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:171) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE] ... 41 common frames omitted
花了整整一天时间,各种折腾,dubbo.xml 里面的占位符就是解析不了。
开始是以为是nacos的bug,后面以为是dubbo 的问题,最后才发现是spring-cloud-commons 的问题。我晕~~~~
开始是以为是bootstrap的问题,初始化dubbo.xml的时间太早了吗? 坑爹啊! 研究了下boostrap 和 application 配置文件的关系。无果。 后面认为是yml的格式的问题,后面把bootstrap.yml, 转换成了boostrap.properties, 结果问题依旧。想来想去,应该是xml解析的时候,bootstrap 还没有从nacos 成功获取数据的原因吧! 写了个demo试了下,好像可以了, 再套到了原来的项目里面来, 熄火了!。 可是,这到底是什么情况,bootstrap配置文件的优先级是比较高的啊! 网上一把搜索,未果,好像大家都没有遇到我这个问题。。。 后面干脆不用bootstrap配置文件,使用 application.yml/properties吧,可以了,但是nacos怎么办,不能不使用bootstrap啊!!
是ImportSource问题吗,它的解析有特殊之处, 研究其原理,无果?后面同事偶然发现,只要把dubbo.xml 分开为两个文件(一个文件有是基本信息,另外一个文件是 service/reference)就可以正常启动了, 然后继续研究,发现把 dubbo:reference 的id 属性去掉,就可以了。。 把原来的一个dubbo xml 分开了两个xml,两次ImportSource,另外还糅合导入了一个properties 就可以了,是顺序问题吗? 难道是第一次不能解析,第二次才能解析吗?。。。必须要分开吗?折腾N久,无果。从GitHub拉下来几个demo(大名鼎鼎的didi哥的学习项目),运行一把,没问题的啊!!对比一下,然后一点点的加减代码和配置吧! 发现didi哥的项目简单,所以无错,我把代码套过去,它的项目也会一样的报错了。
调试一下吧! 断点设置在RegistryConfig的setAddress方法之上。看到其堆栈, 正常的是:
setAddress:118, RegistryConfig (com.alibaba.dubbo.config)
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)
invoke:62, NativeMethodAccessorImpl (sun.reflect)
invoke:43, DelegatingMethodAccessorImpl (sun.reflect)
invoke:498, Method (java.lang.reflect)
setValue:332, BeanWrapperImpl$BeanPropertyHandler (org.springframework.beans)
processLocalProperty:458, AbstractNestablePropertyAccessor (org.springframework.beans)
setPropertyValue:278, AbstractNestablePropertyAccessor (org.springframework.beans)
setPropertyValue:266, AbstractNestablePropertyAccessor (org.springframework.beans)
setPropertyValues:97, AbstractPropertyAccessor (org.springframework.beans)
setPropertyValues:77, AbstractPropertyAccessor (org.springframework.beans)
applyPropertyValues:1635, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
populateBean:1354, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:572, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:495, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:317, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 1089930529 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$136)
getSingleton:222, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:315, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:199, AbstractBeanFactory (org.springframework.beans.factory.support)
preInstantiateSingletons:759, DefaultListableBeanFactory (org.springframework.beans.factory.support)
finishBeanFactoryInitialization:869, AbstractApplicationContext (org.springframework.context.support)
refresh:550, AbstractApplicationContext (org.springframework.context.support)
refresh:140, ServletWebServerApplicationContext (org.springframework.boot.web.servlet.context)
refresh:780, SpringApplication (org.springframework.boot)
refreshContext:412, SpringApplication (org.springframework.boot)
run:333, SpringApplication (org.springframework.boot)
run:1277, SpringApplication (org.springframework.boot)
run:1265, SpringApplication (org.springframework.boot)
main:24, TestApplication (com.didispace.alibaba.nacos.config.client)
异常情况的堆栈是:
setAddress:118, RegistryConfig (com.alibaba.dubbo.config)
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)
invoke:62, NativeMethodAccessorImpl (sun.reflect)
invoke:43, DelegatingMethodAccessorImpl (sun.reflect)
invoke:498, Method (java.lang.reflect)
setValue:332, BeanWrapperImpl$BeanPropertyHandler (org.springframework.beans)
processLocalProperty:458, AbstractNestablePropertyAccessor (org.springframework.beans)
setPropertyValue:278, AbstractNestablePropertyAccessor (org.springframework.beans)
setPropertyValue:266, AbstractNestablePropertyAccessor (org.springframework.beans)
setPropertyValues:97, AbstractPropertyAccessor (org.springframework.beans)
setPropertyValues:77, AbstractPropertyAccessor (org.springframework.beans)
applyPropertyValues:1630, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
populateBean:1349, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:572, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:495, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:317, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 1376017854 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$135)
getSingleton:222, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:315, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:199, AbstractBeanFactory (org.springframework.beans.factory.support)
getBeansOfType:514, DefaultListableBeanFactory (org.springframework.beans.factory.support)
getBeansOfType:1204, AbstractApplicationContext (org.springframework.context.support)
beansOfTypeIncludingAncestors:327, BeanFactoryUtils (org.springframework.beans.factory)
afterPropertiesSet:140, ReferenceBean (com.alibaba.dubbo.config.spring)
invokeInitMethods:1753, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
initializeBean:1690, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:573, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:495, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:317, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 1376017854 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$135)
getSingleton:222, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:315, AbstractBeanFactory (org.springframework.beans.factory.support)
getTypeForFactoryBean:1513, AbstractBeanFactory (org.springframework.beans.factory.support)
getTypeForFactoryBean:838, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
isTypeMatch:562, AbstractBeanFactory (org.springframework.beans.factory.support)
doGetBeanNamesForType:426, DefaultListableBeanFactory (org.springframework.beans.factory.support)
getBeanNamesForType:389, DefaultListableBeanFactory (org.springframework.beans.factory.support)
getBeanNamesForType:383, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveNamedBean:996, DefaultListableBeanFactory (org.springframework.beans.factory.support)
getBean:338, DefaultListableBeanFactory (org.springframework.beans.factory.support)
getBean:333, DefaultListableBeanFactory (org.springframework.beans.factory.support)
isApplicable:163, RefreshAutoConfiguration$RefreshScopeBeanDefinitionEnhancer (org.springframework.cloud.autoconfigure)
postProcessBeanDefinitionRegistry:134, RefreshAutoConfiguration$RefreshScopeBeanDefinitionEnhancer (org.springframework.cloud.autoconfigure)
invokeBeanDefinitionRegistryPostProcessors:271, PostProcessorRegistrationDelegate (org.springframework.context.support)
invokeBeanFactoryPostProcessors:121, PostProcessorRegistrationDelegate (org.springframework.context.support)
invokeBeanFactoryPostProcessors:692, AbstractApplicationContext (org.springframework.context.support)
refresh:530, AbstractApplicationContext (org.springframework.context.support)
refresh:140, ServletWebServerApplicationContext (org.springframework.boot.web.servlet.context)
refresh:754, SpringApplication (org.springframework.boot)
refreshContext:386, SpringApplication (org.springframework.boot)
run:307, SpringApplication (org.springframework.boot)
main:48, TestNacosApplication (com.example.test_nacos)
一帧一帧的查看分析:
0 = "org.springframework.context.annotation.internalConfigurationAnnotationProcessor"
1 = "org.springframework.cloud.autoconfigure.RefreshAutoConfiguration$RefreshScopeBeanDefinitionEnhancer"
2 = "refreshScope"
难道是internalConfigurationAnnotationProcessor的问题? 不像。发现RefreshAutoConfiguration 有些不对, 好像是RefreshAutoConfiguration 引起了这个问题?但是此时我依然不知道这就是RefreshAutoConfiguration的bug!(后面才知道) RefreshAutoConfiguration 为什么要这么做?不管了先, 那就把RefreshAutoConfiguration 停掉啊! 观察到配置项:spring.cloud.refresh.enabled,这个好像没什么用。那把它设置为false,然后重启,然后就可以了! 我擦,终于解决了问题!!不过,似乎高兴得太早了,引起的问题是, nacos的配置完全读取不到了!! 这怎么行呢!
同事的配置拿来研究,调试发现它的堆栈更深了:
setAddress:118, RegistryConfig (com.alibaba.dubbo.config) invoke0:-1, NativeMethodAccessorImpl (sun.reflect) invoke:62, NativeMethodAccessorImpl (sun.reflect) invoke:43, DelegatingMethodAccessorImpl (sun.reflect) invoke:498, Method (java.lang.reflect) setValue:332, BeanWrapperImpl$BeanPropertyHandler (org.springframework.beans) processLocalProperty:458, AbstractNestablePropertyAccessor (org.springframework.beans) setPropertyValue:278, AbstractNestablePropertyAccessor (org.springframework.beans) setPropertyValue:266, AbstractNestablePropertyAccessor (org.springframework.beans) setPropertyValues:97, AbstractPropertyAccessor (org.springframework.beans) setPropertyValues:77, AbstractPropertyAccessor (org.springframework.beans) applyPropertyValues:1630, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) populateBean:1349, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) doCreateBean:572, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) createBean:495, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) lambda$doGetBean$0:317, AbstractBeanFactory (org.springframework.beans.factory.support) getObject:-1, 26928827 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$135) getSingleton:222, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support) doGetBean:315, AbstractBeanFactory (org.springframework.beans.factory.support) getBean:199, AbstractBeanFactory (org.springframework.beans.factory.support) getBeansOfType:514, DefaultListableBeanFactory (org.springframework.beans.factory.support) getBeansOfType:1204, AbstractApplicationContext (org.springframework.context.support) beansOfTypeIncludingAncestors:327, BeanFactoryUtils (org.springframework.beans.factory) afterPropertiesSet:140, ReferenceBean (com.alibaba.dubbo.config.spring) invokeInitMethods:1753, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) initializeBean:1690, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) doCreateBean:573, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) createBean:495, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) lambda$doGetBean$0:317, AbstractBeanFactory (org.springframework.beans.factory.support) getObject:-1, 26928827 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$135) getSingleton:222, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support) doGetBean:315, AbstractBeanFactory (org.springframework.beans.factory.support) getTypeForFactoryBean:1513, AbstractBeanFactory (org.springframework.beans.factory.support) getTypeForFactoryBean:838, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) isTypeMatch:562, AbstractBeanFactory (org.springframework.beans.factory.support) doGetBeanNamesForType:426, DefaultListableBeanFactory (org.springframework.beans.factory.support) getBeanNamesForType:389, DefaultListableBeanFactory (org.springframework.beans.factory.support) beanNamesForTypeIncludingAncestors:214, BeanFactoryUtils (org.springframework.beans.factory) findAutowireCandidates:1273, DefaultListableBeanFactory (org.springframework.beans.factory.support) doResolveDependency:1098, DefaultListableBeanFactory (org.springframework.beans.factory.support) resolveDependency:1062, DefaultListableBeanFactory (org.springframework.beans.factory.support) resolveAutowiredArgument:819, ConstructorResolver (org.springframework.beans.factory.support) createArgumentArray:725, ConstructorResolver (org.springframework.beans.factory.support) instantiateUsingFactoryMethod:475, ConstructorResolver (org.springframework.beans.factory.support) instantiateUsingFactoryMethod:1246, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) createBeanInstance:1096, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) doCreateBean:535, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) createBean:495, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) lambda$doGetBean$0:317, AbstractBeanFactory (org.springframework.beans.factory.support) getObject:-1, 26928827 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$135) getSingleton:222, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support) doGetBean:315, AbstractBeanFactory (org.springframework.beans.factory.support) getBean:204, AbstractBeanFactory (org.springframework.beans.factory.support) registerBeanPostProcessors:224, PostProcessorRegistrationDelegate (org.springframework.context.support) registerBeanPostProcessors:708, AbstractApplicationContext (org.springframework.context.support) refresh:533, AbstractApplicationContext (org.springframework.context.support) refresh:140, ServletWebServerApplicationContext (org.springframework.boot.web.servlet.context) refresh:754, SpringApplication (org.springframework.boot) refreshContext:386, SpringApplication (org.springframework.boot) run:307, SpringApplication (org.springframework.boot) main:64, DiscussApplication (com.llk.ppm.discuss)