Что такое 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 вызовов:
- API авторов книги с концами:
[ПОЛУЧИТЬ]/авторы[[ПОЛУЧИТЬ]/имя автора/{имя}
- API de livros com o конечная точка:
[[ПОЛУЧИТЬ]/книги/{авторские}
Конечные точки Nossa aplicaçao Camel van disponibilizar dois:
[GET]/integration | authors |/- запрос к API авторов.[GET]/integration/authors/{name}- Запроса в 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())
Мы будем говорить из частей по отдельности:
кому ("напрямую: автор-сервис"): Так как маршрут, который возвращает все авторы, он сделал простой вызов 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 .
процесс (новый процессор 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 авторском праве.
обогатить ("прямой: книги-сервис", новый агрегатор вызовов 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, чтобы быть более отказоустойчивой.
Сценарии отказа
- Ошибка в 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.
- Ошибка в 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”