1. Обзор
В этой статье мы рассмотрим основы интеграции DynamoDB в приложение Spring Boot с практическим примером проекта.
Мы продемонстрируем, как настроить приложение для использования локального экземпляра DynamoDB с использованием данных Spring. Мы также создадим пример модели данных и класса репозитория, а также выполним фактические операции с базой данных с помощью интеграционного теста.
2. DynamoDB
DynamoDB-это полностью управляемая размещенная база данных NoSQL на AWS, аналогичная другим базам данных NoSQL, таким как Cassandra или MongoDB. DynamoDB обеспечивает быструю, стабильную и предсказуемую производительность и масштабируемость.
Вы можете узнать больше о DynamoDB в документации AWS .
Давайте установим локальный экземпляр DynamoDB , чтобы избежать затрат на запуск живого экземпляра.
Для разработки локальный запуск DynamoDB имеет больше смысла, чем запуск на AWS; локальный экземпляр будет запускаться как исполняемый файл JAR.
Вы можете найти инструкции о том, как запустить DynamoDB локально здесь .
3. Зависимости Maven
Добавьте следующие зависимости, чтобы начать работу с DynamoDB с использованием данных Spring:
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=http://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 будет использовать аннотации, аналогичные тем, которые используются в Hibernate, для определения имени таблицы, атрибутов, ключей и других аспектов таблицы.
5.1. Атрибуты модели данных
Следующий класс, ProductInfo , представляет таблицу с элементами, содержащими 3 атрибута:
- ИДЕНТИФИКАТОР
- MSRP
- Стоимость
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=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)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 .