Ошибка перенаправления Zuul на экземпляр down при его выключении - PullRequest
0 голосов
/ 23 февраля 2020

Я новичок в Зууле, Эврике и Java в целом. То, чего я пытаюсь добиться, - это зарегистрировать все мои микроуслуги в Eureka (с несколькими экземплярами), а затем получить один из этих экземпляров через шлюз Zuul.

Все работает нормально, и я вижу, как Зуул на самом деле перенаправляет запросы. Однако после некоторого тестирования я обнаружил, что если я отключаю основной экземпляр, на который отправляет запросы Zuul, я получаю ответ об ошибке 500 в течение нескольких секунд, а затем после некоторого ожидания он понимает, что экземпляр не работает и следует переслать на тот, который вместо.

Я искал по всему inte rnet, но не нашел решения, которое работает по этой проблеме. И я попытался настроить повторную попытку ленты и пружины.

Основное приложение моего сервера Eureka:

@EnableEurekaServer
@SpringBootApplication
public class ServicediscoveryApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServicediscoveryApplication.class, args);
    }

}

Приложение Eureka application.yml

server:
  port: 8761
  max-http-header-size: 10000000

eureka:
  client:
    registerWithEureka: false
    fetchRegistry: false
  server:
    waitTimeInMsWhenSyncEmpty: 5;
    responseCacheUpdateIntervalMs: 30
    expectedClientRenewalIntervalSeconds: 5
    evictionIntervalTimerInMs: 60000
    renewalPercentThreshold: 0.7
    renewalThresholdUpdateIntervalMs: 20000
    enableSelfPreservation: true
  instance:
    leaseExpirationDurationInSeconds: 10
    registry:
      expected-number-of-clients-sending-renews: 9

Основное приложение Zuul:

@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
@EnableDiscoveryClient
public class ZuulServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZuulServiceApplication.class, args);
    }

}

Zuul application.yml:

сервер: порт: 8011

spring: application: имя: "zuul"

eureka: client: serviceUrl: defaultZone: "http://localhost: 8761 / eureka " fetchRegistry: true registerWithEureka: false экземпляр: идентификатор экземпляра: $ {spring.application.name}: $ {random.value}

zuul:
  routes:
    users-ws:
      path: "/users/**"
#  ignoredServices: "*"
  ribbon:
    restclient:
      enabled: true
    eureka:
      enabled: true

Фиктивное приложение для тестирования:

@EnableEurekaClient
@SpringBootApplication
@RestController
@RequestMapping("/users")
public class PhotoappApplication {

    @GetMapping("/status/check")
    public String status() {
        return "Working 2";
    }
    public static void main(String[] args) {
        SpringApplication.run(PhotoappApplication.class, args);
    }

}

server:
  port: 8072
spring:
  application:
    name: "users-ws"
eureka:
  client:
    serviceUrl:
      defaultZone: "http://localhost:8761/eureka"
  instance:
    instance-id: ${spring.application.name}:${random.value}

Пример журнала ошибок от zuul:

Caused by: org.apache.http.conn.HttpHostConnectException: Connect to 192.168.0.104:8072 [/192.168.0.104] failed: Connection refused (Connection refused)
    at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:156) ~[httpclient-4.5.10.jar:4.5.10]
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:374) ~[httpclient-4.5.10.jar:4.5.10]
    at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393) ~[httpclient-4.5.10.jar:4.5.10]
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236) ~[httpclient-4.5.10.jar:4.5.10]
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186) ~[httpclient-4.5.10.jar:4.5.10]

Он должен был понять, что 192.168.0.104:8072 не работает, а затем попытаться переслать вместо этого запросите другой порт.

...