Я новичок в Зууле, Эврике и 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 не работает, а затем попытаться переслать вместо этого запросите другой порт.