Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

dubbo在apollo中的配置项无法生效的问题 #1600

Closed
SymonLin opened this issue Oct 23, 2018 · 14 comments
Closed

dubbo在apollo中的配置项无法生效的问题 #1600

SymonLin opened this issue Oct 23, 2018 · 14 comments

Comments

@SymonLin
Copy link

近期在项目中集成apollo发现其中一些dubbo配置项都没生效,而其他诸如jdbc等都是正常的,不过动态获取是能拿到dubbo配置项的,但是由于启动时dubbo加载先于apollo拉取去配置中心配置,日志如下:
[10-22 20:39:34,930] INFO [main] LoggerFactory[?] - using logger: com.alibaba.dubbo.common.logger.slf4j.Slf4jLoggerAdapter
[10-22 20:39:34,936] INFO [main] WelcomeLogoApplicationListener[53] -

:: Dubbo Spring Boot (v0.2.0) : https://github.com/apache/incubator-dubbo-spring-boot-project
:: Dubbo (v2.6.2) : https://github.com/apache/incubator-dubbo
:: Google group : dev@dubbo.incubator.apache.org

[10-22 20:39:34,939] INFO [main] OverrideDubboConfigApplicationListener[68] - Dubbo Config was overridden by externalized configuration {}

:: Spring Boot :: (v2.0.4.RELEASE)

[10-22 20:39:35,152] INFO [main] DefaultApplicationProvider[85] - App ID is set to 20001 by app.id property from System Property
[10-22 20:39:35,155] INFO [main] DefaultServerProvider[108] - Environment is set to [DEV] by JVM system property 'env’.
[10-23 09:58:37,224] WARN [main] AnnotationConfigServletWebServerApplicationContext[558] - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'demoController': Unsatisfied dependency expressed through field 'demoService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'demoServiceImpl': Unsatisfied dependency expressed through field 'betaDemoService'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'betaDemoService': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalStateException: ApplicationConfig.application == null

apollo配置项如下:
app.id = 20001
apollo.meta = http://xxx.xx.xx.xxx:xxxx
apollo.cacheDir = ./config
apollo.bootstrap.enabled = true
apollo.bootstrap.namespaces = application
我也看了下github上类似的问题 感觉该配的都配了 不知道问题到底在哪?麻烦帮忙看看怎么解决 万分感谢

dubbo及apollo jar包版本如下:

com.alibaba.boot
dubbo-spring-boot-starter
0.2.0


com.ctrip.framework.apollo
apollo-client
1.1.0

Spring Boot为v2.0.4.RELEASE

@nobodyiam
Copy link
Member

感觉上配置没啥问题,看一下我们之前写的demo,看看能不能跑起来:https://github.com/ctripcorp/apollo-use-cases/tree/master/spring-boot-dubbo

@SymonLin
Copy link
Author

SymonLin commented Oct 24, 2018

@nobodyiam 你们的demo我试过是正常跑起来的 就是不知道我的为啥有问题
我把我的项目上传到github了 有空可以帮忙看一下吗?https://github.com/SymonLin/alpha

@nobodyiam
Copy link
Member

你的报错是dubbo的application没有配啊,和apollo没啥关系吧

java.lang.IllegalStateException: ApplicationConfig.application == null

建议你先不用apollo跑起来,然后再接入apollo

@SymonLin
Copy link
Author

@nobodyiam dubbo相关配置配在application.properties里时是可以正常运行的 现在dubbo的相关配置都迁移到apollo配置中心了 就报上面的错误了 该试的情况我都尝试过了 都没发现原因 难道是因为项目里dubbo是以xml形式配置的 apollo不兼容这种配置方式吗?

@nobodyiam
Copy link
Member

你没有配置dubbo:application,参考一下 https://github.com/ctripcorp/apollo-use-cases/tree/master/dubbo

@SymonLin
Copy link
Author

@nobodyiam 我参考了https://github.com/ctripcorp/apollo-use-cases/tree/master/dubbo,原本以为是少了apollo:config/这个标签导致报错,但是调试了一下发现并不是,因为我这项目时即是服务提供者又是服务消费者,所以即有provide.xml又有consumer.xml,现在发现任何一个xml单独启用时项目是正常启动的(它会去apollo配置中心加载相应配置并成功注册到zookeeper注册中心),但两个xml同时启用时项目就报ApplicationConfig.application == null了,您发的demo案例也是单个provider或者单个consumer的情况,所以希望您这边排查一下,apollo是不是不支持即是provider又是consumer的情况?

@nobodyiam
Copy link
Member

nobodyiam commented Oct 28, 2018

@SymonLin

我更新了demo,增加了客户端同时启动服务的情况,启动后可以通过telnet方式测试。

如我前面所说,你这个问题在于没有在任何地方配置dubbo:application这个dubbo的必填项,我不知道是不是你用了dubbo的spring starter的缘故,在我这个项目里面,如果没有配置dubbo:application,哪怕是单独启动一个provider也是起不来的,你可以试一下把配置文件中的dubbo:application注释掉看看效果。

另外,apollo和dubbo在目前的版本中是没有任何耦合的(后续dubbo 2.7.0版本可能会做整合),apollo把配置交给spring,dubbo从spring中获取配置,所以不存在apollo不支持即是provider又是consumer的情况。

@nobodyiam
Copy link
Member

针对spring boot dubbo的demo我也更新了一下,也是OK的。

我感觉可能和你目前的配置方式也有关系,你share的项目在我本地由于缺少依赖无法编译,不过从代码中可以看到主体上是用的传统的spring和dubbo结合的方式,但是项目中又用到了dubbo-spring-boot-project,所以你是把dubbo.application.name放在apollo配置,然后把别的都放在xml中配置?

建议要么全部通过xml配置(参照apollo-use-cases/dubbo/),要么全部通过spring boot方式配置(参照apollo-use-cases/spring-boot-dubbo/),两种方式在我这里跑都是可以的。

@SymonLin
Copy link
Author

@nobodyiam 我把所有dubbo的配置项都放apollo的 xml只放了provider跟consumer的service声明 也就是dubbo:service跟dubbo:reference 本来这么做是为了清楚的知道提供了哪些接口及依赖了哪些外部接口

@SymonLin
Copy link
Author

另外我也尝试了纯spring boot方式配置(依赖dubbo-spring-boot-starter)以及原生dubbo的方式(依赖dubbo、zookeeper、zkclient、curator-framework,通过xml方式配置,配置项用${}占位符)通过apollo都可以正常取到配置且项目正常运行 所以现在是dubbo-spring-boot-starter+dubbo xml无法正常使用

@nobodyiam
Copy link
Member

所以现状是:

  • spring boot + apollo方式是OK的
  • xml + apollo方式也是OK的
  • spring boot + xml + apollo不OK

这个看上去可能是dubbo-spring-boot-starter的问题了,后续我们尝试重现并定位一下问题吧,如果你这边有时间的话,也可以看一下,按照报错的堆栈信息应该可以比较方便地定位到问题。

@SymonLin
Copy link
Author

好的 感谢您的解答 ^_^

@nobodyiam
Copy link
Member

@SymonLin

看了一下spring boot + xml + apollo不OK的case,原因是这种情况下所依赖的OverrideDubboConfigApplicationListener执行时机太早了(远早于apollo配置加载的时机),所以会有问题。

不过测试了一下,#1614 合并后就可以解决这个问题。

@nobodyiam
Copy link
Member

1.2.0版本已经发布,支持把Apollo配置加载提到初始化日志系统之前,可以解决此issue中提到的问题。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants