Перейти к основному содержимому

Подключение к базе данных NoSQL с помощью Spring Boot

· 7 мин. чтения

1. Обзор

В этом руководстве мы узнаем, как подключиться к базе данных NoSQL с помощью Sprint Boot. В нашей статье мы будем использовать DataStax Astra DB , DBaaS на базе Apache Cassandra , которая позволяет нам разрабатывать и развертывать приложения, управляемые данными, с помощью облачной службы.

Во-первых, мы начнем с рассмотрения того, как установить и настроить наше приложение с помощью Astra DB. Затем мы узнаем, как создать простое приложение с помощью Spring Boot .

2. Зависимости

Начнем с добавления зависимостей в наш pom.xml . Конечно, нам понадобится зависимость spring-boot-starter-data-cassandra :

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-cassandra</artifactId>
<version>2.6.3</version>
</dependency>

Далее мы добавим зависимость spring-boot-starter-web :

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.3</version>
</dependency>

Наконец, мы будем использовать Datastax astra-spring-boot-starter :

<dependency>
<groupId>com.datastax.astra</groupId>
<artifactId>astra-spring-boot-starter</artifactId>
<version>0.3.0</version>
</dependency>

Теперь, когда у нас настроены все необходимые зависимости, мы можем приступить к написанию нашего приложения Spring Boot.

3. Настройка базы данных

Прежде чем мы начнем определять наше приложение, важно быстро повторить, что DataStax Astra — это облачная база данных, работающая на базе Apache Cassandra . Это дает нам полностью размещенную, полностью управляемую базу данных Cassandra, которую мы можем использовать для хранения наших данных. Однако, как мы увидим, способ настройки и подключения к нашей базе данных имеет некоторые особенности.

Чтобы мы могли взаимодействовать с нашей базой данных, нам нужно настроить нашу базу данных Astra на хост-платформе. Затем нам нужно загрузить наш Secure Connect Bundle , который содержит сведения о сертификатах SSL и сведениях о соединении для этой точной базы данных, что позволяет нам безопасно подключаться.

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

4. Конфигурация приложения

Далее мы настроим простой основной класс для нашего приложения:

@SpringBootApplication
public class AstraDbSpringApplication {

public static void main(String[] args) {
SpringApplication.run(AstraDbSpringApplication.class, args);
}
}

Как мы видим, это заурядное приложение Spring Boot . Теперь давайте начнем заполнять наш файл application.properties :

astra.api.application-token=<token>
astra.api.database-id=<your_db_id>
astra.api.database-region=europe-west1

Это наши учетные данные Cassandra, и их можно взять непосредственно с панели управления Astra.

Чтобы использовать CQL через стандартный CqlSession , мы добавим еще пару свойств, включая расположение нашего загруженного пакета безопасного подключения:

astra.cql.enabled=true
astra.cql.downloadScb.path=~/.astra/secure-connect-shopping-list.zip

Наконец, мы добавим пару стандартных свойств Spring Data для работы с Cassandra :

spring.data.cassandra.keyspace=shopping_list
spring.data.cassandra.schema-action=CREATE_IF_NOT_EXISTS

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

5. Проверка нашего соединения

Теперь у нас есть все необходимое для проверки соединения с базой данных. Итак, давайте продолжим и определим простой REST-контроллер :

@RestController
public class AstraDbApiController {

@Autowired
private AstraClient astraClient;

@GetMapping("/ping")
public String ping() {
return astraClient.apiDevopsOrganizations()
.organizationId();
}

}

Как мы видим, мы создали простую конечную точку ping, используя класс AstraClient , который будет возвращать идентификатор организации нашей базы данных. Это класс-оболочка, входящий в состав Astra SDK, который мы можем использовать для взаимодействия с различными API-интерфейсами Astra .

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

mvn clean install spring-boot:run

Мы должны увидеть на нашей консоли соединение, установленное с нашей базой данных Astra:

...
13:08:00.656 [main] INFO c.d.stargate.sdk.StargateClient - + CqlSession :[ENABLED]
13:08:00.656 [main] INFO c.d.stargate.sdk.StargateClient - + API Cql :[ENABLED]
13:08:00.657 [main] INFO c.d.stargate.sdk.rest.ApiDataClient - + API Data :[ENABLED]
13:08:00.657 [main] INFO c.d.s.sdk.doc.ApiDocumentClient - + API Document :[ENABLED]
13:08:00.658 [main] INFO c.d.s.sdk.gql.ApiGraphQLClient - + API GraphQL :[ENABLED]
13:08:00.658 [main] INFO com.datastax.astra.sdk.AstraClient
- [AstraClient] has been initialized.
13:08:01.515 [main] INFO o.b.s.a.AstraDbSpringApplication
- Started AstraDbSpringApplication in 7.653 seconds (JVM running for 8.097)

Точно так же, если мы перейдем к нашей конечной точке в браузере или нажмем на нее с помощью curl, мы должны получить правильный ответ:

$ curl http://localhost:8080/ping; echo
d23bf54d-1bc2-4ab7-9bd9-2c628aa54e85

Большой! Теперь, когда у нас установлено соединение с базой данных и реализовано простое приложение с использованием Spring Boot, давайте посмотрим, как мы можем хранить и извлекать данные.

6. Работа с данными Spring

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

Основная цель абстракции репозитория Spring Data — значительно сократить объем шаблонного кода, необходимого для реализации нашего уровня доступа к данным, что поможет сделать наш пример действительно простым.

Для нашей модели данных мы определим одну сущность, представляющую простой список покупок :

@Table
public class ShoppingList {

@PrimaryKey
@CassandraType(type = Name.UUID)
private UUID uid = UUID.randomUUID();

private String title;
private boolean completed = false;

@Column
private List<String> items = new ArrayList<>();

// Standard Getters and Setters
}

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

Давайте теперь создадим ShoppingListRepository для использования в нашем приложении:

@Repository
public interface ShoppingListRepository extends CassandraRepository<ShoppingList, String> {

ShoppingList findByTitleAllIgnoreCase(String title);

}

Это соответствует стандартной абстракции репозитория Spring Data. Помимо унаследованных методов, содержащихся в интерфейсе CassandraRepository , таких как findAll , мы добавили дополнительный метод findByTitleAllIgnoreCase , который можно использовать для поиска списка покупок по названию.

Действительно, одно из реальных преимуществ использования Astra Spring Boot Starter заключается в том, что он создает для нас bean-компонент CqlSession , используя ранее определенные свойства.

7. Собираем все вместе

Теперь у нас есть наш репозиторий доступа к данным, давайте определим простую службу и контроллер:

@Service
public class ShoppingListService {

@Autowired
private ShoppingListRepository shoppingListRepository;

public List<ShoppingList> findAll() {
return shoppingListRepository.findAll(CassandraPageRequest.first(10)).toList();
}

public ShoppingList findByTitle(String title) {
return shoppingListRepository.findByTitleAllIgnoreCase(title);
}

@PostConstruct
public void insert() {
ShoppingList groceries = new ShoppingList("Groceries");
groceries.setItems(Arrays.asList("Bread", "Milk, Apples"));

ShoppingList pharmacy = new ShoppingList("Pharmacy");
pharmacy.setCompleted(true);
pharmacy.setItems(Arrays.asList("Nappies", "Suncream, Aspirin"));

shoppingListRepository.save(groceries);
shoppingListRepository.save(pharmacy);
}

}

Для целей нашего тестового приложения мы добавили аннотацию @PostContruct для вставки некоторых тестовых данных в нашу базу данных.

Для заключительной части головоломки мы добавим простой контроллер с одной конечной точкой для получения наших списков покупок:

@RestController
@RequestMapping(value = "/shopping")
public class ShoppingListController {

@Autowired
private ShoppingListService shoppingListService;

@GetMapping("/list")
public List<ShoppingList> findAll() {
return shoppingListService.findAll();
}
}

Теперь, когда мы запустим наше приложение и получим доступ к http://localhost:8080/shopping/list — мы увидим ответ JSON, содержащий различные объекты нашего списка покупок:

[
{
"uid": "363dba2e-17f3-4d01-a44f-a805f74fc43d",
"title": "Groceries",
"completed": false,
"items": [
"Bread",
"Milk, Apples"
]
},
{
"uid": "9c0f407e-5fc1-41ad-8e46-b3c115de9474",
"title": "Pharmacy",
"completed": true,
"items": [
"Nappies",
"Suncream, Aspirin"
]
}
]

Это подтверждает, что наше приложение работает правильно. Потрясающий!

8. Работа с шаблоном Cassandra

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

Проще говоря, мы можем довольно легко расширить наш AstraDbApiController , чтобы получить наш центр обработки данных:

@Autowired
private CassandraTemplate cassandraTemplate;

@GetMapping("/datacenter")
public String datacenter() {
return cassandraTemplate
.getCqlOperations()
.queryForObject("SELECT data_center FROM system.local", String.class);
}

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

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

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

Как всегда, полный исходный код статьи доступен на GitHub .