Spring Cloud Gateway: не маршрутизирует запрос, в конечном итоге обнаруживает слишком большой объект запроса 413 - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь настроить простой пример Spring Cloud Gateway.

У меня есть 2 docker контейнера, запущенных локально, которые будут отвечать AAA и ZZZ при достижении следующей конечной точки

http://localhost:2000/restmessage
http://localhost:2001/restmessage

Я пытаюсь создать простой шлюз, который будет маршрутизировать к одной из этих служб. В конце концов, будет фактический лог c, чтобы принять это решение, но пока я просто хочу увидеть, что что-то работает и жестко запрограммировано на первый экземпляр.

Вот мой GlobalFilter

@Component
public class MacFilter implements GlobalFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerWebExchange modifiedExchange = exchange.mutate()
                .request(rq -> rq.uri(
                        UriComponentsBuilder.fromUri(exchange.getRequest().getURI())
                        .host("localhost")
                        .port(2000)
                        .build()
                        .toUri()
                ))
                .build();

//        ServerWebExchangeUtils.setAlreadyRouted(modifiedExchange);


        return chain.filter(modifiedExchange);
    }
}

И свойства

spring.cloud.gateway.routes[0].id=routezero
spring.cloud.gateway.routes[0].uri=http://localhost:8081
spring.cloud.gateway.routes[0].predicates[0]=Path=/restmessage

Этот фильтр запускается каждый раз, когда я попадаю на шлюз с сообщением restmessage (http://localhost:8080/restmessage). Но если закомментированный метод setAlreadyRouted закомментирован, он попадет в него сотни раз. В конце концов команда curl не работает с 413 REQUEST ENTITY TOO LARGE. Просматривая журналы служб docker, я могу сказать, что они никогда не выполняются.

$ curl localhost:8080/restmessage -i
HTTP/1.1 413 Request Entity Too Large
content-length: 0

Если я раскомментирую метод setAlreadyRouted, он больше не будет вызывать сотни раз, и запрос немедленно возвращается , но ответ пуст, и контейнеры docker снова никогда не вызываются.

$ curl localhost:8081/restmessage -i
HTTP/1.1 200 OK
content-length: 0

Я также пробовал это с компонентами FilterFactory и RouteLocator, но все они демонстрируют одинаковое поведение .

Я просмотрел всю документацию, но все, что я смог найти, похоже, указывает на то, что это должно работать. Кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 24 июня 2020

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

Другими словами, если у вас есть 2 идентичных сервиса, один работает на localhost: 2000, а другой на localhost: 2001, вам понадобится 2 маршрута, один для одной службы, а другой - для другой. Конечно, поскольку сервисы предоставляют идентичные конечные точки, вам понадобится что-то, с помощью которого можно будет различать guish, к какой службе вы хотите маршрутизировать. Например, это можно сделать, добавив заголовок к вашему запросу.

Пример настройки может быть примерно таким. В вашем application.yaml (то есть не в вашем application.properties, это также можно сделать в файле свойств, но yaml лучше подходит для этой цели) поместите что-то вроде этого:

spring:
  application:
    name: gateway-service
  cloud:
    gateway:
      routes:
        - id: 2000service
          uri: http://localhost:2000
          predicates:
            - Path=/restmessage
            - Header=route, service-one
        - id: 2001service
          uri: https://localhost:2001
          predicates:
            - Path=/restmessage
            - Header=route, service-two

Вы можете получить избавиться от вашего GlobalFilter и определенных вами свойств. Теперь запустите свое приложение:

mvn spring-boot:run

Затем выполните curl для своей службы (при условии, что здесь ваш шлюз работает на порту 8080):

curl http://localhost:8080/restmessage -H "route: service-one"

Теперь вы должны увидеть, что ваш запрос маршрутизируется к вашей службе, работающей на порту 2000.

Надеюсь, это поможет!

0 голосов
/ 23 июня 2020

может быть, центр обнаружения, такой как eureka, решит вашу проблему.

  • сначала зарегистрируйте docker сервер на eureka;
  • затем дайте весеннему облачному шлюзу эврика configuration;
  • наконец, установите @EnableDiscoveryClient в классе приложения весеннего облачного шлюза.

также, сообщения об этой проблеме могут вам очень помочь: https://github.com/spring-cloud/spring-cloud-gateway/issues/383

...