DynamoDB в приложении Spring Boot с использованием данных Spring
1. обзор
В этой статьеwe’ll explore the basics of integrating DynamoDB into a Spring Boot Application с практическим примером проекта.
Мы покажем, как настроить приложение для использования локального экземпляра DynamoDB с использованием Spring Data. Мы также создадим пример модели данных и класс репозитория, а также выполним фактические операции с базой данных с помощью интеграционного теста.
2. DynamoDB
DynamoDB - это полностью управляемая размещенная база данных NoSQL на AWS, аналогичная другим базам данных NoSQL, таким как Cassandra или MongoDB. DynamoDB предлагает быструю, последовательную и предсказуемую производительность и масштабируемость.
Вы можете узнать больше о DynamoDB наAWS Documentation.
Давайте установимa local instance of DynamoDB, чтобы избежать затрат на запуск действующего экземпляра.
Для разработки локальное использование DynamoDB более целесообразно, чем на AWS; локальный экземпляр будет запущен как исполняемый файл JAR.
Вы можете найти инструкции о том, какrun DynamoDB locally here.
3. Maven Зависимости
Добавьте следующие зависимости, чтобы начать работу с DynamoDB с использованием Spring Data:
org.springframework.data
spring-data-releasetrain
Hopper-SR10
pom
import
com.amazonaws
aws-java-sdk-dynamodb
1.11.34
com.github.derjust
spring-data-dynamodb
4.3.1
4. конфигурация
Затем давайте определим следующие свойства в файлеapplication.properties:
amazon.dynamodb.endpoint=http://localhost:8000/
amazon.aws.accesskey=key
amazon.aws.secretkey=key2
Перечисленные выше ключи доступа и секретные ключи являются просто произвольными значениями для вашей локальной конфигурации. При доступе к локальному экземпляру DynamoDB эти поля должны быть заполнены некоторыми значениями, но не нужны для фактической аутентификации.
Свойства будут динамически извлечены из файлаapplication.properties вthe Spring config:
@Configuration
@EnableDynamoDBRepositories
(basePackages = "com.example.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 атрибута:
-
ID
-
MSRP
-
Cost
5.2 Java Data Model Class
Давайте создадим файл с именем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 {
List 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 sampleTestCase() {
ProductInfo dave = new ProductInfo(EXPECTED_COST, EXPECTED_PRICE);
ProductInfoRepository.save(dave);
List result
= (List) repository.findAll();
assertTrue("Not empty", result.size() > 0);
assertTrue("Contains item with expected cost",
result.get(0).getCost().equals(EXPECTED_COST));
}
}
8. Заключение
И мы закончили - теперь мы можемconnect to DynamoDB from a Spring Boot Application.
Конечно, после локального тестирования мы должны иметь возможность прозрачно использовать работающий экземпляр DynamoDB в AWS и запускать развернутый код с незначительными изменениями конфигурации.
Как всегда, пример, использованный в этой статье, доступен как образец проектаover on GitHub.