DynamoDB trong ứng dụng khởi động mùa xuân sử dụng dữ liệu mùa xuân

1. Khái quát chung

Trong bài viết này, chúng ta sẽ khám phá những điều cơ bản về việc tích hợp DynamoDB vào Ứng dụng khởi động mùa xuân với một dự án ví dụ thực tế.

Chúng tôi sẽ trình bày cách cấu hình ứng dụng để sử dụng phiên bản DynamoDB cục bộ bằng cách sử dụng Spring Data. Chúng tôi cũng sẽ tạo một mô hình dữ liệu mẫu và lớp kho lưu trữ cũng như thực hiện các hoạt động cơ sở dữ liệu thực tế bằng cách sử dụng kiểm tra tích hợp.

2. DynamoDB

DynamoDB là cơ sở dữ liệu NoSQL được lưu trữ được quản lý hoàn toàn trên AWS, tương tự như các cơ sở dữ liệu NoSQL khác như Cassandra hoặc MongoDB. DynamoDB cung cấp hiệu suất nhanh, nhất quán và có thể dự đoán được và có thể mở rộng quy mô lớn.

Bạn có thể tìm hiểu thêm về DynamoDB trên Tài liệu AWS.

Hãy cài đặt một phiên bản cục bộ của DynamoDB để tránh phát sinh chi phí chạy một phiên bản trực tiếp.

Để phát triển, chạy DynamoDB cục bộ có ý nghĩa hơn chạy trên AWS; phiên bản cục bộ sẽ được chạy dưới dạng tệp JAR thực thi.

Bạn có thể tìm thấy hướng dẫn về cách chạy DynamoDB cục bộ tại đây.

3. Sự phụ thuộc của Maven

Thêm các phần phụ thuộc sau để bắt đầu làm việc với DynamoDB bằng cách sử dụng Dữ liệu mùa xuân:

  • Dữ liệu mùa xuân JPA
  • AWS Java SDK DynamoDB
  • Mô-đun cộng đồng DynamoDB dữ liệu mùa xuân
   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   

Xem Chuyến tàu phát hành dữ liệu mùa xuân, AWS Java SDK cho Amazon DynamoDB và Spring Data DynamoDB để biết các phiên bản mới nhất ở trên.

4. Cấu hình

Tiếp theo, hãy xác định các thuộc tính sau trong tệp application.properties :

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

Các khóa truy cập và khóa bí mật được liệt kê ở trên chỉ là các giá trị tùy ý cho cấu hình cục bộ của bạn. Khi truy cập một phiên bản cục bộ của DynamoDB, các trường này cần được điền bởi một số giá trị nhưng không cần thiết để thực sự xác thực.

Các thuộc tính sẽ được tự động kéo ra khỏi tệp application.properties trong cấu hình 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. Mô hình Dữ liệu

Bây giờ hãy tạo một mô hình POJO để đại diện cho dữ liệu được lưu trữ trong DynamoDB.

POJO này sẽ sử dụng các chú thích tương tự như các chú thích được sử dụng trong Hibernate để xác định tên bảng, thuộc tính, khóa và các khía cạnh khác của bảng.

5.1. Thuộc tính mô hình dữ liệu

Lớp sau đây, ProductInfo , đại diện cho một bảng có các mục chứa 3 thuộc tính:

  1. TÔI
  2. MSRP
  3. Giá cả

5.2 Lớp mô hình dữ liệu Java

Hãy tạo một tệp có tên ProductInfo.java trong thư mục mô hình dữ liệu của bạn:

@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. Kho lưu trữ CRUD

Tiếp theo, chúng ta cần tạo một giao diện ProductRepository để xác định chức năng CRUD mà chúng ta muốn xây dựng. Các kho lưu trữ được sử dụng để đọc và lưu giữ dữ liệu đến và đi từ DynamoDB sẽ triển khai giao diện này:

@EnableScan public interface ProductInfoRepository extends CrudRepository { Optional findById(String id); } 

7. Kiểm tra tích hợp

Tiếp theo, hãy tạo một bài kiểm tra tích hợp để đảm bảo chúng ta có thể kết nối thành công với phiên bản cục bộ của DynamoDB:

@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = Application.class) @WebAppConfiguration @ActiveProfiles("local") @TestPropertySource(properties = { "amazon.dynamodb.endpoint=//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. Kết luận

Và chúng ta đã hoàn tất - bây giờ chúng ta có thể kết nối với DynamoDB từ Ứng dụng khởi động mùa xuân .

Tất nhiên, sau khi hoàn thành thử nghiệm cục bộ, chúng tôi sẽ có thể sử dụng một cách minh bạch phiên bản trực tiếp của DynamoDB trên AWS và chạy mã đã triển khai chỉ với những thay đổi cấu hình nhỏ.

Như mọi khi, ví dụ được sử dụng trong bài viết này có sẵn dưới dạng một dự án mẫu trên GitHub.