spring-cloud-gateway webflux ProxyExchange возвращает 404

Я хотел бы создать простой прокси-сервер и сервер-агрегатор с помощью spring-cloud-gateway. Для этого я использую зависимость spring-cloud-gateway-webflux и ProxyExchange. Я запускаю приложение на локальном хосте и запускаю его из браузера, однако оно возвращает 404 не найдено.

Если я использую spring-cloud-gateway-mvc вместо spring-cloud-gateway-webflux, неожиданно работает прокси, и я могу просматривать stackoverflow на своем локальном хосте. Но все же хотелось бы узнать, почему spring-cloud-gateway-webflux не работает.

Может ли кто-нибудь помочь указать на что-то, что мне не хватает?

контроллер:

@RestController
public class RouteController {
    @RequestMapping(value="/**", method={ RequestMethod.GET, RequestMethod.POST })
    public Mono<ResponseEntity<byte[]>> proxy(ServerHttpRequest request, ServerHttpResponse response, ProxyExchange<byte[]> proxy) throws Exception {
        String path = proxy.path("/");
        if (request.getMethodValue().startsWith("GET")) {
            return proxy.uri("https://stackoverflow.com/" + path).get();
        } else {
            return proxy.uri("https://stackoverflow.com/" + path).post();
        }
    }
}

приложение.yml:

server:
  port: 8080

Я попытался добавить следующее в application.yml, но это не сработало.

spring:
  cloud:
    gateway:
      httpclient:
        ssl:
          useInsecureTrustManager: true

person William    schedule 16.03.2020    source источник
comment
Эти свойства конфигурации работают только для автономного шлюза, а не для этих модулей. Свойства для них имеют префикс spring.cloud.gateway.proxy.   -  person spencergibb    schedule 16.03.2020
comment
Я предполагаю, что RestTemplate по умолчанию игнорирует ошибки ssl, а WebClient — нет. Вы можете создать bean-компонент ProxyExchangeArgumentResolver и соответствующим образом настроить WebClient. См. github.com/spring-cloud/spring-cloud-gateway/blob/   -  person spencergibb    schedule 16.03.2020
comment
@spencergibb Вы имеете в виду, что я должен установить свойство spring.cloud.gateway.proxy.ssl.useInsecureTrustManager = true? Я пытался, но это все еще не работает.   -  person William    schedule 16.03.2020
comment
этого свойства не существует. Чтобы делать то, что вы хотите, вам нужно продублировать код, на который я ссылаюсь.   -  person spencergibb    schedule 16.03.2020
comment
Спасибо @spencergibb. Я добавил bean-компонент ProxyExchangeArgumentResolver, но он все еще не работает. Код компонента находится здесь (github.com/william726/proxy-exchange-demo/blob/). Я не уверен, сделал ли я что-то не так, особенно. аннотации.   -  person William    schedule 17.03.2020
comment
С другой стороны, я провел быстрый и наивный тест с новым WebClient для вызова API или сайта, а не для использования ProxyExchange и создания нового компонента ProxyExchangeArgumentResolver. Он отлично работает и не жалуется на https или ssl. Это немного странно, и кажется, что 404 не имеет отношения к конфигурации WebClient. Код находится здесь github.com/william726/proxy-exchange-demo/blob/test-webclient/   -  person William    schedule 17.03.2020


Ответы (1)


В моей ситуации это проблема заголовков http. Добавьте следующий код, тогда у меня все работает.

proxy.sensitive(HttpHeaders.HOST)

Похоже, что ProxyExchange по умолчанию передает заголовок HTTP-запроса, а в случае WebClient HTTP-заголовка по умолчанию нет.

person York    schedule 02.06.2020
comment
Это сработало для меня - person Fahim Farook; 08.03.2021