Рубрики
Без рубрики

Использование Apache Camel для агрегирования конечных точек API-интерфейсов REST

Что такое Apache Camel описано, Как сам создатель Клаус Ибсен, доступный в… С тегами java, camel, интеграция, отдых.

Что такое Apache Camel

Описано, как сам создатель Клаус Ибсен, найдут в книге Camel in Action (свободный перевод):

Суть Camel framework-это механизм маршрутизации, или, точнее, framework, которая делает возможным построение маршрутов. Он позволяет установить собственные правила маршрутизации, чтобы решить, какие, какие источники, принимать сообщения, и как обрабатывать эти сообщения и отправлять на другие цели. Camel использует язык интеграции, что позволяет устанавливать сложные правила маршрутизации, похожие на бизнес-процессы. Как monstrado на рисунке ниже, он может быть связующим звеном, которое объединяет разрозненных систем. Одним из вещества, основные Camel является то, что он делает выводы о типах данных, которые необходимо обработать. Это очень важно, потому что дает разработчику возможность интегрировать какой-либо системы, без необходимости преобразования данных в определенном формате.

Dentre diversus soluçoes de integraçao que podemos монстр ком Верблюд, несте артиго, иремос конструир ум альредедор де шамадас АПИС, утилизандо о EIP Обогатитель .

Os códigos apresentadas neste артиго поде сер энконтрадо их https://github.com/andredgusmao/camel-rest-aggregator

Пример

Чтобы показать, как EIP Enricher может быть использован в Camel будем предоставлять приложение, которое объединяет два Api вызовов:

  1. API авторов книги с концами:
    1. [ПОЛУЧИТЬ]/авторы
    2. [[ПОЛУЧИТЬ]/имя автора/{имя}
  2. API de livros com o конечная точка:
    1. [[ПОЛУЧИТЬ]/книги/{авторские}

Конечные точки Nossa aplicaçao Camel van disponibilizar dois:

  1. [GET]/integration | authors |/- запрос к API авторов. [GET]/integration/authors/{name}
  2. - Запроса в API авторов автором по имени (ex: jr-толкиена , jk-роулинг ) и обогащает ответ с консультации все книги автора в API книг.

Приложение Camel

Создание проекта

Чтобы создать проект, просто войдите https://start.spring.io/ и заполнить район project metadata:

Spring Boot: 2.3.1
Group: br.com.camel.bookstore
Artifact: camel-bookstore-aggregator
Version: 1.0
Name: camel-bookstore-aggregator
Dependencies: 'Apache Camel'

Нажмите кнопку Generate для создания проект e entao udite o pam para adicionar в качестве зависимого от использования (подводное течение, отдых http)

pom проекта должно остаться что-то подобное:



    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        2.3.1.RELEASE
         
    
    br.com.camel.bookstore
    camel-bookstore-aggregator
    1.0
    camel-bookstore-aggregator

    
        1.8
            3.1.0
    

    
        
            org.apache.camel.springboot
            camel-spring-boot-starter
            ${camel.version}
        

        
            org.apache.camel.springboot
            camel-rest-starter
            ${camel.version}
        

        
            org.apache.camel
            camel-undertow
            ${camel.version}
        

        
            org.apache.camel
            camel-http
            ${camel.version}
        
        ...
    

Отдых по расписанию

Вамос криар дуа классы ком ротас Верблюд. В классе RestRoute будут конечные точки и в классе RestAggregatorRoute находиться маршруты, которые получают доступ к Api, и обогащают содержание.

@Component
public class RestRoute extends RouteBuilder {

  @Override
  public void configure() throws Exception {
    //define as configurações do servidor como endereço de host e porta
    restConfiguration()
      .host("0.0.0.0").port(8080)
      .bindingMode(RestBindingMode.auto);

    //inicia delaração dos serviços REST
    rest("/integration")
      //Endpoint que consulta todos os autores
      .get("/authors")
        .route().routeId("rest-all-authors")
        .to("direct:call-rest-all")
      .endRest()

      //Endpoint que usa o Enrich EIP
      .get("/authors/{name}")
        .route().routeId("rest-author-by-name")
        .to("direct:call-rest-author")
      .endRest();
  }
}

Конечные точки [ПОЛУЧИТЬ]/интеграция/авторы e [ПОЛУЧИТЬ]/интеграция/авторы/{имя} ао серем призывает чамама в качестве ротаса прямой: вызов-отдых- все и direct call-rest-author которые будут определены в другом классе.

Маршрут интеграция

Запрос API авторов

Маршрут, который призывает всех авторов использует компонент http para consumir o конечная точка да API де авторес.

from("direct:call-rest-all")
  .routeId("all-service")
  .removeHeaders("CamelHttp*")
  .setHeader(Exchange.HTTP_METHOD, constant("GET"))
.to("http://{{authors.url}}/authors");

На маршруте используется removeHeaders("CamelHttp*"); чтобы убедиться, что при вызове API мы будем только заголовки компонента http будем использовать HTTP_METHOD значение GET . Метод to получает в качестве параметра "http://{{authors.url}}/authors" , при использовании двойных ключей окутана authors.url camel способен заменить значение прямое application.properties , таким образом, файл должен содержать значение url-адреса:

#application.properties

authors.url=localhost:8081

Это все, что нужно для этого маршрута, возвращение endpoint API авторов, возвращается непосредственно через приложение Camel.

Объединение запросов автора и книги

Маршрут direct call-rest-author | поиск| автором по имени курсе, основанный в ответ получаем ìd автора, а затем обогащенный возвращение с эй книги автора, как показано на рисунке:

Код маршрута выглядит следующим образом:

from("direct:call-rest-author")
  .routeId("call-rest-services")
  .to("direct:author-service")
    .process(new GetAuthorIdProcessor())
  .enrich("direct:books-service", new JsonRestCallsAggregator())

Мы будем говорить из частей по отдельности:

  1. кому ("напрямую: автор-сервис") : Так как маршрут, который возвращает все авторы, он сделал простой вызов API авторов:
from("direct:author-service")
  .routeId("author-service")
  .removeHeaders("CamelHttp*")
  .setHeader(Exchange.HTTP_METHOD, constant("GET"))
.toD("http://{{authors.url}}/authors/${header.name}");

Путем вызова конечной точки /integration/authors/{name} наше приложение для camel, path, который передается в name доступно в заголовке exchange (например: /integration/authors/jr-толкиен ; /integration/authors/джейн остин ), как путь делает url-адрес запроса API, чтобы иметь несколько вариантов, мы должны использовать метод toD , а не to .

Возвращение API автором является json, сведения об авторе, для изъятия геодезического id мы должны сделать разбора json, и он находится инкапсулируется в сообщение, что Camel использует, чтобы перенести информацию между интеграция, Exchange для компонента http response находится в теле часть In Exchange , как показано на рисунке. Подробные сведения о Exchange могут быть найдены в javadoc https://www.javadoc.io/doc/org.apache.camel/camel-api/latest/org/apache/camel/Exchange.html .

  1. процесс (новый процессор GetAuthorId()) : Для изъятия геодезического id мы будем использовать um процессор пункт обмена, класс Процессор GetAuthorId для реализации org.apache.camel. Processor содержит код, необходимый.

Класс GetAuthorIdProcessor.java

public class GetAuthorIdProcessor implements Processor {

    @Override
    public void process(Exchange exchange) throws Exception {
        String author = exchange.getIn().getBody(String.class);
        JsonParser parser = JsonParserFactory.getJsonParser();
        Map jsonMap = parser.parseMap(author);
        String authorId = (String) jsonMap.get("id");

        exchange.getIn().setHeader("id", authorId);
        exchange.getIn().setBody(author);
    }
}

Метод process несет ответственность за чтение и ответ от API, авторы которых находится в теле часть В Обмен da. Como a resposta está em json классы usaremos делают подготовку Весенняя загрузка для того чтобы сделать разбора и чтения id. Наконец, мы создаем новую header, называется id и setamos значение, i d автор и setamos снова тело account name In с json авторском праве.

  1. обогатить ("прямой: книги-сервис", новый агрегатор вызовов Json Rest()) : Nesse trecho é feito ума шамаде пара АПИ де ливрос е ком о реторно реализамос о агрупаменто де менсагенс на классе JsonRestCallsAggregator .
from("direct:books-service")
  .routeId("books-service")
  .removeHeaders("CamelHttp*")
  .setHeader(Exchange.HTTP_METHOD, constant("GET"))
.toD("http://{{books.url}}/books/${header.id}");

Так же, как вызов direct:author-service используем компонент http для вызова API из книг, как путь требует id передаем то, что было извлекать автора и вставлена в заголовок в методе process(new GetAuthorIdProcessor()) , как показано на рисунке ниже. Значение {{books.url}} должен быть объявлен в Значение

#application.properties

authors.url=localhost:8081
books.url=localhost:8082

Класс, который анализирует полученные ответы-это реализация org.apache.camel. AggregationStrategy с кодом:

public class JsonRestCallsAggregator implements AggregationStrategy {

    @Override
    public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
        JsonParser parser = JsonParserFactory.getJsonParser();

        String books = newExchange.getIn().getBody(String.class);
        String author = oldExchange.getIn().getBody(String.class);

        JsonObject authorJson = new JsonObject(parser.parseMap(author));        
        authorJson.put("books", new JsonArray(parser.parseList(books)));

        newExchange.getIn().setBody(authorJson.toJson());
        return newExchange;
    }
}

Метод aggregate тут есть два параметра, Exchange до enrich и после него. С помощью классов в Spring Boot, для обработки json получаем json автора oldExchange json и из книг автора newExchange , как показано на рисунке:

Таким образом, мы создаем Exchange возвращения, содержащий json в формате:

{
    "author": { 
        "id": "...",
        "name": "...",
        "fullName": "...",
        "books": [ ... ]
    }
}

Работа с ошибками

С нашего приложения Camel работает, мы можем потреблять и плавно услуги, из двух Api-интерфейсов, но и, если есть какие-либо сбой вызова от них? Рассмотрим два случая и рефакторинг нашего API, чтобы быть более отказоустойчивой.

Сценарии отказа

  1. Ошибка в API для книг. Casa sea utilizado um id de autor que нао поссуи ливрос кадастрдос дуранте а шамаде да АРИ де ливрос ( /книги/{идентификатор автора} ) теремос комо реторно о ошибке 404 (Не найден). Пара эвитар эрос на носса апликасао Верблюд вамос тратар конечная точка ао хамада. Компонент http уже есть поведение в зависимости от кода состояния response компонент возвращает успех или исключение HttpOperationFailedException [1].
//Sem tratamento de erro
from("direct:books-service")
  .routeId("books-service")
  .removeHeaders("CamelHttp*")
  .setHeader(Exchange.HTTP_METHOD, constant("GET"))
.toD("http://{{books.url}}/books/${header.id}");
//Com tratamento de erro
from("direct:books-service")
  .routeId("books-service")

  //tratamento de exceção
  .onException(HttpOperationFailedException.class)
    .handled(true)
    .setBody(constant("[]"))
  .end()

  .removeHeaders("CamelHttp*")
  .setHeader(Exchange.HTTP_METHOD, constant("GET"))
.toD("http://{{books.url}}/books/${header.id}");   

Изменение, каждый раз, когда у нас есть сообщение об ошибке 404 API книг приложение Camel будет использовать пустой массив [] пра завершить request.

  1. Ошибка в API авторов. Если используется имя, которое не существует во время вызова API авторов ( /authors/{name} ) API будет возвращать код состояния 204 (Без Содержания). Пара эвитар эрос на носса апликасао Верблюд вамос тратар конечная точка ао хамада. Как состояние 204 находится в семье, статуса, успеха мы можем проверить статус возврата из API авторов, и если 204 мы будем возвращать один и тот же код в приложение, Верблюд, символизирующий, что имя автора не найдено. Так же, мы можем возвратить 404 или другой код, с помощью простых изменений в код.
//Sem tratamento de erro
from("direct:call-rest-author")
  .routeId("call-rest-services")
  .to("direct:author-service")
    .bean("authors", "getId")
  .enrich("direct:books-service", new JsonRestCallsAggregator())
//variáveis
private static final int OK_CODE = 200;
private static final int APP_RESPONSE_CODE = 204;

//Com tratamento de erro
from("direct:call-rest-author")
  .routeId("call-rest-services")
  .to("direct:author-service")
  .choice()
    .when(header(Exchange.HTTP_RESPONSE_CODE).isEqualTo(OK_CODE))
      .bean("authors", "getId")
      .enrich("direct:books-service", new JsonRestCallsAggregator())
  .otherwise()
    .setHeader(Exchange.HTTP_RESPONSE_CODE).constant(APP_RESPONSE_CODE);

Изменение, каждый раз, когда у нас ошибке 204 API авторов, применение Camel будет возвращать ошибку, определенный в переменной APP_RESPONSE_CODE завершение запроса, избегая запрос API книг и возможные исключения.

Завершение

Apache Camel-это платформа достаточно прочная, чтобы построить различные виды интеграции, как, что и было представлено в этой статье. EIP Enricher , а также другие EIPs осуществляется в Camel, являются очень мощными, для более подробной информации о каждом из них можно ознакомиться в документации, в Enricher , а также другие EIPs осуществляется в Camel, являются очень мощными, для более подробной информации о каждом из них можно ознакомиться в документации, в .

Оригинал: “https://dev.to/thegusmao/utilizando-apachel-camel-para-agregar-endpoints-de-rest-apis-4pan”