Переадресация запросов по данным из тела запроса — java nginx spring-mvc

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд
Загрузка...

Вопрос:


Существует сервис с «кучей» контроллеров. Стоит задача «распилить» данный сервис на микросервисы.

Сами микросервисы будут крутится на самостоятельных машинах.

Основная проблема в том, что есть некий роут(http://mydomain/myservice/srv/data), на который приходит разного типа запросы.

А логика после вызывается на основании значения в поле запроса. То есть два запроса:

<request type="getname" val="1"/> и <request type="balance" val="1"/>

должны уходить на разные логики будующих микросервисов(получение имени должно перенаправится, к примеру, на http://mydomain/myservice1/data/name, а получение баланса на http://mydomain/myservice2/data/balance ).

По факту сейчас вижу такие решения(если они возможны, конечно):

  1. Анализ на точке входа(ngix)
  2. Написание сервиса-маршрутизатора(анализирует и, грубо говоря, перенаправляет запросы RestTemplate’ом, к примеру, на микросервисы)

Вопрос: какие штатные средства есть для анализа содержимого тела запроса и дальнейшего перенаправления на другой микросервис?

Очень не хочется городить «велосипед» с п.2

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

UPD: рассматриваются и легковестные библиотеки, с помощью которых можно реализовать такой роутинг, основанный на содержимом тела запроса. Т.к. дали ясно понять, что вариант с настройкой ngix — крайний

Автор вопроса: Chubatiy

Chubatiy

Вообщем пришлось все же написать свой сервис.

Использовали:

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

Роутинг реализовали следующим образом:

@Configuration
public class Routing {

    @Bean
    public RouteLocator routeLocator(RouteLocatorBuilder builder) {

        return builder.routes()
                .route("NameService",
                        r -> r.path("http://mydomain/myservice/srv/data*")
                        .and().method(HttpMethod.POST)
                        .and().readBody(String.class, b -> b.contains(""name""))
                        .uri("http://mydomain/myservice1/data/name")
                )
                .route("BalanceService",
                        r -> r.path("http://mydomain/myservice/srv/data*")
                        .and().method(HttpMethod.POST)
                        .and().readBody(String.class, b -> b.contains(""balance""))
                        .uri("http://mydomain/myservice2/data/balance")
                )
                .build();
    }

}

приятно удивила netty по производительности)).

Также были эксперементы с реализацией через прокси:

@GetMapping("/srv/data")
public Mono<ResponseEntity<byte[]>> mixed(ProxyExchange<byte[]> proxy) throws Exception {

        return Mono.fromCallable(() -> 
                    ......
                    ......
                    return proxy
                            .uri("http://mydomain/myservice1/data/name").get();
                    ......
                    ......

                    return proxy
                            .uri("http://mydomain/myservice2/data/balance").get();
                });

    }

В варианте с прокси использовали также получение данных из БД и доп. анализ их(в куче с теми, что пришли в теле запроса)

Источник

Вам также может быть интересно:

Java. Деление в столбик. Съезжает вывод в консоль — java
Вопрос: Кто-нибудь может подсказать почему при делении 1034/15 съезжает вывод в консоль? public class Division { private StringBuffer result = new StringBuffer(); ...
Доступ к cookies другого сайта — javascript
Вопрос: Не знаю, или правильно написал вопрос в заголовке. Вообще вопрос такой. Есть, например виджет коминтариев фб, его можно установить на свой сайт. При заходе, он ...
Не видит загрузочной флешки с Ubuntu — linux windows ubuntu
Вопрос: Решил установить Ubuntu второй ОС. Скачал образ и установил его на флешку. Память для будущей Ubuntu выделил ещё когда устанавливал Windows. Проблема в том, что когда ...
Как устроен Netty? — java async netty
Вопрос: Немного почитал про асинхронные сокеты и про фреймворк Netty, но у меня возник вопрос о том как устроен механизм обработки многочисленных запросов к Netty. ...
Как реализовать правильную связь классов в javascript? — javascript ооп полиморфизм
Вопрос: Теперь в деталях : имеются несколько классов : class RemovedItem { constructor(value, key) { this.value = value; ...
Модификация Observable при помощи дополнительного запроса в сеть — android kotlin rxjava
Вопрос: работаю с Vk.APi и произвожу поиск списка групп. В ответе с API получаю список групп, но проблема в том, что каждая из них не содержит ...
Как загрузить Layout в Activity или View из переменной типа String — android xml activity
Вопрос: Обычно внешний вид Activity или View загружается из файлов типа *.xml, вложенных в папку res/layout проекта. А как сделать, чтобы внешний вид загружался из ...
Как выбрать максимальное значение в столбце? — sql sql-server
Вопрос: У меня есть таблица которая состоит из 2 столбцов OrderID OrderDate ------------------------------- 1021 1976-07-04 00:00:00 2312 ...
Форма TextView XML — android xml
Вопрос: Прошу понять меня правильно: Я не прошу что-то сделать за меня и предоставить готовый код ВОПРОС: Какие атрибуты необходимо использовать, чтобы выполнить такой же вид ...
Отловить закрытие консольной программы — c# console
Вопрос: Есть консольное приложение (C#), мне нужно отловить событие его закрытия. Это может быть и Ctrl+C и нажатие на крестик, вообще любое событие после которого ...
Странное поведение jQuery — jquery
Вопрос: Есть веб-страница, на которой естественно имеются стили и скрипты. При очистке кэша и полной перезагрузке страницы (Ctrl + F5) jQuery неправильно определяет height() и ...
Оверлей для любой программы и игры DirectX в фуллскрине через инжект dll — c# wpf
Вопрос: Всем привет. Хочу сделать универсальный оверлей, который при запуске из консольного приложения будет инжектить dll с самим оверлеем в любую программу, как у стима/дискорда. Про инжект ...
Использование, связка бинов в Java — java netbeans xhtml
Вопрос: У меня есть example.xhtml, я не знаю как правильно его заполнить, так как NetBeans предлагает один вариант, а видео, где все работает, заполняют по-другому.Netbeans: <?xml ...
Удалил rfremix-relese при попытке обновления — linux fedora
Вопрос: Сегодня хотел обновить Руссиан Федора Ремикс (RFRemix) 28->29. dnf upgrade выдал сообщение о конфликте в пакете rfremix-release-2.ххххххх Немного посомневался, но решил что это модуль именно ремикса ...
Компиляция QT 5.11 на Raspberry Pi 3 — c++ qt5 raspberry-pi
Вопрос: Raspberry Pi идет в комплекте с QT 5.3 и QT Creator 3.2.1. Есть необходимость обновить версию QT до 5.11. Чтобы была возможность использовать новые ...

Оставьте ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *