DynamoDB у програмі Spring Boot, що використовує дані Spring

1. Огляд

У цій статті ми вивчимо основи інтеграції DynamoDB у програму Spring Boot за допомогою практичного, практичного прикладу проекту.

Ми продемонструємо, як налаштувати програму для використання локального екземпляра DynamoDB за допомогою Spring Data. Ми також створимо приклад моделі даних та класу сховища, а також виконаємо фактичні операції з базами даних за допомогою інтеграційного тесту.

2. ДинамоДБ

DynamoDB - це повністю керована розміщена база даних NoSQL на AWS, подібна до інших баз даних NoSQL, таких як Cassandra або MongoDB. DynamoDB пропонує швидку, послідовну та передбачувану продуктивність і є масштабованою.

Ви можете дізнатись більше про DynamoDB у Документації AWS.

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

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

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

3. Залежності Мейвена

Додайте такі залежності, щоб розпочати роботу з DynamoDB за допомогою Spring Data:

  • Spring Data JPA
  • AWS Java SDK DynamoDB
  • Весняний модуль спільноти DynamoDB
   org.springframework.data spring-data-releasetrain Lovelace-SR16 pom import      com.amazonaws aws-java-sdk-dynamodb 1.11.64   com.github.derjust spring-data-dynamodb 5.1.0   

Ознайомтесь із Spring Data Release Train, AWS Java SDK для Amazon DynamoDB та Spring Data DynamoDB, щоб дізнатися про останні версії вищезазначеного.

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

Далі визначимо такі властивості у файлі application.properties :

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

Перелічені вище ключі доступу та секретні дані - це лише довільні значення для вашої локальної конфігурації. При доступі до локального екземпляра DynamoDB ці поля повинні бути заповнені деякими значеннями, але не потрібні для фактичної автентифікації.

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

@Configuration @EnableDynamoDBRepositories (basePackages = "com.baeldung.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 використовуватиме анотації, подібні до тих, що використовуються в режимі глибокого сну, для визначення імені таблиці, атрибутів, ключів та інших аспектів таблиці.

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

Наступний клас ProductInfo представляє таблицю з елементами, що містить 3 атрибути:

  1. Посвідчення особи
  2. MSRP
  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 { Optional findById(String id); } 

7. Інтеграційний тест

Далі створимо тест інтеграції, щоб переконатися, що ми можемо успішно підключитися до локального екземпляра DynamoDB:

@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = Application.class) @WebAppConfiguration @ActiveProfiles("local") @TestPropertySource(properties = { "amazon.dynamodb.endpoint=//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)repository.findAll()); } @Test public void givenItemWithExpectedCost_whenRunFindAll_thenItemIsFound() { ProductInfo productInfo = new ProductInfo(EXPECTED_COST, EXPECTED_PRICE); repository.save(productInfo); List result = (List) repository.findAll(); assertThat(result.size(), is(greaterThan(0))); assertThat(result.get(0).getCost(), is(equalTo(EXPECTED_COST))); } } 

8. Висновок

І ми закінчили - тепер ми можемо підключитися до DynamoDB із програми Spring Boot .

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

Як завжди, приклад, використаний у цій статті, доступний як зразок проекту на GitHub.