Ленточный клиент Eureka не работает после обновления до spring-cloud-starter-netflix-eureka-client: jar: 2.2.7.RELEASE

Итак, мы обновили библиотеки spring-cloud-netflix с 2.2.2.RELEASE до 2.2.7.RELEASE. Я не ожидал серьезных сбоев, но при тестировании продолжал видеть эту ошибку.

Caused by: com.netflix.client.ClientException: Load balancer does not have available server for client: dummy-service
at com.netflix.loadbalancer.LoadBalancerContext.getServerFromLoadBalancer(LoadBalancerContext.java:483) ~[ribbon-loadbalancer-2.3.0.jar:2.3.0]
at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:184) ~[ribbon-loadbalancer-2.3.0.jar:2.3.0]
at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:180) ~[ribbon-loadbalancer-2.3.0.jar:2.3.0]

Мы также используем Netflix Zuul с Spring spring-cloud-starter-netflix-zuul:2.2.7.RELEASE.

При дальнейшей отладке я обнаружил, что реализация свойства ServerList в DynamicServerListLoadBalancer на самом деле является ConfigurationBasedServerList, а не DomainExtractingServerList (которая должна оборачивать DiscoveryEnabledNIWSServerList). Это наблюдение также противоречит ожидаемому поведению в документации Spring-Cloud здесь.

When Eureka is used in conjunction with Ribbon (that is, both are on the classpath), the ribbonServerList is overridden with an extension of DiscoveryEnabledNIWSServerList, which populates the list of servers from Eureka. It also replaces the IPing interface with NIWSDiscoveryPing, which delegates to Eureka to determine if a server is up. The ServerList that is installed by default is a DomainExtractingServerList.

Я также заметил, что мой spring-cloud-starter-netflix-eureka-client:jar:2.2.7.RELEASE скачивает spring-cloud-netflix-eureka-client:jar:3.0.2 транзитивно, у которого нет EurekaRibbonClientConfiguration и DomainExtractingServerList. Это намеренно?

 +- org.springframework.cloud:spring-cloud-starter-netflix-eureka-client:jar:2.2.7.RELEASE:compile
[INFO] |  +- org.springframework.cloud:spring-cloud-netflix-hystrix:jar:2.2.7.RELEASE:compile
[INFO] |  +- org.springframework.cloud:spring-cloud-netflix-eureka-client:jar:3.0.2:compile

Я ожидал, что 2.x будет работать с 3.x, поскольку библиотека извлекается транзитивно, но здесь этого не происходит. Кстати, я также попытался добавить spring-cloud-netflix-eureka-client:jar:2.2.7.RELEASE inline в свой файл pom, чтобы переопределить 3.0.2, но затем столкнулся с некоторыми ошибками определения класса, не обнаруженными.

Какое предложение в этом случае? Должен ли я создать EurekaRibbonClientConfiguration внутри своего приложения, чтобы я мог получить правильный ServerList, введенный? EurekaRibbonClientConfiguration, похоже, делает гораздо больше, чем просто создает реализацию bean-компонента ServerList. Я не могу использовать 3.0.2, потому что я также использую Zuul, а Spring-cloud-zuul максимален на 2.2.7.РЕЛИЗ.

Мне действительно нужно продолжать использовать Spring-cloud, Zuul, Ribbon и Eureka.

Обновлять Вот мой файл pom:

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0"
         xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.cdm</groupId>
    <artifactId>api-internal-gateway</artifactId>
    <version>${default.version}</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <default.version>DEV-SNAPSHOT</default.version>
        <java.version>11</java.version>     
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-cloud.version>2020.0.2</spring-cloud.version>
        <springfox.version>2.9.2</springfox.version>
        <spring-cloud.extras.version>2.2.7.RELEASE</spring-cloud.extras.version>
    </properties>

  
    <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>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</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-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-sleuth</artifactId>
            <version>${spring-cloud.extras.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>${spring-cloud.extras.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
            <version>${spring-cloud.extras.version}</version>
        </dependency>


        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-all</artifactId>
            <version>2.0.2-beta</version>
            <scope>test</scope>
        </dependency>
        
        <!-- API -->
        <dependency>
          <groupId>jakarta.xml.ws</groupId>
          <artifactId>jakarta.xml.ws-api</artifactId>
          <version>2.3.2</version>
        </dependency>
        <!-- Runtime -->
        <dependency>
          <groupId>com.sun.xml.ws</groupId>
          <artifactId>jaxws-rt</artifactId>
          <version>2.3.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>com.google.code.findbugs</groupId>
            <artifactId>jsr305</artifactId>
            <version>3.0.2</version>
        </dependency>
        <dependency>
            <groupId>javax.transaction</groupId>
            <artifactId>javax.transaction-api</artifactId>
            <version>1.2</version>
        </dependency>
    </dependencies>

</project>

Вы что-то испортили зависимости. 2.x и 3.x не работают вместе. Можешь показать свой pom.xml? Версии 2.x spring cloud не работают с загрузкой 2.4.x.

spencergibb 08.04.2021 23:28

Спасибо за ответ, Спенсер! Я добавил свой файл pom в вопрос и могу подтвердить, что пытаюсь это сделать с помощью spring boot 2.4.x.

Zain Qazi 08.04.2021 23:50

Как я и подозревал, это смешение 2020.0.x и Netflix 2.x не поддерживается и работать не будет.

spencergibb 09.04.2021 19:35

Итак, Netflix 2.x не может работать с Cloud 2020.0.x, а для Spring Cloud Zuul нет 3.x. Означает ли это, что мой единственный вариант - избавиться от Zuul и принять Spring Cloud Gateway, если мы хотим продолжать обновлять Spring Cloud? Я не возражаю, поскольку Zuul 1 в любом случае устарел.

Zain Qazi 09.04.2021 19:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
19
0

Другие вопросы по теме