SpringCloud Alibaba 引入Dubbo踩坑

前言

在搭建springcloud alibaba的时候,引入Dubbo相关依赖,项目启动报错。

版本信息

依赖版本
Spring Boot2.4.2
Spring Cloud2020.0.0
Spring Cloud Alibaba2021.1

引入依赖

<!-- Dubbo Spring Cloud Starter -->
<dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>

错误信息

2021-07-07 14:00:46.399  INFO 8896 --- [           main] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2021-07-07 14:00:46.402  WARN 8896 --- [           main] o.s.b.c.e.EventPublishingRunListener     : Error calling ApplicationEventListener

java.lang.IllegalStateException: org.springframework.context.annotation.AnnotationConfigApplicationContext@f0da945 has not been refreshed yet
	at org.springframework.context.support.AbstractApplicationContext.assertBeanFactoryActive(AbstractApplicationContext.java:1146) ~[spring-context-5.3.3.jar:5.3.3]
	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1158) ~[spring-context-5.3.3.jar:5.3.3]
	at org.springframework.context.event.ApplicationListenerMethodAdapter.getTargetBean(ApplicationListenerMethodAdapter.java:339) ~[spring-context-5.3.3.jar:5.3.3]
	at org.springframework.context.event.ApplicationListenerMethodAdapter.doInvoke(ApplicationListenerMethodAdapter.java:304) ~[spring-context-5.3.3.jar:5.3.3]
	at org.springframework.context.event.ApplicationListenerMethodAdapter.processEvent(ApplicationListenerMethodAdapter.java:197) ~[spring-context-5.3.3.jar:5.3.3]
	at org.springframework.context.event.ApplicationListenerMethodAdapter.onApplicationEvent(ApplicationListenerMethodAdapter.java:160) ~[spring-context-5.3.3.jar:5.3.3]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176) [spring-context-5.3.3.jar:5.3.3]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:162) [spring-context-5.3.3.jar:5.3.3]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143) [spring-context-5.3.3.jar:5.3.3]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:131) [spring-context-5.3.3.jar:5.3.3]
	at org.springframework.boot.context.event.EventPublishingRunListener.failed(EventPublishingRunListener.java:133) [spring-boot-2.4.2.jar:2.4.2]
	at org.springframework.boot.SpringApplicationRunListeners.callFailedListener(SpringApplicationRunListeners.java:93) [spring-boot-2.4.2.jar:2.4.2]
	at org.springframework.boot.SpringApplicationRunListeners.lambda$failed$7(SpringApplicationRunListeners.java:84) [spring-boot-2.4.2.jar:2.4.2]
	at java.util.ArrayList.forEach(ArrayList.java:1249) ~[na:1.8.0_65]
	at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:117) [spring-boot-2.4.2.jar:2.4.2]
	at org.springframework.boot.SpringApplicationRunListeners.failed(SpringApplicationRunListeners.java:83) [spring-boot-2.4.2.jar:2.4.2]
	at org.springframework.boot.SpringApplication.handleRunFailure(SpringApplication.java:817) ~[spring-boot-2.4.2.jar:2.4.2]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:336) ~[spring-boot-2.4.2.jar:2.4.2]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1311) ~[spring-boot-2.4.2.jar:2.4.2]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300) ~[spring-boot-2.4.2.jar:2.4.2]
	at com.ify.order.OrderApplication.main(OrderApplication.java:13) ~[classes/:na]

2021-07-07 14:00:46.416 ERROR 8896 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.BeanInstantiationException: Failed to instantiate [feign.jaxrs2.JAXRS2Contract]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: javax/ws/rs/Path
	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:225) ~[spring-beans-5.3.3.jar:5.3.3]
	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147) ~[spring-beans-5.3.3.jar:5.3.3]
	at com.alibaba.cloud.dubbo.metadata.resolver.DubboServiceBeanMetadataResolver.createContract(DubboServiceBeanMetadataResolver.java:95) ~[spring-cloud-starter-dubbo-2021.1.jar:2021.1]
	at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) ~[na:1.8.0_65]
	at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) ~[na:1.8.0_65]
	at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175) ~[na:1.8.0_65]
	at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948) ~[na:1.8.0_65]
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) ~[na:1.8.0_65]
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) ~[na:1.8.0_65]
	at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151) ~[na:1.8.0_65]
	at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) ~[na:1.8.0_65]
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:1.8.0_65]
	at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418) ~[na:1.8.0_65]
	at com.alibaba.cloud.dubbo.metadata.resolver.DubboServiceBeanMetadataResolver.afterSingletonsInstantiated(DubboServiceBeanMetadataResolver.java:89) ~[spring-cloud-starter-dubbo-2021.1.jar:2021.1]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:963) ~[spring-beans-5.3.3.jar:5.3.3]
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:923) ~[spring-context-5.3.3.jar:5.3.3]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:588) ~[spring-context-5.3.3.jar:5.3.3]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) [spring-boot-2.4.2.jar:2.4.2]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) [spring-boot-2.4.2.jar:2.4.2]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) [spring-boot-2.4.2.jar:2.4.2]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) [spring-boot-2.4.2.jar:2.4.2]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1311) [spring-boot-2.4.2.jar:2.4.2]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300) [spring-boot-2.4.2.jar:2.4.2]
	at com.ify.order.OrderApplication.main(OrderApplication.java:13) [classes/:na]
Caused by: java.lang.NoClassDefFoundError: javax/ws/rs/Path
	at feign.jaxrs.JAXRSContract.<init>(JAXRSContract.java:45) ~[feign-jaxrs-10.10.1.jar:na]
	at feign.jaxrs2.JAXRS2Contract.<init>(JAXRS2Contract.java:27) ~[feign-jaxrs2-9.7.0.jar:na]
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_65]
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_65]
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_65]
	at java.lang.reflect.Constructor.newInstance(Constructor.java:422) ~[na:1.8.0_65]
	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:212) ~[spring-beans-5.3.3.jar:5.3.3]
	... 23 common frames omitted
Caused by: java.lang.ClassNotFoundException: javax.ws.rs.Path
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_65]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_65]
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) ~[na:1.8.0_65]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_65]
	... 30 common frames omitted

解决

查找发现javax/ws/rs/Path 是属于jsr311-api.jar 包下的。引入相关jar包

<dependency>
	   <groupId>javax.ws.rs</groupId>
	   <artifactId>jsr311-api</artifactId>
	   <version>1.1.1</version>
</dependency>

可以正常启动,问题解决。

### Spring Cloud AlibabaDubbo 的主要差异 #### 微服务体系定位 Spring Cloud Alibaba 是一套基于 Spring Cloud 实现的微服务解决方案,旨在简化分布式系统的开发过程[^2]。而 Dubbo 则是一个高性能的 Java RPC 框架,在阿里巴巴内部得到广泛应用并开源出来,专注于服务治理方面。 #### 协议支持 Spring Cloud Alibaba 支持多种协议来实现远程过程调用 (RPC),包括 HTTP/REST、gRPC 等标准互联网通信方式;相比之下,Dubbo 主要采用自定义二进制协议进行高效的服务间交互,并且默认情况下不直接兼容HTTP接口[^1]。 #### 配置管理 对于配置中心的支持上,两者都推荐使用 Nacos 或 Apollo 进行统一管理和动态刷新配置项。不过在具体实践过程中,由于 Spring Cloud Alibaba 更紧密地集成了 Spring Boot/Spring Cloud 生态圈内的工具链,因此其配置更加灵活便捷[^4]。 #### 服务发现机制 当涉及到服务注册与发现时,二者都可以借助于像 Eureka、Consul 或者 Nacos 来完成这一任务。然而值得注意的是,Dubbo 对 Zookeeper 存有较强依赖性作为早期版本中的唯一选型之一,尽管现在也已经扩展到了其他选项之上[^3]。 #### 编程模型 编程体验上的不同之处在于,开发者利用 Spring Cloud Alibaba 构建应用程序通常会遵循 Spring MVC 注解风格编写控制器层逻辑,而对于 Dubbo 用户来说,则更多地围绕着 `@Service` 及 `@Reference` 注解来进行声明式方法注入和服务消费操作。 ```java // 使用 @Reference 注解的方式获取远端服务实例 @RestController @RequestMapping("/consumer") @Slf4j public class ConsumerController { @Reference(check = false, version = "1.0.0") private IdGenerateApi idGenerateApi; @GetMapping("/getId") public Object test() { return idGenerateApi.getId(""); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值