由于 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)

有人有过同样的经历吗? 有解决办法了吗?

【问题讨论】:

从依赖中移除&lt;version&gt;标签。 这并没有解决。 【参考方案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(作为它自己的项目)?

spring boot hystrix 集成

Spring Cloud Spring Boot mybatis分布式微服务云架构-hystrix参数详解

Spring Boot 中的 Hystrix 仪表板问题