aws dynamodb_带有AWS DynamoDB的React式Spring Webflux

aws dynamodb

AWS已经发布了Java版本2的AWS开发工具包 ,该开发工具包现在支持针对不同AWS服务的API调用的非阻塞IO。 在本文中,我将探讨如何使用AWS开发工具包2.x的DynamoDB API以及如何使用Spring Webflux堆栈公开响应式端点-这种方式,应用程序是端对端响应式的,大概应该非常有效地使用资源(我有计划在此设置上做一些测试作为后续步骤)。

申请详情

简单地看一下代码并在那儿遵循它可能会更容易-在我的GitHub存储库中可以找到它。

该应用程序很简单-可以对使用以下Kotlin代码表示的酒店实体执行CRUD操作:

data class Hotel(
        val id: String = UUID.randomUUID().toString(),
        val name: String? = null,
        val address: String? = null,
        val state: String? = null,
        val zip: String? = null
)

我想公开端点以保存和检索酒店实体,并按州获取酒店列表。

AWS开发工具包2的详细信息

AWS SDK 2 api的所有软件包名称现在都以“ software.amazon.awssdk”前缀开头,使用以下几行代码创建与DynamoDB进行交互的客户端:

import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider
import software.amazon.awssdk.regions.Region
import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient

val client: DynamoDbAsyncClient = DynamoDbAsyncClient.builder()
        .region(Region.of(dynamoProperties.region))
        .credentialsProvider(DefaultCredentialsProvider.builder().build())
        .build()

创建DynamoDbAsyncClient实例后,使用此客户端的任何操作都将返回Java 8 CompletableFuture类型。 例如。 保存酒店实体时:

val putItemRequest = PutItemRequest.builder()
        .tableName("hotels")
        .item(HotelMapper.toMap(hotel))
        .build()
        
val result: CompletableFuture<PutItemResponse> =
        dynamoClient.putItem(putItemRequest)

并通过ID检索记录:

val getItemRequest: GetItemRequest = GetItemRequest.builder()
        .key(mapOf(Constants.ID to AttributeValue.builder().s(id).build()))
        .tableName(Constants.TABLE_NAME)
        .build()

val response: CompletableFuture<GetItemResponse> = dynamoClient.getItem(getItemRequest)

CompletableFuture提供了一组全面的功能,以在可用时转换结果。

与Spring Webflux集成

Spring Webflux是一个React式Web框架。 现在,借助AWS开发工具包2中的非阻塞IO支持,可以使用DynamoDB编写端到端的响应式和非阻塞应用程序。 Spring Webflux使用React堆核心提供React流支持,与AWS开发工具包2集成的技巧是将Java 8 CompletableFuture转换为React堆核心类型,方法是通过id从DynamoDB检索项目时采用以下方式:

val getItemRequest: GetItemRequest = GetItemRequest.builder()
        .key(mapOf(Constants.ID to AttributeValue.builder().s(id).build()))
        .tableName(Constants.TABLE_NAME)
        .build()

return Mono.fromCompletionStage(dynamoClient.getItem(getItemRequest))
        .map { resp ->
            HotelMapper.fromMap(id, resp.item())
        }

Spring Webflux期望不同Web终结点方法签名的返回类型为响应类型,因此,用于说出酒店列表的典型终结点如下:

@RequestMapping(value = ["/hotels"], method = [RequestMethod.GET])
fun getHotelsByState(@RequestParam("state") state: String): Flux<Hotel> {
    return hotelRepo.findHotelsByState(state)
}

Spring Webflux还支持一种描述应用程序API的功能性方法,因此,一个等效的API可通过其ID来检索酒店,但表示为功能性DSL如下:

@Configuration
class HotelAdditionalRoutes {

    @Bean
    fun routes(hotelRepo: HotelRepo) = router {
        GET("/hotels/{id}") { req ->
            val id = req.pathVariable("id")
            val response: Mono<ServerResponse> = hotelRepo.getHotel(id)
                    .flatMap { hotel ->
                        ServerResponse.ok().body(BodyInserters.fromObject(hotel))
                    }
            response.switchIfEmpty(ServerResponse.notFound().build())
        }
    }
}

结论

AWS SDK 2使编写端到端的React性和非阻塞性应用程序变得简单。 我已经使用Spring Webflux和AWS SDK 2发电机客户端在此处编写了这样的应用程序。 完整的工作示例可在我的GitHub存储库找到-https ://github.com/bijukunjummen/boot-with-dynamodb,其中包含有关如何启动DynamoDB本地版本并将其用于测试应用程序的说明。

翻译自: https://www.javacodegeeks.com/2018/12/reactive-spring-webflux-aws-dynamodb.html

aws dynamodb

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值