Переадресация запросов по данным из тела запроса — 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();
                });

    }

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

Источник

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

Использование вложенных маршрутов в React Router — javascript reactjs react-router
Вопрос: Для организации маршрутов в приложении использую React Router. <Route path="/" component={...}> <IndexRoute component={...}/> <Route path="user/:userId" component={...}> ...
Как с помощью Retrofit 2.0 отправить данные в JSON на сервер и получить ответ? — java android retrofit
Вопрос: Только начал читать про Retrofit 2.0 до этого использовал HttpURLConnection. Как я работаю с HttpURLConnection, формирую Json перевожу его в byte, ставлю header в ...
Не приходят push уведомления. FCM — android firebase android-notification
Вопрос: Появилась необходимость реализовать push уведомления. Прописал в манифесте сервис: <service android:name=".MyFirebaseMessagingService"> <intent-filter> ...
Принцип браузерной игры в линукс терминале — java linux terminal
Вопрос: Наткнулся на Java библиотеку CHARVA. И хотел бы уточнить у знающих людей, возможно ли на основе данной библиотеки сделать программу по принципу браузерной игры, но ...
Мерцание заблокированного экрана при выключенной подсветке в Debian 8 Gnome 3 — linux debian экран
Вопрос: На ноутбуке с Debian 8 Jessie и Gnome 3 имеется следующая проблема. При выключенном заблокированном экране сквозь него можно наблюдать, как весь экран становится белым, ...
Создание WCF клиента на готовый SOAP web сервер — c# wcf
Вопрос: Доброго времени суток. Появилась задача опрашивать web сервер с клиента на котором планируется написать WCF клиентскую часть. Информации про сервер очень мало (не знаю платформу ...
Безопасно ли удалить файл логов general_log.txt? — mysql
Вопрос: При выполнении запроса со вставкой данных большого объёма SQLyog начал вылетать с ошибкой: not enough memory application terminated В связи с этим я решила ...
Callback функции создания таблицы mysql в nodejs — mysql node.js callback
Вопрос: Есть функция, которая при запуске создает базу даных, function showDb() { pool.query("show databases like 'bt' ",function (err, ...
Как создать Adapter с неограниченным количеством строк и с неограниченным разным количеством столбцов в каждой строке — java android
Вопрос: Как создать Adapter с неограниченным количеством строк и с неограниченным разным количеством столбцов в каждой строке Автор вопроса: Salut Amigo Источник
Не могу передать байтовый массив в контроллер — c# asp.net-mvc entity-framework
Вопрос: У меня изображения храняться в бд в формате байтового массива, через форич отлично все выводит, но когда я хочу открыть страницу для работы с ...
proguard release error — java android mvp
Вопрос: Включил в проекте proguard, apk собирается, все хорошо, но приложение не работает) Proguard-rules.pro -keepattributes InnerClasses -keepattributes EnclosingMethod -keepattributes *Annotation* -dontoptimize # Keep Butterknife -keep class butterknife.** { *; } -dontwarn butterknife.internal.** -keep ...
Не отрабатывает page:update — javascript ruby-on-rails
Вопрос: Есть мой учебный проект на ruby. Делаю редактирование объектов с помощью JS. Сейчас работает так: Редактирую первый раз - всё нормально. Не обновляя страницу, ...
Как найти определенный символ в строке и удалить значение после него (и вместе с ним) Jquery — javascript html jquery
Вопрос: Здравствуйте, есть определенный набор строк, типа "L / Красный / 12345", как можно на странице найти их, и вырезать из них все что находится ...
Почему не работает wildcard module declaration? — typescript
Вопрос: Почему не работает такой способ декларации: declare module "*!text" {} ? Цель - использовать контент файла в переменной: import layout = require("/js/views/layouts/wnd.html!text"); или так: import layout from "/js/views/layouts/wnd.html!text"; Если ...
Как прервать 3rd-party код? — c# многопоточность .net-core
Вопрос: Есть 3rd-party код из библиотеки который "зависает" в ожидании где-то в работе с сетью. CancellationToken поддержки нет, таймаутов нет. Запускаю я его через: Task.Run(() => ...

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

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