Лучшие практики для хранения конфигурации в Java

1

Я разрабатываю java-библиотеку, которая вызывает HTTP-скрипт на одном из нескольких серверов для обработки данных. Основная функциональность работает нормально, и теперь я изучаю проблемы конфигурации.

Библиотеке требуется несколько информации (URL, Username, Password,...) сервера, и если соединение не удастся, ему нужно получить другую, пока она не получит ответ (простая высокая доступность). И может быть несколько разных серверов (т.е. Для стандартных и высокоприоритетных запросов). Возможно, даже порядок серверов может быть рандомизирован для балансировки нагрузки. И в будущем мы можем захотеть внедрить в этот механизм некоторый мониторинг состояния сервера.

Я должен добавить, что я новичок в java, поэтому мои идеи могут быть предвзятыми к решениям с других языков. Моя первая идея состояла в том, чтобы создать класс для хранения конфигурации одного сервера, а затем какой-то менеджер конфигурации, который был бы итерируемым (он вернул бы итератор, итерации по конфигурациям сервера) и сериализуемый. Таким образом, библиотека могла бы получать итератор и перебирать серверы до тех пор, пока не получит действительный ответ (или не закончит работу с серверами). И пользователи нашего класса могут использовать любой механизм для хранения необходимой им конфигурации.

Я попытался реализовать это, и у меня возникли некоторые вопросы:

  • Как итератор должен обращаться к данным диспетчера конфигурации - самим конфигурациям сервера и любым другим данным, которые могут иметь отношение к итерации? Должен ли менеджер конфигурации "отображать" какой-то простой список при создании итератора? Или должны ли внутренние поля управления конфигурацией доступа итератора? Или должен ли ConfigurationManager быть самим итератором?

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

Является ли это жизнеспособным подходом или я должен использовать какую-либо библиотеку (Commons configuration или Java Properties)?

Теги:
iterator
serialization
configuration

2 ответа

1
Лучший ответ

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

HashMap работает с парами ключ-значение. (например, key = "password" и value = "secret")

Из того, что вы описали, у вас есть набор известных параметров, которые вы хотите сохранить, поэтому при загрузке HashMap вы можете искать значения с помощью ключа, это быстро. Вам не нужно будет повторять. Но вы можете перебирать HashMap, если вам нужно.

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

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

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

  • 0
    Я, вероятно, не сказал это достаточно ясно. Итерация завершена на нескольких конфигурациях. Допустим, у меня есть 3 сервера, которые могут предоставить услугу, и мне нужно хранить URL + имя пользователя + пароль для каждого. Таким образом, у меня будет 3 экземпляра класса конфигурации, и «рабочему» классу необходимо выполнить итерации по этим конфигурациям в случае сбоя соединения.
  • 0
    Я понимаю, я добавил параграф о нескольких конфигурациях, хранящихся в ArrayList.
Показать ещё 4 комментария
1

У меня, вероятно, будет служба конфигурации.

public interface ConfigurationService {
    Iterable<Configuration> getAllConfigurations();
    Configuration getConfiguration(String id);
    void saveConfiguration(Configuration config);
}

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

  • 0
    Это хорошая идея, как сохранить его возможность обновления в будущем, но он не отвечает на вопрос, как реализовать предложенный ConfigurationService сейчас.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню