Статьи

Создание устойчивых приложений Camel с помощью Hystrix DSL

Apache Camel — это зрелая библиотека интеграции (уже более 9 лет), которая реализует все шаблоны из книги Enterprise Integration Patterns. Но Camel — это не только библиотека реализации EIP, это современная среда, которая постоянно развивается, добавляет новые шаблоны и адаптируется к изменениям в отрасли. Помимо десятков коннекторов, добавляемых в каждом выпуске, Camel также идет рука об руку с новыми функциями, предоставляемыми новыми версиями самого языка Java и других сред Java. Со временем некоторые архитектурные стили, такие как SOA и ESB, теряют свою привлекательность, а новые архитектурные стили, такие как REST, становятся все более популярными.

Чтобы дать возможность разработчикам выполнять интеграцию с использованием этих новых тенденций, Camel отвечает, добавляя новые DSL, такие как REST DSL, и новые шаблоны, такие как автоматический выключатель, и такие компоненты, как Spring Boot. И это еще не все, и мы еще далеко не закончили. Благодаря таким технологиям, как контейнеры Docker и Kubernetes, ИТ-индустрия движется вперед еще быстрее, и Camel тоже развивается, чтобы облегчить разработчикам, как это было всегда. Чтобы получить представление о неких инструментах, вам необходимо разработать и запустить приложения в Docker и Kubernetes, ознакомиться с проектом Fabric8 и, в частности, такими инструментами, как плагин Docker Maven, расширение Kubernetes CDI, Java-клиент Kubernetes, тесты Arquilian для Kubernetes и т. Д. Впереди захватывающие времена с множеством интересных технологий, поэтому давайте взглянем на одну из них: Camel и автоматический выключатель на базе Hystrix.

Два автоматических выключателя в Camel, какой выбрать?

Два года назад, когда я впервые прочитал Release It от Майкла Найгарда, я не мог удержаться от реализации схемы выключателя в Camel . Обычно я вкладываю свой вклад в реальные потребности клиентов, но схема прерывателя цепи настолько элегантна, что мне пришлось это сделать. Чтобы реализовать его ненавязчивым образом, я добавил его в качестве стратегии Camel Load Balancer. Вот как это просто:

01
02
03
04
05
06
07
08
09
10
11
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="direct:start"/>
    <loadBalance>
        <circuitBreaker threshold="2" halfOpenAfter="1000">
            <exception>MyCustomException</exception>
        </circuitBreaker>
        <to uri="mock:result"/>
    </loadBalance>
  </route>
</camelContext>

Приведенный выше DSL является самоописанием: если число исключений MyCustomExceptions, генерируемых mock: result, достигает порогового значения, CircuitBreaker переходит в открытое состояние и начинает отклонять все запросы. Через 1000 мс он переходит в состояние halfOpenAfter, и результат первого запроса в этом состоянии будет определять его следующее состояние как закрытое или открытое. Это самая простая из возможных реализаций CircuitBreker, которую вы можете себе представить, но все же полезная.

Снимок экрана 2016-05-26 в 07.56.13

С тех пор архитектура Microseservices стала более популярной, как и Pattern Circuit Breaker Pattern и его Java-реализация Hystrix . В какой-то момент Рауль Крипалани начал реализацию Hystrix в Camel и положил начало всей работе, но со временем она потеряла импульс. Затем, снова и снова видя один и тот же запрос от разных клиентов, я взял реле, продолжил работу и отправил в Camel компонент Hystrix. Видя обратную связь от сообщества, она все еще не была такой элегантной, как могла бы быть. Затем вступил Клаус и сделал Hystrix частью Camel DSL, превратив его в EIP (а не в компонент). Так как же теперь создать прерыватель цепи на базе Hystrix в Camel?

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
public class ClientRoute extends RouteBuilder {
 
    @Override
    public void configure() {
        from("timer:trigger?period=1s")
            .log(" Client request: ${body}")
            .hystrix()
                .to("http://localhost:9090/service1")
            // use onFallback() to provide a repsonse message immediately: .transform().simple("Fallback ${body}")
            // use onFallbackViaNetwork() when there is a 2nd service call
            .onFallbackViaNetwork()
                .to("http://localhost:7070/service2")
            .end()
            .log("Client response: ${body}");
    }
}

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

На основании этого примера вы можете подумать, что Hystrix является частью ядра Camel, но это не так. Ядро верблюда по-прежнему остается таким легким и не зависит от сторонних библиотек. Если вы хотите использовать прерыватель цепи на основе Hystrix, вам нужно добавить зависимость Camel-Hystrix в ваши зависимости, как это делается с любым другим неосновным компонентом, и сделать его доступным во время выполнения.

Fail Fast, Fallback, Bulkhead, Timeout и многое другое

Библиотека Hystrix реализует больше, чем просто схема прерывателя цепи. Он также выполняет перебор, кэширование запросов, тайм-ауты, свертывание запросов и т. Д. Реализация в Camel не поддерживает свертывание и кеширование запросов, поскольку они выполняются с использованием других шаблонов и компонентов, уже доступных в Camel. Свертывание запросов в Camel может быть выполнено с использованием Aggregator EIP, а кэширование — с использованием таких компонентов кэша, как Redis, Inifinspan, Hazelcast и т. Д. Hystrix DSL в Camel предлагает около 30 вариантов конфигурации, поддерживаемых Hystrix, а также предоставляет метрики для JMX и / или ОТДЫХ для панели инструментов Hystrix .

Hystrix-веб-консоли

В заключение, не забывайте, что для создания действительно эластичного приложения вам нужно больше, чем Hystrix. Hystrix будет выполнять переборку на уровне пула потоков, но этого недостаточно, если вы не применяете тот же принцип на уровне процессов, хостов и физических компьютеров. Чтобы создать упругую распределенную систему, вам понадобятся также Retry, Throttling, Timeout… и другие хорошие примеры, некоторые из которых я описал в книге «Шаблоны проектирования Camel».

Чтобы получить представление о новом шаблоне, посмотрите пример и начните защищать свои микросервисы на базе Camel с помощью Hystrix.