Используя Spring Boot 2.2.2 и Cloud Hoxton, у меня есть Cloud Gateway с Eureka и несколько экземпляров WebFlux, работающих за шлюзом и обнаруживаемых через Eureka. В режиме HTTP все работает нормально.
При повторной настройке экземпляров Gateway и WebFlux на SSL маршрутизация от шлюза к экземплярам WebFlux все еще работает ОК. Однако микро-службы по-прежнему отправляются как HTTP, а не HTTPS. Я предполагаю, что это так, потому что микро-сервис отказывает с io.netty.handler.ssl.NotSslRecordException: not an SSL/TLS record
.
Мой шлюз имеет следующую конфигурацию; Редактировать - исправлена конфигурация SSL ниже;
server:
port: 443
ssl:
enabled: true
key-store: …
key-store-password: …
trust-store: …
trust-store-password: …
eureka:
client:
service-url:
defaultZone: …
instance:
securePortEnabled: true
nonSecurePortEnabled: false
leaseRenewalIntervalInSeconds: 5
cloud:
gateway:
httpclient:
ssl:
useInsecureTrustManager: true
routes:
- id: route1
predicates:
- Path=/SECURITY/**
uri: lb://SECURITY
filters:
- RewritePath=/SECURITY/(?<myPath>.*), /$\{myPath}
- TokenRelay=
- RemoveRequestHeader=Cookie
Редактировать: В командной строке для шлюза и микросервиса также есть -Djavax.net.ssl
для keyStore
, trustStore
и соответствующие им пароли.
Микросервис работает на том же сервере с теми же сертификатами и с той же конфигурацией server.ssl
и eureka
(хотя и с другой spring.application.name
)
URL-адреса к шлюзу перенаправляются правильно. Однако приведенный ниже код, который находится в шлюзе, вызывает HTTP вместо вызова HTTPS.
@Configuration
public class LoadBalancedWebClientBuilder {
@LoadBalanced
@Bean
WebClient.Builder loadBalanced() {
return WebClient.builder();
}
}
@RestController
public class MyRestController {
@Autowired WebClient.Builder loadBalanced;
@GetMapping(value = "/applicationStatus", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<DrsApplication> getApplicationActuator() {
WebClient webClient = loadBalanced.build();
return webClient
.get()
.uri("lb://SECURITY/drs/application")
.retrieve()
.bodyToFlux(DrsApplication.class)
.filter(p -> p.isActive())
.flatMap(drsApplication ->
webClient
.get()
.uri("lb://" + drsApplication.getName() + "/actuator/health")
.retrieve()
.bodyToMono(ActuatorStatus.class)
.onErrorReturn(new ActuatorStatus("DOWN"))
.map(as -> {
drsApplication.setStatus(as.getStatus());
return drsApplication;
})
.repeatWhen(interval -> Flux.interval(Duration.ofSeconds(4)))
.onErrorResume(e -> Mono.empty())
);
}
}
До сих пор все было обновлено с HTTP до SSL, только с помощью конфигурации. Я предполагал , что, поскольку вызов WebClient
использует lb
, он автоматически будет следовать за набором и будет принимать SSL.
Верно ли мое предположение или мне нужно изменить свой код или конфигурация