Рубрики
Без рубрики

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

Пошаговое руководство по интеграции DynamoDB в приложение Spring Boot с использованием Spring Data DynamoDB.

Автор оригинала: baeldung.

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 атрибута:

  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=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 .