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

DynamoDB в приложении Spring Boot с использованием данных Spring

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

1. Обзор

В этой статье мы рассмотрим основы интеграции DynamoDB в приложение Spring Boot на практическом практическом примере проекта.

Мы покажем, как настроить приложение для использования локального экземпляра DynamoDB с помощью Spring Data. Мы также создадим пример модели данных и класса репозитория, а также выполним реальные операции с базой данных с помощью интеграционного теста.

2. ДинамоДБ

DynamoDB — это полностью управляемая база данных NoSQL, размещенная на AWS, похожая на другие базы данных NoSQL, такие как Cassandra или MongoDB. DynamoDB предлагает быструю, стабильную и предсказуемую производительность и масштабируемость.

Вы можете узнать больше о DynamoDB в документации AWS .

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

Для разработки локальный запуск DynamoDB имеет больше смысла, чем запуск на AWS; локальный экземпляр будет запущен как исполняемый файл JAR.

Инструкции по локальному запуску DynamoDB можно найти здесь .

3. Зависимости Maven

Добавьте следующие зависимости, чтобы начать работу с DynamoDB с использованием Spring Data:

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-releasetrain</artifactId>
<version>Lovelace-SR16</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-dynamodb</artifactId>
<version>1.11.64</version>
</dependency>
<dependency>
<groupId>com.github.derjust</groupId>
<artifactId>spring-data-dynamodb</artifactId>
<version>5.1.0</version>
</dependency>
</dependencies>

Проверьте Spring Data Release Train , AWS Java SDK для Amazon DynamoDB и Spring Data DynamoDB , чтобы узнать о последних версиях вышеперечисленного.

4. Конфигурация

Далее давайте определим следующие свойства в файле application.properties :

amazon.dynamodb.endpoint=http://localhost:8000/
amazon.aws.accesskey=key
amazon.aws.secretkey=key2

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

Свойства будут динамически извлекаться из файла application.properties в конфигурации Spring :

@Configuration
@EnableDynamoDBRepositories
(basePackages = "com.foreach.spring.data.dynamodb.repositories")
public class DynamoDBConfig {

@Value("${amazon.dynamodb.endpoint}")
private String amazonDynamoDBEndpoint;

@Value("${amazon.aws.accesskey}")
private String amazonAWSAccessKey;

@Value("${amazon.aws.secretkey}")
private String amazonAWSSecretKey;

@Bean
public AmazonDynamoDB amazonDynamoDB() {
AmazonDynamoDB amazonDynamoDB
= new AmazonDynamoDBClient(amazonAWSCredentials());

if (!StringUtils.isEmpty(amazonDynamoDBEndpoint)) {
amazonDynamoDB.setEndpoint(amazonDynamoDBEndpoint);
}

return amazonDynamoDB;
}

@Bean
public AWSCredentials amazonAWSCredentials() {
return new BasicAWSCredentials(
amazonAWSAccessKey, amazonAWSSecretKey);
}
}

5. Модель данных

Давайте теперь создадим модель POJO для представления данных, хранящихся в DynamoDB.

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

5.1. Атрибуты модели данных

Следующий класс ProductInfo представляет таблицу с элементами, которая содержит 3 атрибута:

  1. Я БЫ
  2. Рекомендуемая производителем розничная цена
  3. Расходы

5.2. Класс модели данных Java

Давайте создадим файл с именем ProductInfo.java в папке вашей модели данных:

@DynamoDBTable(tableName = "ProductInfo")
public class ProductInfo {
private String id;
private String msrp;
private String cost;

@DynamoDBHashKey
@DynamoDBAutoGeneratedKey
public String getId() {
return id;
}

@DynamoDBAttribute
public String getMsrp() {
return msrp;
}

@DynamoDBAttribute
public String getCost() {
return cost;
}

// standard setters/constructors
}

6. CRUD-репозиторий

Затем нам нужно создать интерфейс ProductRepository , чтобы определить функциональные возможности CRUD, которые мы хотим реализовать. Репозитории, используемые для чтения и сохранения данных в DynamoDB и из них, будут реализовывать этот интерфейс:

@EnableScan
public interface ProductInfoRepository extends
CrudRepository<ProductInfo, String> {

Optional<ProductInfo> findById(String id);
}

7. Интеграционный тест

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

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
@WebAppConfiguration
@ActiveProfiles("local")
@TestPropertySource(properties = {
"amazon.dynamodb.endpoint=http://localhost:8000/",
"amazon.aws.accesskey=test1",
"amazon.aws.secretkey=test231" })
public class ProductInfoRepositoryIntegrationTest {

private DynamoDBMapper dynamoDBMapper;

@Autowired
private AmazonDynamoDB amazonDynamoDB;

@Autowired
ProductInfoRepository repository;

private static final String EXPECTED_COST = "20";
private static final String EXPECTED_PRICE = "50";

@Before
public void setup() throws Exception {
dynamoDBMapper = new DynamoDBMapper(amazonDynamoDB);

CreateTableRequest tableRequest = dynamoDBMapper
.generateCreateTableRequest(ProductInfo.class);
tableRequest.setProvisionedThroughput(
new ProvisionedThroughput(1L, 1L));
amazonDynamoDB.createTable(tableRequest);

//...

dynamoDBMapper.batchDelete(
(List<ProductInfo>)repository.findAll());
}

@Test
public void givenItemWithExpectedCost_whenRunFindAll_thenItemIsFound() {
ProductInfo productInfo = new ProductInfo(EXPECTED_COST, EXPECTED_PRICE);
repository.save(productInfo);
List<ProductInfo> result = (List<ProductInfo>) repository.findAll();

assertThat(result.size(), is(greaterThan(0)));
assertThat(result.get(0).getCost(), is(equalTo(EXPECTED_COST)));
}
}

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

И мы закончили — теперь мы можем подключиться к DynamoDB из приложения Spring Boot .

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

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