由于 Hystrix,Spring Boot 2 启动失败?
Posted
技术标签:
【中文标题】由于 Hystrix,Spring Boot 2 启动失败?【英文标题】:Spring Boot 2 fails starting due to Hystrix? 【发布时间】:2018-10-25 01:48:54 【问题描述】:我开始调查将 Spring Boot 应用程序从 1.5.x 迁移到 2。 这个应用程序依赖于 hystrix,它还不兼容 Spring Boot 2。 当我的 pom 中有以下内容时:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.4.RELEASE</version>
</dependency>
启动应用程序时出现以下错误:
java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder.<init>([Ljava/lang/Object;)V
at org.springframework.cloud.bootstrap.BootstrapApplicationListener.bootstrapServiceContext(BootstrapApplicationListener.java:125)
有人有过同样的经历吗? 有解决办法了吗?
【问题讨论】:
从依赖中移除<version>
标签。
这并没有解决。
【参考方案1】:
对于 SpringBoot 2.0 版本 artifactID 已更改。旧依赖是
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>$spring-hystrix.version</version>
</dependency>
将此新更新的依赖项与最新版本一起使用
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.8.RELEASE</version>
</dependency>
对于最近发布的version
,您可以查看MVNrepository
【讨论】:
【参考方案2】:经过一段时间的研究和测试,这是我发现和注意到的
我认为在最新的 Spring Boot 版本 (2.5.x) 中,Hystrix 似乎已被弃用,或者我只是找不到将其添加为依赖项的方法。
所以我将 Spring boot 版本降级到 2.3.x,我设法在其中运行了应用程序
这就是我的工作 pom.xml 的样子:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>org.hldservices</groupId>
<artifactId>payment-app</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>SpringCloudPaymentCircuitBreakerApplication</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
<spring-cloud.version>Hoxton.SR11</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>$spring-cloud.version</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
请记住,我必须在我的项目中添加以下配置:
SpringCloudPaymentCircuitBreakerApplication(主类)
@EnableHystrix
@EnableHystrixDashboard
application.propreties
management.endpoints.web.exposure.include=*
hystrix.dashboard.proxyStreamAllowList=*
【讨论】:
【参考方案3】:我在 Spring Boot 2 中遇到了类似的问题,简而言之 2.2.0.RELEASE。我的 mvn 项目编译良好,但 Spring Boot 应用程序停止启动,没有显示任何实际提示。
有效的解决方案是使用工件 spring-cloud-starter-netflix-hystrix 而不是同一组的 spring-cloud-starter-hystrix。然后就可以使用与 Spring Boot 相同的版本来检索依赖了。
来自旧的 pom.xml :
<!-- hysterix -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
工作中的新部分pom.xml:
<!-- hysterix -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>$spring.boot.version</version>
</dependency>
【讨论】:
【参考方案4】:我在为使用 spring boot 2.0.x 的 spring boot 微服务集成 hystrix 时遇到了类似的问题。 而不是
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>$spring-hystrix.version</version>
</dependency>
我已经搬到了
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>$spring-hystrix.version</version>
</dependency>
Spring boot 2.0.x 应用程序使用 spring-cloud-starter-netflix-hystrix 依赖项启动良好,没有此问题。
【讨论】:
【参考方案5】:我在启动 Spring Boot 2 时也遇到了这个问题,因为 spring-cloud-starter-hystrix 是我在项目中使用的依赖项。但是我发现 spring-cloud-starter-hystrix 已被弃用。我还发现我在那里使用的 feign 类已移至 spring-cloud-openfeign (https://github.com/spring-cloud/spring-cloud-openfeign)。所以我所做的就是从我的依赖项中删除 spring-cloud-starter-hystrix 并添加 spring-cloud-openfeign 。这对我来说非常有效。
基本上我换了
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-hystrix', version: '1.4.4.RELEASE'
与
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-openfeign', version: '2.0.0.RELEASE'
Spring Boot 2 已准备就绪。希望这会有所帮助。
注意:我使用 Gradle,如果需要,您可以轻松找到 maven pom 依赖等价物。
【讨论】:
【参考方案6】:经过进一步研究,我找到了一个解决方案,将以下内容添加到 pom 文件中:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
spring-cloud-dependencies
的所有版本似乎都与 Spring Boot 2.x.x 不兼容
【讨论】:
以上是关于由于 Hystrix,Spring Boot 2 启动失败?的主要内容,如果未能解决你的问题,请参考以下文章
Hystrix 和 Turbine 不适用于 Spring boot 2 和 Spring cloud Finchley.M8
真的有必要将 Hystrix 与反应式 Spring Boot 2 应用程序一起使用吗?
寻找 Spring Boot Hystrix Dashboard 解释(Spring Boot Starter)安全性的解决方案 Hystrix Stream(作为它自己的项目)?