Как объединить ответ двух весенних загрузочных микро-сервисов в классе-обёртке - PullRequest
0 голосов
/ 24 июня 2018

Я новичок в загрузочных микросервисах Spring и изучаю инфраструктуру webflux. Я пытаюсь объединить ответ от двух микросервисов в один класс-оболочку, чтобы получить ответ в правильном JSON. Ниже подробно описан сценарий.

Микро-Сервис 1: http://localhost:8080/products в контроллере этого микросервиса его возвращают Flux и я получаю

[
    {
        "id": "5b2fd1e5f57d731904c54ad7",
        "name": "Product3",
        "price": "30"
    },
    {
        "id": "5b2fd1e4j9fdj3kds9djkj43",
        "name": "Product2",
        "price": "20"
    }
]

Микро-Сервис 2: http://localhost:8181/person В контроллере второго сервиса возвращается Mono, и за это я получаю правильный ответ, как показано ниже,

{
    "id": ehj8u3jmodmdj,
    "name": "PersonXXX",
    "email": "PersonXXX@somecorp.com"
}

Теперь я хочу создать еще один микросервис http://localhost:8282/personproduct, который должен объединить результат двух вышеуказанных микросервисов в классе оболочки, как показано ниже,

{
    {
        "id": ehj8u3jmodmdj,
        "name": "PersonXXX",
        "email": "PersonXXX@somecorp.com"
    },

    [
        {
            "id": "5b2fd1e5f57d731904c54ad7",
            "name": "Product3",
            "price": "30"
        },
        {
            "id": "5b2fd1e4j9fdj3kds9djkj43",
            "name": "Product2",
            "price": "20"
        }
    ]

}

Сейчас у меня есть объект Entity для родительского класса и класса Product, и я вызываю оба вышеупомянутых микро-сервиса через WebClient и объединяю ответ, используя Flux.concat (personResp, productResp); где personResp имеет тип Mono, а productResp имеет тип Flux, но я получаю ответ этого (третьего) микросервиса только в текстовом, а не в JSON, как показано ниже,

data:{"id":ehj8u3jmodmdj,"name":"PersonXXX","email":"PersonXXX@somecorp.com"}
data:{"id":"5b2fd1e5f57d731904c54ad7","name":"Product3","price":"30"}
data:{"id":"5b2fd1e4j9fdj3kds9djkj43","name":"Product2","price":"20"}

Это может быть связано с тем, что каждый элемент отправляется как отдельный поток.

Так что просто хочу знать, есть ли способ объединить два ответа в одном классе-обертке без использования метода block () для каких-либо вызовов этих двух служб.

UPDATE

В настоящее время я называю продукт microservice as,

clientProd.get().uri(productUrl)
                .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                .retrieve().bodyToFlux(Product.class).onErrorReturn(new Product());

и аналогично Person service как,

clientPerson.get().uri(personUri)
                .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                .retrieve().bodyToMono(Person.class).onErrorReturn(new Person());

И объединение использует Flux.concat (),

Заранее спасибо.

1 Ответ

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

Правильный способ - сопоставить эти ответы с классами:

public class Product{
    private Long id;
    private String name;
    private Double price;

    //constructors, getters, setters
}

public class Person{
    private Long id;
    private String name;
    private String mail;

    //constructors, getters, setters
}

public class Entity{
    private Person person;
    private List <Product> products;

    //constructors, getters, setters
}

Таким образом, у вас есть три различных POJO, которые вы можете использовать в соответствии с потребностями (тип API, который вы вызываете).

...