Java >> Java tutorial >  >> Tag >> Spring

Forbind Spring Boot Application med AWS Dynamo DB

I dette indlæg viser jeg, hvordan vi kan forbinde Spring Boot Application med AWS Dynamo DB. Jeg vil også dække nogle grundlæggende elementer i AWS Dynamo DB, som er en No-SQL-database.

AWS Dynamo DB

Ifølge Amazon-dokumentation er Dynamo DB No-SQL nøgleværdi og dokumentdatabase. Vi har nogle alternativer som Cassandra (nøgleværdi) eller Mongo DB (dokument).

Dynamo DB tilbyder

  • pålidelig skalerbar ydeevne
  • en simpel API til at tillade adgang til nøgleværdi

Dynamo DB passer normalt godt til applikationer med følgende krav:

  1. En stor mængde data og forsinkelseskrav
  2. Datasæt til anbefalingssystemer
  3. Serverløs applikation med AWS Lambda

Nøglebegreber

Før vi kan bruge Dynamo DB, er det vigtigt at forstå nogle nøglebegreber om denne database.

  • Tabeller, elementer og attributter – Disse tre er de grundlæggende blokke i Dynamo DB. En tabel er en gruppering af dataposter. Et element er en enkelt datapost i en tabel. Fremover identificeres hvert element i en tabel ved hjælp af den primære nøgle. Attributter er stykker data i et enkelt element.
  • Dynamo DB-tabeller er skemaløse. Vi behøver dog kun at definere en primær nøgle ved oprettelse af tabellen. En simpel primær nøgle eller en sammensat primær nøgle er to typer primærnøgler.
  • Sekundære indekser – Nogle gange er primærnøgler ikke nok til at få adgang til data fra tabellen. Sekundære indekser muliggør yderligere adgangsmønstre fra Dynamo DB. Ikke desto mindre er der to typer indekser – lokale sekundære indekser og globale sekundære indekser . Et lokalt sekundært indeks bruger den samme partitionsnøgle som den underliggende tabel, men en anden sorteringsnøgle. Et globalt sekundært indeks bruger den anden partitionsnøgle og sorteringsnøgle fra den underliggende tabel.

Applikationer med Dynamo DB

Der er én forskel med Dynamo DB sammenlignet med andre SQL- eller NoSQL-databaser. Vi kan interagere med Dynamo DB gennem REST-opkald. Vi har ikke brug for JDBC-forbindelsesprotokoller, hvor applikationer skal opretholde ensartede forbindelser.

Der er to måder, vi kan forbinde applikationer med Dynamo DB på.

  1. Brug Spring Data Library med Dynamo DB
  2. Brug en AWS SDK leveret klient

Spring Boot Application

Som en del af denne demo vil vi oprette nogle datamodelklasser, der afbilder entitetsrelationer. Efterfølgende vil applikationen give en simpel REST API til crud-drift, og applikationen gemmer dataene i Dynamo DB.

Så lad os starte med at tilføje de nødvendige afhængigheder i vores applikation:


dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'io.github.boostchicken:spring-data-dynamodb:5.2.5'
	implementation 'junit:junit:4.13.1'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

Altså afhængigheden spring-data-dynamodb giver os mulighed for at repræsentere Dynamo DB-tabeller i modelklasser og oprette repositories til disse tabeller.

Vi vil oprette vores modelklasse Company som følger:


package com.betterjavacode.dynamodbdemo.models;

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAutoGeneratedKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;

@DynamoDBTable(tableName = "Company")
public class Company
{
    private String companyId;

    private String name;

    private String type;

    @DynamoDBHashKey(attributeName = "CompanyId")
    @DynamoDBAutoGeneratedKey
    public String getCompanyId ()
    {
        return companyId;
    }


    public void setCompanyId (String companyId)
    {
        this.companyId = companyId;
    }

    @DynamoDBAttribute(attributeName = "Name")
    public String getName ()
    {
        return name;
    }

    public void setName (String name)
    {
        this.name = name;
    }

    @DynamoDBAttribute(attributeName = "Type")
    public String getType ()
    {
        return type;
    }

    public void setType (String type)
    {
        this.type = type;
    }
}

Så denne klasse Company maps til Dynamo DB-tabellen af ​​samme navn. Annotationen DynamoDBTable hjælper os med denne kortlægning. Tilsvarende DynamoDBHashKey er denne tabels attributnøgle. DynamoDBAttribute er de andre attributter i denne tabel.

Vi vil oprette en REST-controller og en Service-klasse, der giver os mulighed for at kalde CRUD API'erne for dette objekt.


package com.betterjavacode.dynamodbdemo.controllers;

import com.betterjavacode.dynamodbdemo.models.Company;
import com.betterjavacode.dynamodbdemo.services.CompanyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("v1/betterjavacode/companies")
public class CompanyController
{
    @Autowired
    private CompanyService companyService;

    @GetMapping(value = "/{id}", produces = "application/json")
    public ResponseEntity getCompany(@PathVariable("id") String id)
    {

        Company company = companyService.getCompany(id);

        if(company == null)
        {
            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
        }
        else
        {
            return new ResponseEntity<>(company, HttpStatus.OK);
        }
    }

    @PostMapping()
    public Company createCompany(@RequestBody Company company)
    {
        Company companyCreated = companyService.createCompany(company);

        return company;
    }
}



Så vi har to metoder, en til at få virksomhedens data og en anden til at oprette virksomheden.


package com.betterjavacode.dynamodbdemo.services;

import com.betterjavacode.dynamodbdemo.models.Company;
import com.betterjavacode.dynamodbdemo.repositories.CompanyRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
public class CompanyService
{
    @Autowired
    private CompanyRepository companyRepository;

    public Company createCompany(final Company company)
    {
        Company createdCompany = companyRepository.save(company);
        return createdCompany;
    }

    public List getAllCompanies()
    {
        return (List) companyRepository.findAll();
    }

    public Company getCompany(String companyId)
    {
        Optional companyOptional = companyRepository.findById(companyId);

        if(companyOptional.isPresent())
        {
            return companyOptional.get();
        }
        else
        {
            return null;
        }
    }
}

Forbind Spring Boot Application med AWS Dynamo DB

Indtil videre har vi set oprettelse af nogle dele af applikationen. Men vi har stadig en vigtig del tilbage, og det er at forbinde vores applikation til AWS Dynamo DB-tjenesten i AWS.

Log ind på AWS-konsollen og få adgang til Dynamo DB.

Opret en ny tabel i Dynamo DB.

Forudsat at du vælger den primære nøgle som CompanyId , vi burde have det godt her. Husk, det er den partitionsnøgle, vi definerede i vores modelklasse.

Nu tilbage til Spring Boot Application. Opret en ny bønne ApplicationConfig for at definere Dynamo DB-konfiguration.


package com.betterjavacode.dynamodbdemo.config;

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import org.socialsignin.spring.data.dynamodb.repository.config.EnableDynamoDBRepositories;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableDynamoDBRepositories(basePackages = "com.betterjavacode.dynamodbdemo.repositories")
public class ApplicationConfig
{
    @Value("${amazon.aws.accesskey}")
    private String amazonAccessKey;

    @Value("${amazon.aws.secretkey}")
    private String amazonSecretKey;

    public AWSCredentialsProvider awsCredentialsProvider()
    {
        return new AWSStaticCredentialsProvider(amazonAWSCredentials());
    }

    @Bean
    public AWSCredentials amazonAWSCredentials()
    {
        return new BasicAWSCredentials(amazonAccessKey, amazonSecretKey);
    }

    @Bean
    public AmazonDynamoDB amazonDynamoDB()
    {
        return AmazonDynamoDBClientBuilder.standard().withCredentials(awsCredentialsProvider()).withRegion(Regions.US_EAST_1).build();
    }
}

Vi skal bestå accessKey og secretKey i application.properties . Det er vigtigt, at vi opretter en AmazonDynamoDB bønne her.

Lad os nu starte vores applikation, og vi vil se loggen, der viser, at den har oprettet en forbindelse med DynamoDB-tabellen Company .

Når applikationen er startet, får vi adgang til Postman for REST API.

Konklusion

Kode til denne demo er tilgængelig på mit github-lager.

I dette indlæg viste vi, hvordan vi kan bruge Dynamo DB – en No SQL-database i en Spring Boot-applikation.

  • Vi gennemgik Dynamo DB-koncepter.
  • Og vi oprettede en Spring Boot-applikation.
  • Vi oprettede en Dynamo DB-tabel i AWS.
  • Vi sluttede Spring Boot-applikationen til AWS Dynamo DB-tabellen.

Referencer

  • Dynamo DB-koncepter – Dynamo DB

Java tag