springboot使⽤xml配置dubbo读取yml占位符
约定优于配置是springboot简化配置的思路,其中它提供的⾃动配置、基于注解配置为我们搭建项⽬框架带来了很⼤的便利。
使⽤springboot的项⽬跟仅使⽤spring的项⽬相⽐,少了很多xml配置⽂件,基于⾃动配置或者使⽤注解和配置类就可完成⼤多数配置。
springboot + dubbo搭建微服务⼯程:(springboot版本2.0.4.RELEASE,dubbo版本2.6.2)
dubbo在com.fig.annotation包下也提供了@Service和@Reference两个注解来配置服务提供和消费接⼝,
在com.fig包下提供了应⽤(ApplicationConfig)、协议(RegistryConfig)、注册RegistryConfig、提供者(ProviderConfig)、消费者(ConsumerConfig)等各种配置类。
但@Service和@Reference仅⽀持配置到类上,有时我们想细粒度对接⼝的某个⽅法进⾏配置,这个时候就需要⽤到dubbo的xml配置。
例如:
<dubbo:reference id="xxxService" interface="com.biz.XxxService"timeout="5000">
<dubbo:method name="" retries="0" async="true" return="false" />
</dubbo:reference>
给XxxService接⼝的yyy()⽅法配置为不重试、异步调⽤、⽆返回。
在项⽬springboot启动类⾥通常是:
@Slf4j
@SpringBootApplication
@ImportResource({"classpath:/l"})
public class XxxApplication {
public static void main(String[] args) {
SpringApplication.run(XxxApplication.class, args);
log.info("XxxApplication started!");
}
}
通过@ImportResource({"classpath:/l"})引⼊dubbo的配置⽂件。
注1:import的也可能是spring的l配置⽂件,⾥⾯再import引⼊dubbo的配置⽂件);
注2:这⾥通过xml配置dubbo服务,启动类没有配置@EnableDubbo(scanBasePackages = "")注解。
然后在l中进⾏dubbo服务的配置:
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xmlns:dubbo="code.alibabatech/schema/dubbo"
xsi:schemaLocation="/schema/beans
/schema/beans/spring-beans.xsd
code.alibabatech/schema/dubbo
code.alibabatech/schema/dubbo/dubbo.xsd">
<dubbo:application name="xxxService" />
<dubbo:registry address="${istryAddress}" />
<dubbo:protocol name="dubbo" port="20001" threadpool="fixed" threads="500" />
<dubbo:provider delay="-1" retries="0" />
<dubbo:consumer retries="0" check="false" timeout="3000" />
<dubbo:service id="orderService" interface="OrderService" />
<dubbo:reference id="proudctService" interface="ProductService" />
<dubbo:reference id="logService" interface="LogService" lazy="true" timeout="5000">
springcloud和springboot<dubbo:method name="logBiz" async="true" return="false" />
</dubbo:reference>
</beans>
注:项⽬中可能区分dubbo的application、provdier、consumer由多个⽂件配置,这⾥简化配置在1个⽂件中。
通常项⽬环境有开发、测试、⽣产环境,⼀些配置参数不同环境可能是不同的,⽐如dubbo注册中⼼的地址。
我们可以通过springboot的不同profile的yml进⾏配置。
如:
开发环境⽤l:
dubbo:
registryAddress: zookeeper://192.168.0.1:2181:
测试环境⽤l:
dubbo:
registryAddress: zookeeper://192.168.5.1:2181:
然后在l指定profile,启动项⽬应⽤该配置。
spring:
profiles:
active: dev
最近在搭建⼀个项⽬遇到问题是yml写了配置,在l中的占位符配置没有⽣效。
启动报如下警告,能启动成功dubbo接⼝正常:
|WARN|2020-09-17 14:25:21.887|restartedMain|o.s.b.f.s.DefaultListableBeanFactory:1530--Bean creation exception on non-lazy FactoryBean type check: org.springframework.beans.factory.BeanCreationException: Error creating bean with name |INFO|202
0-09-17 14:25:22.193|restartedMain|s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:326--Bean 'com.fig.ConsumerConfig' of type [com.fig.ConsumerConfig] is not eligible for g ReferenceConfig(null) Is Not DESTROYED
经过查询资料、⽤不同⼯程反复测试调试,发现跟项⽬的依赖有关。
⽐如:
依赖了springcloud,启动类使⽤@SpringCloudApplication⽽⾮@SpringBootApplication;
依赖了spring-boot-devtools。
在dubbo-xml⾥配置了<dubbo:reference>才会出现。
被这个WARN困扰,查资料本地调试了很久,在此记录⼀下。猜测可能跟spring bean和dubbo服务配置的加载顺序有关,待以后对dubbo进⾏深⼊研究。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论