Курсовая работа на тему: "Разработка библиотеки для динамической конфигурации промышленных Java-приложений"

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

Но если вдруг:

Вам нужна качественная учебная работа (контрольная, реферат, курсовая, дипломная, отчет по практике, перевод, эссе, РГР, ВКР, диссертация, шпоры...) с проверкой на плагиат (с высоким % оригинальности) выполненная в самые короткие сроки, с гарантией и бесплатными доработками до самой сдачи/защиты - ОБРАЩАЙТЕСЬ!

Курсовая работа на тему: 

"Разработка библиотеки для динамической конфигурации промышленных Java-приложений"

Оглавление

Введение                                                                                                        3

1.      Постановка задачи                                                                              4

2.      Обзор существующих решений                                                        5

3.      Описание реализации                                                                          7

3.1.        Реактиное программирование .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .        7

3.2.      Выбор языка для реализации  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .        8

3.3.  Архитектура   .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . . .        8

3.4.  Источники конфигурации  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .      10

4.      Заключение                                                                                          11

Список литературы                                                                                 12

Введение

Окружающая среда адаптируется к изменениям, вносимым челове- ком. Программа меняет своё поведения с изменением своих парамет- ров. В первом случае нет необходимости останавливать течение време- ни, чтобы изменения вступили в силу. Поэтому естественно желание, меняя параметры программы, видеть изменения в приложении без его перезапуска, особенно если к приложению предъявляются особые тре- бования в отношении его доступности.

В то же время с каждым годом сложность разработки программных продуктов возрастает, возрастает и количество сторонних сущностей, с которыми приложение взаимодействует (базы данных, HTTP Services и т.д.), в частности существует тренд на использование микросервисов, и большая часть архитектурных проблем перекладывается на инфра- структуру, связь с которой требует конфигурации.

Поэтому, когда речь заходит о крупных проектах, неудивительна необходимость конфигурировать большое количество параметров (раз- личные ссылки, бизнес-логика и прочее). Часть таких параметров под- вергается изменениям редко, но часть может потребоваться изменять часто (например, при A/Бтестировании).

Цель данной курсовой работы — разработка библиотеки для дина- мической конфигурации. Работа возникла из желания компании DSX Technologies иметь более простой и функциональный инструмент кон- фигурации промышленных Java-приложений.

1.       Постановка задачи

Целью данной работы является создание библиотеки для динами- ческой конфигурации промышленных Java-приложений. Для её дости- жения были поставлены следующие задачи:

    Провести исследование предметной области и сделать обзор суще- ствующих решений

    Спроектировать и реализовать механизмы для динамической кон- фигурации Java-приложений

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

2.       Обзор существующих решений

В мире Java существует множество библиотек для конфигурации приложений. Основными факторами для включения в данный обзор являются наличие поддержки перезагрузкиконфигурации во время ра- боты приложения и отсутствие сторонней специфичной функциональ- ности (например, инъекция зависимостей и поддержка IoC в Spring1).

1.     Cfg4j [1]. Одно из последних решений в данной области. Поддер- живает Consul, Git repos (*.yaml, *.properties), различные  фай- лы. Библиотека, в которой функциональность динамической пе- резагрузки планировалась изначально, но ввиду особенностей ар- хитектуры (не изменения распространяются в конфигурируемые объекты, а те обращаются в конфигурационное хранилище) появ- ляется проблема с конфигурированием параметров, от которых зависят нетривиальные объекты или ресурсоёмкие вычисления [10].

2.   Apache Commons Configuration [2]. Библиотека поддерживает мно- жество форматов файлов (*.ini, *.properties, *.xml ...) и JDBCDatasource, обеспечивает типизированный доступ к параметрам (с одним или несколькими значениями), но возможность переза- грузки во время работы программы добавлялась не сразу, поэто- му механизм получился громоздкий: три интерфейса, реализован- ные только для файлов, довольно сложный контракт их взаимо- действия [3, 10]. Проблема с конфигурированием нетривиальных сущностей также присутствует.

3.  

ReactiveConfig [10]. Осенью 2018 года на конференции Joker был представлен доклад о библиотеке конфигурации ReactiveConfig, написанной на Scala для компании Tinkoff. В ней присутствует динамическая перезагрузка, валидация значений, также архитек- тура хороша для перезагрузки ресурсоёмких вычислений и слож- ных сущностей, но данной библиотеки нет в открытом доступе и,

1https://spring.io

так как она разрабатывалась под проекты на Scala, использовать её при работе с другими языками JVM может быть затруднитель- но.

 

 

Рис. 1: Сравнительная таблица существующих решений

 

Таким образом, ни одно из решений не подходит для удобной конфи- гурации промышленных Java-приложений во время их работы, в част- ности, в Cfg4j и Apache Commons Configuration затруднено конфигури- рование сложных сущностей и параметров, изменение которых влечет ресурсоёмкие вычисления, а библиотека ReactiveConfig, помимо того, что отсутствует в открытом доступе, не приспособлена для приложе- ний, написанных на Java.

Поэтому и было принято решение отказаться от интеграции одного из существующих решений и разработать новую библиотеку для дина- мической конфигурации в рамках данной курсовой работы.

3.       Описание реализации

В данном разделе описывается реализация библиотеки и рассказы- вается о концепциях, лежащих в её основе. Исходный код проекта опуб- ликован на хостинге GitHub2.

 

3.1.      Реактиное программирование

Во время работы приложения невозможно определить наперёд, ко- гда произойдут изменения конфигурационных параметров. Также объ- екты, зависящие от конфигурации, в процессеработы должны реагиро- вать на эти изменения. Поэтому события изменения конфигурационных параметров и обработки этих изменений асинхронны, а изменения кон- фигурации естественнымобразом представляются в виде асинхронного потока данных3.

Таким образом, для задачи обработки изменений логично рассмат- ривать подходы, работающие с асинхронными потоками данных и спо- собные доставлять изменения до зависимых объектов. Именно таким подходом являются реактивное программирование4 [11, 9] и использо- вание имеющихся реализаций [5, 6] стандарта Reactive Streams [8].

Благодаря реактивному программированию, при котором измене- ния конфигурации — это реактивный поток, распространяющийся в зависимые от конфигурации объекты, появляется возможность сделать библиотеку конфигурации с акцентом на перезагрузке (например, долж- на присутствовать адекватная перезагрузка конфигурации нетривиаль- ных сущностей), что явялется особенностью всравнении с ныне доступ- ными решениями.

2https://github.com/dsx-tech/rhea

3Под асинхронным потокам данных понимается поток, в который значения попадают одно за другим с произвольной временной задержкой между значениями

4Реактивное программирование — парадигма программирования, ориентированная на потоки дан- ных и распространение изменений

3.2.      Выбор языка для реализации

Так как речь идёт о конфигурации Java-приложений, выбор основ- ного языка программирования был между языками Java и Kotlin. Глав- ный критерий для сравнения — реактивныевозможности. Рассматрива- лись стандартные реализации реактивных потоков в обоих язык [5, 6], но принимая во внимание желание использовать библиотеку в том чис- ле и для приложений, написанных на 8 версии Java, реализация стан- дарта Reactive Streams в Java оказалась неподходящей, потому что по- явилась только в 9 версии. Поэтому оставались варианты использова- ния либо сторонней библиотеки RxJava5, либо Kotlin Flow [5]. Вместе  с Дмитрием Вологиным, студентом СПбГУ 2 курса, были опробованы  в работе оба варианта, и принято решение использовать Kotlin Flow: данная реализация примитивнее и в то же время её реактивной функ- циональности достаточно для решения поставленной задачи, к тому же Kotlin очень лаконичныйязык и позволяет строить удобные DSL.

 

3.3.      Архитектура

На Рис. 2 представлена диаграмма, описывающая архитектуру биб- лиотеки. Основа архитектуры — асинхронные потоки данных: измене- ния, асинхронные события, из источников конфигурации распростра- няются в конфигурируемые объекты. Проект разбит на модули: ядро и реализации интерфейса ConfigSource для некоторых источников. Моду- ли, отвечающие заинтеграцию источников, подключаются опциональ- но, поэтому нет избыточных зависимостей.

Главные элементы ядра: интерфейс ConfigSource, классы Reloadable и ReactiveConfig. Cозданный объект ReactiveConfig отвечает за неко- торые конфигурационные параметры приложения. В нем содержится канал, принимающий изменения параметров от подписанных на него источников конфигурации. Чтобы зарегистрировать параметр необхо- димо указать его ключ и тип — объект PropertyType. PropertyType со- держит в себе значение по умолчанию и функцию, с помощью которой

5https://github.com/ReactiveX/RxJava

 

 

 

Рис. 2: UML диаграмма основных классов и модулей разработанной библиотеки

происходит разбор значения, пришедшего из источника. Реализованы стандартные типы параметров (stringType, intType и др.), также мож- но добавлять свои типы, имеющие более сложную структуру. Выглядит объявление перезагружаемого параметра так:

Reloadable<Integer> port = config.get(”port”, PropertyTypesKt.intType);

 

При создании начальное значение параметра запрашивается у источ- ника, что позволяет использовать созданный Reloadable без ожидания его полной инициализации. Reloadable содержит всебе реактивный по- ток, в котором находятся изменения конкретного параметра, за счет чего появляется возможность при обращении выдавать самое «свежее» значение параметра,«пробрасывать» изменения дальше, в созависимые сущности, а также реализовывать нетривиальную логику обработки из- менений.

3.4.      Источники конфигурации

С помощью реализации интерфейса ConfigSource можно добавлять свои источники конфигурации.

В рамках данной работы в качестве источников конфигурируемых параметров были добавлены файлы типа *.properties, *.yaml, *.json. Для отслеживания изменений используется WatchService API [7], со- бытия которого определяют, когда перечитывать файл, обновлять зна- чения и пересылать их дальше, в конфигурируемые объекты.

Также, помимо поддержки конфигурации из файлов, реализована интеграция сервиса Vault [4]. В промышленных приложениях, чтобы минимизировать риски безопасности, возникает потребность хранить секреты (это могут быть пароли, ключи шифрования, сертификаты и т.д). Vault занимается защитой такой информации и контролем доступа к ней. Секреты хранятся в виде ключ-значение. Доступ к хранилищу осуществляется исключительно через API. В качестве непосредствен- ного хранилища зашифрованных данных можно выбрать один из уже поддерживаемых вариантов (например, Consul, MySQL, S3), либо ин- тегрировать что-то своё.

4.       Заключение

В ходе выполнения работы получены следующие результаты:

    Сделан обзор предметной области и существующих решений

    Реализована библиотека динамической конфигурации

    Поддержана возможность использования различных источников конфигурации

Список литературы

[1]     Cfg4j.   Cfg4j. –     URL: http://www.cfg4j.org/ (online; accessed: 08.12.2019).

[2]    Foundation  The  Apache  Software.  Commons Configuration. –   URL: https://commons.apache.org/proper/commons-configuration/ (online; accessed: 08.12.2019).

[3]    Foundation  The  Apache  Software.  Commons Configuration. –   URL: https://commons.apache.org/proper/commons-configuration/ userguide/howto_reloading.html (online; accessed: 18.12.2019).

[4]    HashiCorp.  Vault. –   URL: https://www.vaultproject.io (online; accessed: 15.05.2020).

[5]    Kotlin.     Flow. –         URL:     https://kotlin.github.io/kotlinx. coroutines/kotlinx-coroutines-core/kotlinx.coroutines. flow/-flow (online; accessed: 10.12.2019).

[6]    Oracle.    Flow    //    Java™   Platform    Standard    Ed.    9. –       URL: https://docs.oracle.com/javase/9/docs/api/java/util/ concurrent/Flow.html (online; accessed: 10.12.2019).

[7]    Oracle.  WatchService. –   URL: https://docs.oracle.com/javase/ tutorial/essential/io/index.html (online;accessed: 16.05.2020).

[8]   Reactive  Streams. –     URL: https://www.reactive-streams.org/

(online; accessed: 10.12.2019).

[9]    Staltz Andre. Reactive programming // Github. URL: https:// gist.github.com/staltz/868e7e9bc2a7b8c1f754 (online; accessed: 10.12.2019).

[10]     Tinkoff.    ReactiveConfig    //    Joker. –       2018. –       URL:    https:

//www.youtube.com/watch?v=uU1DHBEFVP4&list=PLVe-2wcL84b_ DvLWtURPD0Dz2NZil55XI&index=40(дата обращения: 08.12.2019).

[11]      Wikipedia. Reactive programming // Wikipedia. URL: https:// en.wikipedia.org/wiki/Reactive_programming (online; accessed: 10.12.2019).