SpringBoot集成Dynamo(3)集成远程dynamo

按照推荐的AWS IAM SSO模式,以文件存储凭证的方式,看下代码是如何访问的。

pom依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>dynamo-demo</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.4</version><relativePath/></parent><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><aws.sdk.version>2.20.4</aws.sdk.version> <!-- 请使用最新的 AWS SDK 版本 --><jackson.version>2.16.2</jackson.version></properties><repositories><repository><id>central</id><url>https://repo.maven.apache.org/maven2</url></repository></repositories><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- AWS SDK for DynamoDB --><dependency><groupId>software.amazon.awssdk</groupId><artifactId>dynamodb</artifactId><version>${aws.sdk.version}</version></dependency><dependency><groupId>software.amazon.awssdk</groupId><artifactId>dynamodb-enhanced</artifactId><version>${aws.sdk.version}</version></dependency><dependency><groupId>software.amazon.awssdk</groupId><artifactId>sts</artifactId><version>${aws.sdk.version}</version></dependency><dependency><groupId>software.amazon.awssdk</groupId><artifactId>ssooidc</artifactId><version>${aws.sdk.version}</version></dependency><!-- AWS SDK Core, 必须添加 --><dependency><groupId>software.amazon.awssdk</groupId><artifactId>aws-core</artifactId><version>${aws.sdk.version}</version></dependency><!-- AWS SDK for SSO (如果需要)--><dependency><groupId>software.amazon.awssdk</groupId><artifactId>sso</artifactId><version>${aws.sdk.version}</version></dependency><!-- Logging dependencies for AWS SDK --><dependency><groupId>software.amazon.awssdk</groupId><artifactId>apache-client</artifactId><version>${aws.sdk.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>${jackson.version}</version></dependency></dependencies>
</project>

在aws上建一个dynamo表:

一、配置文件法流程

1、IAM SSO凭证配置

cmd输入aws configure sso后按照提示一步步进行,最后生成了config和credentials文件。

config文件:

内容为:

[profile my-test]
sso_session = sso-dev
sso_account_id = ******
sso_role_name = xxxxxx
region = us-east-1
output = json
[sso-session sso-dev]
sso_start_url = https://xxx.xxx.xx
sso_region = us-east-1
sso_registration_scopes = sso:account:access

cmd输入aws cli某一个命令验证是否配置成功: 以下是获取所有表的命令

aws dynamodb list-tables --profile <your-profile-name>

如我输入:aws dynamodb list-tables --profile my-test 有内容输出,说明凭证配置成功了。

查看上面创建的表:(命令好像不对)

aws dynamodb describe-table --table-name <your-table-name> --profile <your-profile-name>

后面凭证过期了,再输入aws sso login --profile my-test 再次登录即可。 

2、编码
(1)config
package com.demo.dynamo.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import software.amazon.awssdk.auth.credentials.*;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;@Configuration
public class DynamoClientConfig {@Bean("dynamoDbClient")public DynamoDbClient dynamoDbClient() {AwsCredentialsProvider credentialsProvider = ProfileCredentialsProvider.create("my-test");return DynamoDbClient.builder().region(Region.US_EAST_1)//.endpointOverride(URI.create(url))//.credentialsProvider(DefaultCredentialsProvider.create()) // 默认凭证//.credentialsProvider(StaticCredentialsProvider.create(credentials))//.credentialsProvider(ProfileCredentialsProvider.create()) // 默认使用AWS CLI的配置文件.credentialsProvider(credentialsProvider).build();}@Bean("dynamoDbEnhancedClient")public DynamoDbEnhancedClient dynamoDbEnhancedClient() { // enhanced versionDynamoDbClient dynamoDbClient = dynamoDbClient();return DynamoDbEnhancedClient.builder().dynamoDbClient(dynamoDbClient).build();}
}
(2)实体
package com.demo.dynamo.entity;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.*;
//import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@DynamoDbBean
//@DynamoDBTable(tableName = "t_user")
public class UserEntity {private String userAccount;private String userName;@DynamoDbAttribute(value = "user_account")@DynamoDbPartitionKeypublic String getUserAccount() {return userAccount;}@DynamoDbAttribute(value = "user_name")@DynamoDbSortKeypublic String getUserName() {return userName;}
}
(3)dao
package com.demo.dynamo.repository;import com.demo.dynamo.entity.UserEntity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable;
import software.amazon.awssdk.enhanced.dynamodb.Expression;
import software.amazon.awssdk.enhanced.dynamodb.TableSchema;
import software.amazon.awssdk.enhanced.dynamodb.model.PageIterable;
import software.amazon.awssdk.enhanced.dynamodb.model.QueryConditional;
import software.amazon.awssdk.enhanced.dynamodb.model.QueryEnhancedRequest;
import software.amazon.awssdk.enhanced.dynamodb.model.UpdateItemEnhancedRequest;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;import java.util.Map;@Repository
@Slf4j
public class UserRepository {@Autowiredprivate DynamoDbEnhancedClient enhancedClient;public void saveUser(UserEntity userEntity) {// 获取表格映射DynamoDbTable<UserEntity> mappedTable = enhancedClient.table("t_user", TableSchema.fromBean(UserEntity.class));// 插入数据mappedTable.putItem(userEntity);}public void delete(UserEntity userEntity) {// 获取表格映射DynamoDbTable<UserEntity> mappedTable = enhancedClient.table("t_user", TableSchema.fromBean(UserEntity.class));mappedTable.deleteItem(userEntity);}
}
(4)启动类
package com.demo.dynamo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DynamoApplication {public static void main(String[] args) {SpringApplication.run(DynamoApplication.class, args);}
}
(5)单测
package com.demo.dynamo;
import com.demo.dynamo.entity.UserEntity;
import com.demo.dynamo.repository.UserRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.ListTablesRequest;
import software.amazon.awssdk.services.dynamodb.model.ListTablesResponse;@SpringBootTest(classes = {DynamoApplication.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@RunWith(SpringRunner.class)
public class MyTest {@Autowiredprivate UserRepository userRepository;@Autowiredprivate DynamoDbClient dynamoDbClient;/*** 列出所有的表*/@Testpublic void  testListAllTables(){// 使用 ListTables 请求列出所有表ListTablesRequest listTablesRequest = ListTablesRequest.builder().build();ListTablesResponse listTablesResponse = dynamoDbClient.listTables(listTablesRequest);// 打印所有表名System.out.println("Tables in DynamoDB:");listTablesResponse.tableNames().forEach(System.out::println);}/*** 保存*/@Testpublic void  testSave(){UserEntity user = UserEntity.builder().userAccount("zs").userName("zhangsan").build();userRepository.saveUser(user);}/*** 更新*/@Testpublic void  testDelete(){UserEntity user = UserEntity.builder().userAccount("ls").userName("lisi1").build();userRepository.delete(user);}
}

测试通过,查看aws控制台验证数据写入成功

3、部署

代码部署到服务器上,凭证过期了怎么办?脚本定期刷新?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/61738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

半导体、晶体管、集成电路、芯片、CPU、单片机、单片机最小系统、单片机开发板-概念串联辨析

下面概念定义从小到大串联&#xff1a; 半导体&#xff08;semiconductor&#xff09;&#xff1a; 是一类常温下导电性能介于导体与绝缘体之间的材料&#xff0c;这种材料的导电性可以随着外部环境比如电压、温度、光照的变换而改变。常见的半导体材料有硅、锗、砷化镓等。 晶…

学习路之phpstudy--安装mysql5.7后在my.ini文件中无法修改sql_mode

windows环境下使用phpstudy安装mysql5.7后需要修改mysql中的sql_mode配置&#xff0c;但是在phpstudy中打开mysql配置文件my.ini后&#xff0c; 通过查找找不到sql_mode或sql-mode&#xff0c; 此时无法在my.ini文件中直接进行修改&#xff0c;可以使用mysql命令进行修改&#…

了解大模型:开启智能科技的新篇章

在当今科技飞速发展的时代,人工智能(AI)已经成为推动社会进步的重要力量。而在AI的众多技术分支中,大模型(Large Model)以其强大的数据处理能力和卓越的性能,正逐渐成为研究和应用的热点。本文旨在科普大模型的基本概念、与大数据的关系以及与人工智能的紧密联系,帮助读…

多目标粒子群优化(Multi-Objective Particle Swarm Optimization, MOPSO)算法

概述 多目标粒子群优化&#xff08;MOPSO&#xff09; 是粒子群优化&#xff08;PSO&#xff09;的一种扩展&#xff0c;用于解决具有多个目标函数的优化问题。MOPSO的目标是找到一组非支配解&#xff08;Pareto最优解&#xff09;&#xff0c;这些解在不同目标之间达到平衡。…

联想ThinkServer服务器主要硬件驱动下载

联想ThinkServer服务器主要硬件驱动下载&#xff1a; 联想ThinkServer服务器主要硬件Windows Server驱动下载https://newsupport.lenovo.com.cn/commonProblemsDetail.html?noteid156404#D50

亚马逊搜索关键词怎么写?

在亚马逊这个全球领先的电子商务平台&#xff0c;如何让自己的产品被更多的消费者发现&#xff0c;是每一个卖家都需要深入思考的问题。而搜索关键词&#xff0c;作为连接卖家与买家的桥梁&#xff0c;其重要性不言而喻。那么&#xff0c;如何撰写有效的亚马逊搜索关键词呢&…

Flutter-Web首次加载时添加动画

前言 现在web上线后首次加载会很慢&#xff0c;要5秒以上&#xff0c;并且在加载的过程中界面是白屏。因此想在白屏的时候放一个加载动画 实现步骤 1.找到web/index.html文件 2.添加以下<style>标签内容到<head>标签中 <style>.loading {display: flex;…

动态规划子数组系列一>最长湍流子数组

1.题目&#xff1a; 解析&#xff1a; 代码&#xff1a; public int maxTurbulenceSize(int[] arr) {int n arr.length;int[] f new int[n];int[] g new int[n];for(int i 0; i < n; i)f[i] g[i] 1;int ret 1;for(int i 1; i < n-1; i,m. l.kmddsfsdafsd){int…

win10 禁止更新

一、winR 输入 regedit 二、输入注册列表路径&#xff1a; &#xff08;1&#xff09;计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings &#xff08;2&#xff09;按照格式&#xff0c;创建文件命名: FlightSettingsMaxPauseDays &#xff08;3&…

传奇996_36——背包图标,物品位置问题

绑定位置不对位 CTRLF9背包物品文件&#xff0c;也就是bag_item文件夹的bag_item.lua文件&#xff0c;这个小框和大框的相对位置会影响那个绑定图标,就是背包物品组合的标签和下面子标签的相对位置 背包物品偏移到看不见 原因&#xff1a;CTRLF9背包物品文件&#xff0c;也就…

springboot3如何集成knife4j 4.x版本及如何进行API注解

1. 什么是Knife4j knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案, 取名knife4j是希望她能像一把匕首一样小巧,轻量,并且功能强悍!knife4j的前身是swagger-bootstrap-ui,swagger-bootstrap-ui自1.9.6版本后,正式更名为knife4j为了契合微服务的架构发展,由于原来…

机械设计学习资料

免费送大家学习资源&#xff0c;已整理好&#xff0c;仅供学习 下载网址&#xff1a; https://www.zzhlszk.com/?qZ02-%E6%9C%BA%E6%A2%B0%E8%AE%BE%E8%AE%A1%E8%A7%84%E8%8C%83SOP.zip

【大数据学习 | Spark-Core】RDD的概念与Spark任务的执行流程

1. RDD的设计背景 在实际应用中&#xff0c;存在许多迭代式计算&#xff0c;这些应用场景的共同之处是&#xff0c;不同计算阶段之间会重用中间结果&#xff0c;即一个阶段的输出结果会作为下一个阶段的输入。但是&#xff0c;目前的MapReduce框架都是把中间结果写入到HDFS中&…

Flume日志采集系统的部署,实现flume负载均衡,flume故障恢复

目录 安装包 flume的部署 负载均衡测试 故障恢复 安装包 在这里给大家准备好了flume的安装包 通过网盘分享的文件&#xff1a;apache-flume-1.9.0-bin.tar.gz 链接: https://pan.baidu.com/s/1DXMA4PxdDtUQeMB4J62xoQ 提取码: euz7 --来自百度网盘超级会员v4的分享 ----…

B站直播模块解读——MVVM类似物

Model层: 数据类及其Converter Service接口lmpl实现类 (1)Scoket广播接受服务端下发数据 或在repository类中还是利用Socket广播 (2)业务接口接收服务端下发数据 将所有Service实现类注入LiveAppServiceManager统一管理 ViewModel层&#xff1a; ViewModel从LiveAppService…

Hive基础面试-如何理解复用率的

1. 模型的复用率你们是怎么做的&#xff1f; 简单直白的说就是你的模型复用率如何&#xff0c;在业务方是否认可该模型&#xff0c;也是衡量模型建设的一个标准&#xff0c;复用率数&#xff1a;数仓模型涉及的核心是追求模型的复用和共享&#xff0c;引用系数越高&#xff0c;…

eduSRC挖洞思路

声明 学习视频来自 B 站UP主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识&#xff0c;以下网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 ✍&#x1f3fb;作者简介&#xff1a;致…

Banana Pi BPI-CanMV-K230D-Zero 采用嘉楠科技 K230D RISC-V芯片设计

概述 Banana Pi BPI-CanMV-K230D-Zero 采用嘉楠科技 K230D RISC-V芯片设计,探索 RISC-V Vector1.0 的前沿技术&#xff0c;选择嘉楠科技的 Canmv K230D Zero 开发板。这款创新的开发板是由嘉楠科技与香蕉派开源社区联合设计研发&#xff0c;搭载了先进的勘智 K230D 芯片。 K230…

昆山网站建设在移动互联网时代的作用

在当今的移动互联网时代&#xff0c;昆山网站建设的重要性愈加凸显。随着智能手机和移动设备的普及&#xff0c;用户获取信息和进行消费的方式发生了根本性的变革。企业在此背景下&#xff0c;必须重新审视自己的在线形象和运营策略&#xff0c;以适应这一变化带来的挑战和机遇…

接上一主题,C++14中如何设计类似于std::any,使集合在C++中与Python一样支持任意数据?

这篇文章的重点是C多态的应用&#xff0c;但是如果你是C新手&#xff0c; 你需要了解以下C知识&#xff1a; 类 构造函数 拷贝构造函数 虚拟函数 纯虚拟函数 析构函数 类的继承 运算符重写 模板类 模板参数 数组 数组的传递 指针与动态内存分配 Python&#xff1a; s …