Курсовая работа на тему: "Разработка библиотеки для динамической конфигурации промышленных Java-приложений"
У нас на сайте представлено огромное количество информации, которая сможет помочь Вам в написании необходимой учебной работы.
Но если вдруг:
Вам нужна качественная учебная работа (контрольная, реферат, курсовая, дипломная, отчет по практике, перевод, эссе, РГР, ВКР, диссертация, шпоры...) с проверкой на плагиат (с высоким % оригинальности) выполненная в самые короткие сроки, с гарантией и бесплатными доработками до самой сдачи/защиты - ОБРАЩАЙТЕСЬ!
Курсовая работа на тему:
"Разработка библиотеки для динамической конфигурации промышленных Java-приложений"
Оглавление
Введение 3
1. Постановка задачи 4
2. Обзор существующих решений 5
3. Описание реализации 7
3.1. Реактиное программирование . . . . . . . . . . . . . . . . 7
3.2. Выбор языка для реализации . . . . . . . . . . . . . . . . 8
3.3. Архитектура . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.4. Источники конфигурации . . . . . . . . . . . . . . . . . . 10
4. Заключение 11
Введение
Окружающая среда адаптируется к изменениям, вносимым челове- ком. Программа меняет своё поведения с изменением своих парамет- ров. В первом случае нет необходимости останавливать течение време- ни, чтобы изменения вступили в силу. Поэтому естественно желание, меняя параметры программы, видеть изменения в приложении без его перезапуска, особенно если к приложению предъявляются особые тре- бования в отношении его доступности.
В то же время с каждым годом сложность разработки программных продуктов возрастает, возрастает и количество сторонних сущностей, с которыми приложение взаимодействует (базы данных, 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. В ней присутствует динамическая перезагрузка, валидация значений, также архитек- тура хороша для перезагрузки ресурсоёмких вычислений и слож- ных сущностей, но данной библиотеки нет в открытом доступе и,
так как она разрабатывалась под проекты на 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 со- держит в себе значение по умолчанию и функцию, с помощью которой
Рис. 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).