Итак, мы обновили библиотеки 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>
Спасибо за ответ, Спенсер! Я добавил свой файл pom в вопрос и могу подтвердить, что пытаюсь это сделать с помощью spring boot 2.4.x.
Как я и подозревал, это смешение 2020.0.x и Netflix 2.x не поддерживается и работать не будет.
Итак, Netflix 2.x не может работать с Cloud 2020.0.x, а для Spring Cloud Zuul нет 3.x. Означает ли это, что мой единственный вариант - избавиться от Zuul и принять Spring Cloud Gateway, если мы хотим продолжать обновлять Spring Cloud? Я не возражаю, поскольку Zuul 1 в любом случае устарел.





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