Перейти к основному содержимому

Представляем КиваКит

· 10 мин. чтения

1. Обзор

KivaKit — это модульная платформа приложений Java, предназначенная для ускорения и упрощения разработки микросервисов и приложений. KivaKit разрабатывается в Telenav с 2011 года. Теперь он доступен как проект с открытым исходным кодом под лицензией Apache на GitHub .

В этой статье мы рассмотрим дизайн KivaKit как набора «мини-фреймворков», которые работают вместе. Кроме того, мы рассмотрим основные функции каждого мини-фреймворка.

2. Мини-фреймворки KivaKit

Заглянув в репозитории kivakit и kivakit-extensions , мы увидим, что KivaKit 1.0 содержит 54 модуля. Мы могли найти это ошеломляющим. Однако, если мы будем действовать шаг за шагом, это не так уж и плохо. Для начала мы можем выбирать, что мы хотим включить в наши проекты. Каждый модуль KivaKit предназначен для самостоятельного использования.

Некоторые модули KivaKit содержат мини-фреймворки. Мини-фреймворк — это простой абстрактный дизайн, предназначенный для решения общей проблемы. Если мы изучим мини-фреймворки KivaKit, мы обнаружим, что они имеют простые, широко применимые интерфейсы. В результате они немного похожи на Lego™. То есть это простые кусочки, которые соединяются вместе.

Здесь мы можем увидеть мини-фреймворки KivaKit и то, как они соотносятся друг с другом:

./c2a229f0d75e2281dc8329da2d4fbe1e.svg

      | Мини-фреймворк    | Модуль    | Описание   | 
| Заявление | [kivakit-приложение](https://github.com/Telenav/kivakit/tree/1.0.0/kivakit-application) | Базовые компоненты для приложений и серверов |
| Анализ командной строки | [kivakit-командная строка](https://github.com/Telenav/kivakit/tree/1.0.0/kivakit-commandline) | Анализ переключателей и аргументов с использованием мини-фреймворков преобразования и проверки |
| Составная часть | [kivakit-компонент](https://github.com/Telenav/kivakit/tree/1.0.0/kivakit-component) | Базовый функционал для реализации компонентов KivaKit, включая приложения |
| Преобразование | [kivakit-kernel](https://github.com/Telenav/kivakit/tree/1.0.0/kivakit-kernel) | Абстракция для реализации надежных модульных преобразователей типов. |
| Добыча | [kivakit-kernel](https://github.com/Telenav/kivakit/tree/1.0.0/kivakit-kernel) | Извлечение объектов из источника данных |
| Интерфейсы | [kivakit-kernel](https://github.com/Telenav/kivakit/tree/1.0.0/kivakit-kernel) | Общие интерфейсы, используемые в качестве точек интеграции между платформами |
| логирование | [kivakit-kernel ](https://github.com/Telenav/kivakit/tree/1.0.0/kivakit-kernel)

kivakit-логи-* | Основные функции ведения журналов, интерфейс поставщика службы журналов (SPI) и реализации журналов | | Обмен сообщениями | kivakit-kernel | Позволяет компонентам передавать и получать информацию о состоянии | | Миксины | kivakit-kernel | Реализация свойств с состоянием | | Ресурс | kivakit-resource

kivakit-network-*

kivakit-filesystems-* | Абстракции для файлов, папок и потоковых ресурсов | | Поиск сервисов | kivakit-конфигурация | Реализация шаблона локатора сервисов для поиска информации о компонентах и настройках . | | Настройки | kivakit-конфигурация | Обеспечивает легкий доступ к информации о конфигурации компонентов | | Проверка | kivakit-kernel | Базовый функционал для проверки непротиворечивости объектов |

Мы можем найти эти фреймворки в репозитории kivakit . С другой стороны, мы найдем менее важные модули, такие как сервис-провайдеры в kivakit-extensions .

2.1. Обмен сообщениями

Как показано на диаграмме выше, обмен сообщениями является центральной точкой интеграции. В KivaKit обмен сообщениями формализует отчеты о состоянии . Как Java-программисты, мы привыкли регистрировать информацию о состоянии. Иногда мы также видим, что эта информация возвращается вызывающим объектам или генерируется как исключение. Напротив, информация о состоянии в KivaKit содержится в сообщениях . Мы можем написать компоненты, которые транслируют эти сообщения. Кроме того, мы можем написать компоненты, которые слушают их.

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

Компоненты KivaKit, которые транслируют сообщения, могут быть подключены к одному или нескольким повторителям сообщений , образуя цепочку слушателей:

./d1dbb40df38ed1c01dab2e4f9256f7b5.svg

В KivaKit Приложение обычно является концом цепочки слушателей. Поэтому класс Application регистрирует все получаемые им сообщения. Попутно компоненты в цепочке слушателей могут иметь другое применение для этих сообщений.

2.2. Миксины

Еще одной особенностью интеграции KivaKit является мини-фреймворк mixins. Миксины KivaKit позволяют «смешивать» базовые классы с типами посредством наследования интерфейса. Иногда примеси известны как « свойства с отслеживанием состояния ».

Например, класс BaseComponent в KivaKit обеспечивает основу для создания компонентов. BaseComponent предоставляет удобные методы для отправки сообщений. Кроме того, он предлагает легкий доступ к ресурсам, настройкам и зарегистрированным объектам.

Но мы быстро сталкиваемся с проблемой с этим дизайном. Как мы знаем, в Java класс, у которого уже есть базовый класс, не может также расширять BaseComponent . Миксины KivaKit позволяют добавлять функциональность BaseComponent к компоненту, у которого уже есть базовый класс. Например:

public class MyComponent extends MyBaseClass implements ComponentMixin { [...] }

Здесь мы видим, что интерфейс ComponentMixin расширяет как Mixin , так и Component :

./44df9f88794c584131d9dd7cd2acb31f.svg

Интерфейс Mixin предоставляет метод state() для ComponentMixin. Во-первых, этот метод используется для создания и связывания BaseComponent с объектом, реализующим ComponentMixin . Во- вторых, ComponentMixin реализует каждый метод интерфейса Component как метод Java по умолчанию. В-третьих, каждый метод по умолчанию делегирует связанному с ним компоненту BaseComponent. Таким образом, реализация ComponentMixin предоставляет те же методы, что и расширение BaseComponent .

2.3. Поиск сервисов

Класс Registry локатора сервисов позволяет нам связывать компоненты вместе . Реестр обеспечивает примерно ту же функциональность, что и внедрение зависимостей (DI). Однако он отличается от типичного использования DI одним важным моментом. В шаблоне локатора сервисов компоненты обращаются к нужным им интерфейсам. С другой стороны, DI помещает интерфейсы в компоненты. В результате подход на основе локатора сервисов улучшает инкапсуляцию. Это также уменьшает объем ссылок. Например, Registry можно аккуратно использовать внутри метода:

class MyData extends BaseComponent {

[...]

public void save() {
var database = require(Database.class);
database.save(this);
}
}

Базовый компонент . Здесь метод require(Class) ищет объекты в реестре. Когда наш метод save() возвращается, ссылка на базу данных выходит из области видимости. Это гарантирует, что никакой внешний код не сможет получить нашу ссылку.

Когда наше приложение запускается, мы можем зарегистрировать объекты службы с помощью одного из компонентов BaseComponent . Методы регистрацииОбъекта() . Позже код в другом месте нашего приложения может найти их с помощью require(Class) .

2.4. Ресурсы и файловые системы

Модуль kivakit-resource предоставляет абстракции для чтения и записи потоковых ресурсов и доступа к файловым системам. Здесь мы видим несколько наиболее важных типов ресурсов, которые включает в себя KivaKit:

  • Файлы (локальные, Zip, S3 и HDFS)
  • Пакет ресурсов
  • Сетевые протоколы (сокеты, HTTP, HTTPS и FTP)
  • Входные и выходные потоки

Мы получаем два ценных преимущества от этой абстракции. Мы можем:

2.5. Составные части

Модуль kivakit-component дает нам свободный доступ к общему функционалу. Мы можем:

  • Отправка и получение сообщений
  • Доступ к пакетам и упакованным ресурсам
  • Регистрация и поиск объектов, компонентов и настроек

Интерфейс Component реализуется как BaseComponent , так и ComponentMixin. В результате мы можем добавить «природу компонентов» к любому объекту.

2.6. логирование

Цепочки слушателей, образованные компонентами KivaKit , часто заканчиваются регистратором. Logger записывает полученные сообщения в один или несколько журналов . Кроме того, модуль kivakit-kernel предоставляет интерфейс поставщика услуг (SPI) для реализации Log s. Мы можем увидеть полный дизайн мини-фреймворка ведения журнала в UML здесь .

Используя SPI ведения журнала, репозиторий kivakit-extensions предоставляет нам некоторые реализации журнала :

      | Провайдер    | Модуль   | 
| Журнал консоли | [kivakit-kernel](https://github.com/Telenav/kivakit/tree/1.0.0/kivakit-kernel) |
| ФайлЖурнал | [kivakit-лог-файл](https://github.com/Telenav/kivakit-extensions/tree/1.0.0/kivakit-logs/file) |
| Электронная почтаЖурнал | [kivakit-журналы-электронная почта](https://github.com/Telenav/kivakit-extensions/tree/1.0.0/kivakit-logs/email) |

Один или несколько журналов можно выбрать и настроить из командной строки. Это делается путем определения системного свойства KIVAKIT_LOG .

2.7. Преобразование и проверка

Модуль kivakit-kernel содержит мини-фреймворки для преобразования типов и проверки объектов . Эти фреймворки интегрированы с обменом сообщениями KivaKit. Это позволяет им последовательно сообщать о проблемах. Это также упрощает использование. Чтобы реализовать преобразователь типа, такой как StringConverter , нам нужно написать код преобразования. Нам не нужно беспокоиться об исключениях, пустых строках или нулевых значениях.

./b1bc30c69431528258963e7c5ebf5c72.svg

Мы можем видеть конвертеры, используемые во многих местах KivaKit, в том числе:

  • Разбор переключателей и аргументов
  • Загрузка объектов настроек из файлов свойств
  • Форматирование объектов как строк отладки
  • Чтение объектов из файлов CSV

Сообщения, передаваемые Validatable s, перехватываются мини-платформой проверки. Впоследствии они анализируются, чтобы предоставить нам легкий доступ к статистике ошибок и проблемам проверки.

./4c8df83907ea5372975b6b1d7d3b3c0b.svg

2.8. Приложения, командные строки и настройки

Модули kivakit-application , kivakit-configuration и kivakit-commandline обеспечивают простую и согласованную модель разработки приложений.

Проект kivakit-application предоставляет базовый класс Application . Приложение — это компонент . Он предоставляет информацию о настройках с помощью kivakit-configuration . Кроме того, он обеспечивает синтаксический анализ командной строки с помощью kivakit-commandline .

Проект kivakit-configuration использует модуль kivakit-resource для загрузки информации о настройках из ресурсов .properties (и других источников в будущем). Он преобразует свойства этих ресурсов в объекты с помощью конвертеров kivakit-kernel . Преобразованные объекты затем проверяются с помощью мини-фреймворка проверки .

Аргументы и переключатели командной строки для приложения анализируются модулем kivakit- commandline с использованием преобразователей и валидаторов KivaKit. Мы можем видеть проблемы, возникающие в ConsoleLog приложения .

./f4feda7cc16fc2652794323f1c8038fd.svg

2.9. Микросервисы

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

Проект kivakit-web содержит модули для быстрой разработки простого REST и веб-интерфейса к микросервису. Класс JettyServer предоставляет нам возможность подключать сервлеты и фильтры с минимальными трудностями. Плагины, которые мы можем использовать с JettyServer, включают:

      | Плагин    | Описание   | 
| Причал Джерси | Поддержка REST-приложений |
| Причал | Swagger автоматическая документация REST |
| Причал | Поддержка веб-фреймворка Apache Wicket. |

Эти плагины можно комбинировать, чтобы предоставить микросервис RESTful с документацией Swagger и веб-интерфейсом:

var application = new MyRestApplication();
listenTo(new JettyServer())
.port(8080)
.add("/*", new JettyWicket(MyWebApplication.class))
.add("/open-api/*", new JettySwaggerOpenApi(application))
.add("/docs/*", new JettySwaggerIndex(port))
.add("/webapp/*", new JettySwaggerStaticResources())
.add("/webjar/*", new JettySwaggerWebJar(application))
.add("/*", new JettyJersey(application))
.start();

KivaKit 1.1 будет включать специальную мини-инфраструктуру микросервисов. Это еще больше упростит нам создание микросервисов.

3. Документация и Lexakai

Документация для KivaKit создается Lexakai. Lexakai создает диаграммы UML (при необходимости с аннотациями) и обновляет файлы уценки README.md. В файле readme для каждого проекта Lexakai обновляет стандартный верхний и нижний колонтитулы. Кроме того, он поддерживает индексы для сгенерированных диаграмм UML и документации Javadoc. Lexakai — это проект с открытым исходным кодом, распространяемый по лицензии Apache.

4. Сборка KivaKit

KivaKit нацелен на виртуальную машину Java 11 или выше (но может использоваться из исходного кода Java 8) . Все артефакты для модулей KivaKit мы можем найти на Maven Central . Однако мы можем захотеть изменить KivaKit или внести свой вклад в проект с открытым исходным кодом. В этом случае нам нужно его построить.

Для начала настроим Git, Git Flow , Java 16 JDK и Maven 3.8.1 или выше .

Во-первых, мы клонируем репозиторий kivakit в нашу рабочую область:

mkdir ~/Workspace
cd ~/Workspace
git clone --branch develop https://github.com/Telenav/kivakit.git

Затем мы копируем образец профиля bash в нашу домашнюю папку:

cp kivakit/setup/profile ~/.profile

Затем мы модифицируем ~/.profile, чтобы он указывал на нашу рабочую область и наши установки Java и Maven:

export KIVAKIT_WORKSPACE=$HOME/Workspace 
export JAVA_HOME=/Library/Java/JavaVirtualMachines/temurin-16.jdk/Contents/Home
export M2_HOME=$HOME/Developer/apache-maven-3.8.2

После того, как наш профиль настроен, мы гарантируем, что у нас запущен bash (в macOS теперь по умолчанию используется zsh ):

chsh -s /bin/bash

И, наконец, перезапускаем нашу терминальную программу и выполняем команду:

$KIVAKIT_HOME/setup/setup.sh

Сценарий установки клонирует kivakit-extensions и некоторые другие связанные репозитории. После этого он инициализирует git-flow и соберет все наши проекты KivaKit.

5. Вывод

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