Перезванивать друг другу службы Rest с использованием Spring WebFlux и повторно использовать результат промежуточных служб?

Я новичок в Spring WebFlux, но я пытаюсь добиться этого, как указано ниже.

First Service -> AuthService  Mono<String> ->gives auth token
Second Service -> ServiceSecodn Uses output from above service
Third service -> Uses output from both above specified services.

Невозможно выразить это с помощью API плоской карты webFlux.

 service1.dologin().flatmap(info->service2.apiCall(info))

Я хочу сделать третий сервисный звонок service3.apiCall(loginInfo,infoFromSecondServiceCall)


person naval jain    schedule 18.07.2018    source источник
comment
Добро пожаловать в StackOverflow. Пожалуйста, найдите время, чтобы прочитать страницы справки как задавать хорошие вопросы. Наконец, узнайте, как создать минимальный, полный и проверяемый пример, если это возможно.   -  person Hearen    schedule 18.07.2018


Ответы (1)


Объедините выходные данные с помощью Tuple2, чтобы объединить несколько выходных данных.

Вы можете хранить всю информацию полностью, удерживая ее в одной структуре, как в следующем примере:

service1.dologin()
        .flatMap(lInfo ->
            service2.apiCall(lInfo)
                    .map(result -> Tuples.of(lInfo, result))
        )
        .flatMap(lInfoAndResultTuple -> 
            service3.apiCall(
                lInfoAndResultTuple.getT1(),
                lInfoAndResultTuple.getT2()
            )
        )

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

Использование сложной модели замыкания

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

service1.dologin()
        .flatMap(lInfo ->
            service2.apiCall(lInfo)            
                    .flatMap(result -> 
                        service3.apiCall(lInfo, result)
                    )
        )

По сравнению с предыдущим примером здесь нам не нужно использовать дополнительную структуру данных для доступа к восходящим данным. Язык Java предоставляет нам встроенный доступ к данным родительских замыканий, чтобы мы могли использовать их в любое время в дочерних замыканиях. Основное преимущество этого метода — отсутствие избыточной структуры данных. Основным недостатком является сложная структура Flux/Closures, которая выглядит как хорошо известный обратный вызов Ад

person Oleh Dokuka    schedule 18.07.2018
comment
Спасибо @OlehDokuka - person naval jain; 19.07.2018