Как контейнерировать приложение Spring Data Cassandra

1656544570 kak kontejnerirovat prilozhenie spring data cassandra

Даниель Ньютон

1*3DebQtXUVpccosiYyNJ3HQ
Skyline Гонконге от skeeze

В этой публикации я продолжу путь изучения Docker. Я все еще держу это просто. В этот раз я собираюсь заняться превращением программы Spring и Cassandra на использование контейнеров вместо локального запуска на хост-машине. Вернее, использование Spring Data Cassandra для разбора программы.

Я хотел бы, чтобы я посмотрел, как это сделать некоторое время назад. Я написал немало постов о Кассандре. Каждый раз приходилось cd к нужному каталогу или иметь ярлык для его запуска. Я предполагаю, что это не такое уж большое дело, но было еще несколько вещей, таких как удаление и воспроизведение пробелов ключей, чтобы я мог проверить свою программу с нуля. Теперь я удаляю контейнер и перезапускаю его. Во всяком случае, мне это полезно!

Эта публикация будет отличаться от моей предыдущей публикации об использовании Docker для загрузки существующей программы в контейнеры. Вместо этого я больше сосредоточусь здесь на стороне программы и исключу промежуточные шаги использования только Docker. Я перейду прямо к Docker Compose.

Контейнеры, контейнеры, контейнеры

Я думаю, что лучше всего начать с контейнерной стороны проекта. Приложение зависит от конфигурации контейнера Cassandra.

Пойдем!

Здесь мало что происходит. Это Dockerfile создает образ программы Spring, который будет помещен в контейнер через несколько моментов.

Дальше следует docker-compose файл. Это создаст как приложение Spring, так и контейнеры Cassandra:

Опять же здесь не слишком много. The app контейнер создает приложение Spring с помощью файла Dockerfile определены раньше. The cassandra контейнер же полагается на существующее изображение с соответствующим названием cassandra.

Одно, что выделяется, это то, что restart свойство установлено на always. Это была моя ленивая попытка преодолеть, сколько времени нужно Кассандре, чтобы начать. Плюс все контейнеры начали с docker-compose начать одновременно. Это приводит к ситуации, когда приложение пытается подключиться к Cassandra, не будучи готовой. К сожалению, это приводит к гибели программы. Я надеялся, что у него будет встроенная возможность повторных попыток для начального подключения… Но это не так.

Когда мы ознакомимся с кодом, мы увидим, как работать с начальным подключением Cassandra программно, вместо того чтобы полагаться на то, что программа умирает и перезапускается несколько раз. Вы все равно увидите мою версию обработки подключения. Я не большой поклонник своего решения, но все остальное, что я пробовал, причинило мне гораздо больше боли.

Тире кода

Я сказал, что эта публикация будет сосредоточена больше на коде программы и будет. Мы не собираемся погружаться во все, что я вкладывал в это приложение, и как пользоваться Cassandra. Чтобы получить такую ​​информацию, вы можете просмотреть мои старые сообщения, на которые я дам ссылку в конце. Однако мы рассмотрим конфигурационный код, который создает bean-компонент, подключаемый к Cassandra.

Сначала пройдемся ClusterConfig который создает кластер Cassandra:

Там не слишком много. Было бы еще меньше, если бы Spring повторил первоначальное подключение к Cassandra. Во всяком случае, давайте оставим эту часть на несколько минут и сосредоточимся на других моментах этого класса.

Первоначальная причина, которую я создал ClusterConfig было создать пространство ключей, которое будет использовать программа. Сделать это, getKeyspaceCreations было отклонено. Когда программа подключается, она выполнит запрос, указанный в этом методе, чтобы создать пространство ключей.

Если это не требовалось и пространство ключей было создано другим способом, например, сценарием, выполняемым как часть создания контейнера Cassandra, вместо этого можно было бы полагаться на автоматическую конфигурацию Spring Boot. Это фактически позволяет настроить всю программу по свойствам, определенным в application.properties и ничего другого. К сожалению, это не было задумано.

Поскольку мы определили an AbstractClusterConfiguration, Spring Boot выключит его конфигурацию в этой области. Поэтому нам необходимо определить contactPoints (Я назвал переменную hosts) вручную, переопределив getContactPoints метод. Сначала это было определено только в application.properties. Я понял, что мне нужно внести это изменение, когда я начал получать такую ​​ошибку:

All host(s) tried for query failed (tried: localhost/127.0.0.1:9042 (com.datastax.driver.core.exceptions.TransportException: [localhost/127.0.0.1:9042] Cannot connect))

До того, как я создал ClusterConfig адрес был cassandra а не localhost.

Никаких других свойств для кластера настраивать не нужно. Значения по умолчанию Spring достаточно хороши для этого сценария.

я упомянул application.properties Так многое на этом этапе, я, пожалуй, должен показать вам, что в нем.

keyspace-name и contact-points уже появились, поскольку они связаны с настройкой кластера. schema-action необходим для создания таблиц на основе сущностей в проекте. Нам больше ничего делать здесь не нужно, потому что в этой области все еще работает автоматическая конфигурация.

Тот факт, что contact-points установлено значение cassandra очень важно. Это доменное имя происходит от имени данного контейнера, в этом случае, cassandra. Поэтому или cassandra может использоваться или фактический IP-адрес контейнера. Доменное имя, безусловно, проще, поскольку оно всегда будет статическим между развертываниями. Чтобы проверить эту теорию, можно изменить название cassandra контейнер ко всему, что вы хотите. Он все равно будет подключаться, если вы измените его в application.properties так же.

Вернуться к ClusterConfig код. Вернее, то cluster фасоль. Я снова вставил код ниже, чтобы его было легче просмотреть:

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

То, что я сделал, на самом деле достаточно просто, но сам код не очень хорош. The cluster метод является копией переопределенной версии с AbstractClusterConfigurationза исключением RetryingCassandraClusterFactoryBean (мой собственный класс). Первоначальная функция использовалась a CassandraClusterFactoryBean (весенний класс).

Ниже приведено RetryingCassandraClusterFactoryBean:

The afterPropertiesSet метод в оригинале CassandraClusterFactoryBean принимает свои значения и создает представление кластера Cassandra, наконец-то делегируя драйвер Java Datastax (как я уже упоминал в этом сообщении). Если ему не удастся установить соединение, будет создано исключение. Если исключение не будет перехвачено, это приведет к завершению работы программы. В этом суть приведенного выше кода. Оно оборачивает afterPropertiesSet в блоке try-catch, определенном для исключений, которые могут быть вызваны.

The sleep добавлено, чтобы дать Кассандре некоторое время для фактического запуска. Нет смысла сразу пытаться восстановить соединение, если предыдущая попытка была неудачной.

Используя этот код, программа в конечном счете соединится с Cassandra.

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

mvn clean install && docker-compose up

затем создается образ программы Spring, и оба контейнера раскручиваются.

Вывод

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

Образ программы строится из кода проекта. Изображение Cassandra взято из Docker Hub. Название изображения cassandra просто чтоб никто не забыл.

В общем, соединить два контейнера вместе было относительно просто. Программа нуждалась в некоторых настройках, чтобы разрешить повторные попытки при подключении к Cassandra, работающему в другом контейнере. Это сделало код немного уродливее, но он по крайней мере работает.

Благодаря коду, написанному в этой публикации, теперь у меня есть еще одна программа, которую мне не нужно настраивать на собственной машине.

Код, использованный в этой публикации, можно найти на моем GitHub.

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

Вау, я не сознавал, что написал столько постов о Кассандре.

Мнения и мнения, изложенные в моих публикациях, являются моими собственными и не представляют мнения Accenture на какую-либо тему. Посмотреть все сообщения Дена Ньютона

Первоначально опубликовано на lankydanblog.com 8 сентября 2018 года.

Добавить комментарий

Ваш адрес email не будет опубликован.