DynamoDB em um aplicativo de inicialização Spring usando dados do Spring

DynamoDB em um aplicativo de inicialização Spring usando dados do Spring

1. Visão geral

Neste artigo,we’ll explore the basics of integrating DynamoDB into a Spring Boot Application com um projeto prático de exemplo prático.

Demonstraremos como configurar um aplicativo para usar uma instância local do DynamoDB usando o Spring Data. Também criaremos um modelo de dados de exemplo e classe de repositório, bem como realizaremos operações reais de banco de dados usando um teste de integração.

2. DynamoDB

O DynamoDB é um banco de dados NoSQL hospedado totalmente gerenciado na AWS, semelhante a outros bancos de dados NoSQL, como Cassandra ou MongoDB. O DynamoDB oferece desempenho rápido, consistente e previsível e é massivamente escalável.

Você pode aprender mais sobre o DynamoDB emAWS Documentation.

Vamos instalara local instance of DynamoDB para evitar o custo de execução de uma instância ativa.

Para desenvolvimento, executar o DynamoDB localmente faz mais sentido do que executar na AWS; a instância local será executada como um arquivo JAR executável.

Você pode encontrar instruções sobre comorun DynamoDB locally here.

3. Dependências do Maven

Adicione as seguintes dependências para começar a trabalhar com o DynamoDB usando o 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. Configuração

A seguir, vamos definir as seguintes propriedades no arquivoapplication.properties:

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

O acesso e as chaves secretas listadas acima são apenas valores arbitrários para sua configuração local. Ao acessar uma instância local do DynamoDB, esses campos precisam ser preenchidos por alguns valores, mas não são necessários para a autenticação.

As propriedades serão retiradas dinamicamente do arquivoapplication.properties emthe 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. O Modelo de Dados

Vamos agora criar um modelo POJO para representar os dados armazenados no DynamoDB.

Este POJO usará anotações semelhantes às usadas no Hibernate para definir o nome da tabela, atributos, chaves e outros aspectos da tabela.

5.1. Atributos do modelo de dados

A seguinte classe,ProductInfo, representa uma tabela com itens que contém 3 atributos:

  1. ID

  2. MSRP

  3. Cost

5.2 Java Data Model Class

Vamos criar um arquivo chamadoProductInfo.java em sua pasta de modelo de dados:

@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. Repositório CRUD

Em seguida, precisamos criar uma interfaceProductRepository para definir a funcionalidade CRUD que queremos construir. Os repositórios usados ​​para ler e persistir dados de e para o DynamoDB implementarão esta interface:

@EnableScan
public interface ProductInfoRepository extends
  CrudRepository {

    List findById(String id);
}

7. Teste de integração

A seguir, vamos criar um teste de integração para garantir que podemos nos conectar com sucesso à instância local do 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. Conclusão

E pronto - agora podemosconnect to DynamoDB from a Spring Boot Application.

Obviamente, depois de concluir o teste localmente, poderemos usar de forma transparente uma instância ativa do DynamoDB na AWS e executar o código implantado com apenas pequenas alterações na configuração.

Como sempre, o exemplo usado neste artigo está disponível como um projeto de amostraover on GitHub.