javascript
带有AWS DynamoDB的反应式Spring Webflux
AWS已經(jīng)發(fā)布了Java版本2的AWS開發(fā)工具包 ,該開發(fā)工具包現(xiàn)在支持針對(duì)不同AWS服務(wù)的API調(diào)用的非阻塞IO。 在本文中,我將探討如何使用AWS開發(fā)工具包2.x的DynamoDB API以及如何使用Spring Webflux堆棧公開響應(yīng)式端點(diǎn)-這種方式,應(yīng)用程序是端對(duì)端響應(yīng)式的,大概應(yīng)該非常有效地使用資源(我有計(jì)劃在此設(shè)置上做一些測(cè)試作為后續(xù)步驟)。
申請(qǐng)?jiān)斍?/h3>
簡(jiǎn)單地看一下代碼并在那兒跟隨它可能會(huì)更容易-在我的GitHub存儲(chǔ)庫(kù)中可以找到它。
該應(yīng)用程序很簡(jiǎn)單-使用以下Kotlin代碼對(duì)酒店實(shí)體執(zhí)行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 )我想公開端點(diǎn)以保存和檢索酒店實(shí)體,并按州獲取酒店列表。
AWS開發(fā)工具包2的詳細(xì)信息
AWS SDK 2 api的所有軟件包名稱現(xiàn)在都以“ software.amazon.awssdk”前綴開頭,使用以下代碼創(chuàng)建與DynamoDB進(jìn)行交互的客戶端:
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider import software.amazon.awssdk.regions.Region import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClientval client: DynamoDbAsyncClient = DynamoDbAsyncClient.builder().region(Region.of(dynamoProperties.region)).credentialsProvider(DefaultCredentialsProvider.builder().build()).build()創(chuàng)建DynamoDbAsyncClient實(shí)例后,使用此客戶端的任何操作都將返回Java 8 CompletableFuture類型。 例如。 保存酒店實(shí)體時(shí):
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提供了一組全面的功能,以在可用時(shí)轉(zhuǎn)換結(jié)果。
與Spring Webflux集成
Spring Webflux是一個(gè)反應(yīng)式Web框架。 現(xiàn)在,借助AWS開發(fā)工具包2中的非阻塞IO支持,可以使用DynamoDB編寫端到端的響應(yīng)式和非阻塞應(yīng)用程序。 Spring Webflux使用反應(yīng)堆核心提供反應(yīng)流支持,與AWS開發(fā)工具包2集成的技巧是將Java 8 CompletableFuture轉(zhuǎn)換為反應(yīng)堆核心類型,方法是通過ID從DynamoDB檢索項(xiàng)目時(shí)采用以下方式:
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終結(jié)點(diǎn)方法簽名的返回類型為響應(yīng)類型,因此,用于說(shuō)出酒店列表的典型終結(jié)點(diǎn)如下:
@RequestMapping(value = ["/hotels"], method = [RequestMethod.GET]) fun getHotelsByState(@RequestParam("state") state: String): Flux<Hotel> {return hotelRepo.findHotelsByState(state) }Spring Webflux還支持描述應(yīng)用程序API的功能性方法,因此,一個(gè)等效的API可通過其ID檢索酒店,但表示為功能性DSL,如下所示:
@Configuration class HotelAdditionalRoutes {@Beanfun 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())}} }結(jié)論
AWS SDK 2使編寫端到端反應(yīng)性和非阻塞應(yīng)用程序變得簡(jiǎn)單。 我已使用Spring Webflux和AWS開發(fā)工具包2發(fā)電機(jī)客戶端在此處編寫此類應(yīng)用程序。 整個(gè)工作示例可在我的GitHub存儲(chǔ)庫(kù)中找到-https ://github.com/bijukunjummen/boot-with-dynamodb,其中包含有關(guān)如何啟動(dòng)DynamoDB本地版本并將其用于測(cè)試應(yīng)用程序的說(shuō)明。
翻譯自: https://www.javacodegeeks.com/2018/12/reactive-spring-webflux-aws-dynamodb.html
總結(jié)
以上是生活随笔為你收集整理的带有AWS DynamoDB的反应式Spring Webflux的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网工路由基础(3)RIP原理与配置
- 下一篇: java pojo使用_在POJO中使用