Я разрабатываю java-библиотеку, которая вызывает HTTP-скрипт на одном из нескольких серверов для обработки данных. Основная функциональность работает нормально, и теперь я изучаю проблемы конфигурации.
Библиотеке требуется несколько информации (URL, Username, Password,...) сервера, и если соединение не удастся, ему нужно получить другую, пока она не получит ответ (простая высокая доступность). И может быть несколько разных серверов (т.е. Для стандартных и высокоприоритетных запросов). Возможно, даже порядок серверов может быть рандомизирован для балансировки нагрузки. И в будущем мы можем захотеть внедрить в этот механизм некоторый мониторинг состояния сервера.
Я должен добавить, что я новичок в java, поэтому мои идеи могут быть предвзятыми к решениям с других языков. Моя первая идея состояла в том, чтобы создать класс для хранения конфигурации одного сервера, а затем какой-то менеджер конфигурации, который был бы итерируемым (он вернул бы итератор, итерации по конфигурациям сервера) и сериализуемый. Таким образом, библиотека могла бы получать итератор и перебирать серверы до тех пор, пока не получит действительный ответ (или не закончит работу с серверами). И пользователи нашего класса могут использовать любой механизм для хранения необходимой им конфигурации.
Я попытался реализовать это, и у меня возникли некоторые вопросы:
Как итератор должен обращаться к данным диспетчера конфигурации - самим конфигурациям сервера и любым другим данным, которые могут иметь отношение к итерации? Должен ли менеджер конфигурации "отображать" какой-то простой список при создании итератора? Или должны ли внутренние поля управления конфигурацией доступа итератора? Или должен ли ConfigurationManager быть самим итератором?
Есть ли способ продлить сериализацию класса, если ему нужно будет использовать поля, которые не являются сериализуемыми (вероятно, это не произойдет, но я хочу быть готовым, если это так)
Является ли это жизнеспособным подходом или я должен использовать какую-либо библиотеку (Commons configuration или Java Properties)?
Для одного приложения HashMap является сериализуемым и может быть сохранен в файл, а затем прочитан позже. Вам не нужно сохранять весь ваш класс, просто HashMap. Ваш класс все еще может управлять HashMap.
HashMap работает с парами ключ-значение. (например, key = "password" и value = "secret")
Из того, что вы описали, у вас есть набор известных параметров, которые вы хотите сохранить, поэтому при загрузке HashMap вы можете искать значения с помощью ключа, это быстро. Вам не нужно будет повторять. Но вы можете перебирать HashMap, если вам нужно.
Для хранения конфигураций для нескольких систем у вас может быть коллекция (например, ArrayList) HashMaps. ArrayList также сериализуется, поэтому вы можете записать весь список в файл и получить его, и его очень просто выполнить итерацию.
Чтобы иметь индивидуальный способ упорядочивания выбранных вами вариантов, приоритетная очередь с помощью специализированного компаратора позволяет это. Если вы хотите рандомизировать метод выбора, я думаю, для этого потребуется создание параллельных очередей приоритетов, относящихся к одному и тому же контенту, но каждый из которых имеет разные методы компаратора, а затем случайным образом выбирает, какую очередь читать. Я думаю по строкам таблицы базы данных с несколькими индексами. У вас есть тот же набор строк, но в зависимости от того, какой индекс вы выберете, вы можете пересечь их по-разному.
Если вы думаете о конфигурации, разделяемой несколькими системами, вы, вероятно, захотите сохранить свою конфигурацию в базе данных, но похоже, что это не так.
У меня, вероятно, будет служба конфигурации.
public interface ConfigurationService {
Iterable<Configuration> getAllConfigurations();
Configuration getConfiguration(String id);
void saveConfiguration(Configuration config);
}
Затем вы можете делать все, что захотите, в будущем (файлы свойств, база данных, конфигурация пружин, кластеризация, тест и т.д.).