实现过程
什么是对象存储
对象存储是一种将数据作为对象进行管理的计算机数据存储体系结构,与其他存储体系结构(例如将数据作为文件层级管理的文件系统)以及将数据作为块和扇区内的块进行管理的块存储相对。每个对象通常包括数据本身,可变数量的元数据和全局唯一标识符。
对象存储可以在多个级别实现,包括设备级别(对象存储设备),系统级别和接口级别。在每种情况下,对象存储都试图实现其他存储架构无法解决的功能,例如可以由应用程序直接编程的接口,可以跨越多个物理硬件实例的命名空间,以及数据管理功能,如数据复制和数据分发在对象级粒度。
相比于数据库这种面向结构化数据存储的技术,对象存储主要面向存储大量的非结构化数据,通俗来说,我们日常生活中生成的照片、视频、音频、文档等都属于非结构化数据。这些日常产生的数据都适合存储在对象存储中。
现在几乎所有公有云服务商都提供对象存储服务,如果要在企业内部使用,也可以采用元核云、紫光西数这类专业存储公司提供的企业级对象存储产品。
1.创建桶
这里使用的腾讯云对象存储
创建桶的链接https://console.cloud.tencent.com/cos




2.查看桶相关信息
可知桶名为

获取密钥https://console.cloud.tencent.com/cam/capi

访问域名在点击桶更多配置可见


3.代码实现api调用
依赖
<!--腾讯云COS-->
<dependency>
<groupId>com.qcloud</groupId>
<artifactId>cos_api</artifactId>
<version>5.6.89</version>
</dependency>
yaml配置
tencent:
yun:
#腾讯云api的APPID
APPID:
#腾讯云api秘钥id
secretid:
#腾讯云api秘钥key
secretkey:
#COS地域
region:
#COS路径-访问域名
url:
#COS储存桶名称
bucketName:
COS客户端实现位于TCCOSConfig配置类中
参考文档: https://cloud.tencent.com/document/product/436/10199#.E5.88.9B.E5.BB.BA.E5.AD.98.E5.82.A8.E6.A1.B6
通用参考文档: https://cloud.tencent.com/document/product/436/10199#.E5.88.9B.E5.BB.BA.E5.AD.98.E5.82.A8.E6.A1.B6

文件下载,参考文档:https://cloud.tencent.com/document/product/436/65937#.E4.B8.8B.E8.BD.BD.E5.AF.B9.E8.B1.A12 参考文档最后之处
demo
1.yaml
其数据库连接操作没有用到
server:
port: 9004
#优雅关停
shutdown: graceful
spring:
lifecycle:
#强制关停时间(配合优雅关停)
timeout-per-shutdown-phase: 60s
application:
name: COSdemo-boot-project
aop:
auto: true
proxy-target-class: true
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://xxxx:3306/xxxx?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username: xxxxx
password: xxxxx
#以下配置参考:
#https://github.com/alibaba/druid/wiki
#https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E5%88%97%E8%A1%A8
#https://www.cnblogs.com/halberd-lee/p/11304790.html
#https://blog.csdn.net/weixin_41926301/article/details/92835070
druid:
#启动程序时,在连接池中初始化多少个连接
#计算方法可参考:https://qgstu.com/article/20.htm
initialSize: 1
#回收空闲连接时,将保证至少有minIdle个连接
minIdle: 1
#连接池中最多支持多少个活动会话
#计算方法可参考:https://www.cnblogs.com/phpper/p/9570792.html
maxActive: 100
#获取连接时最大等待时间,单位毫秒。
#配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
maxWait: 3000
#建议配置为true,不影响性能,并且保证安全性。
#当应用向连接池申请连接时检测时,如果这个连接的空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
#而testOnBorrow是不管空闲时间,都执行validationQuery
#参考:https://www.jianshu.com/p/bdf96b3fd743
testWhileIdle: true
#申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testOnBorrow: false
#归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
testOnReturn: false
#打开KeepAlive之后的效果:
#1. 初始化连接池时会填充到minIdle数量。
#2. 连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作(validationQuery)。
#3. 当网络断开等原因产生的由ExceptionSorter检测出来的死连接被清除后,自动补充连接到minIdle数量。
keepAlive: false
#检查池中的连接是否仍可用的 SQL 语句,druid会连接到数据库执行该SQL,
#如果正常返回,则表示连接可用,否则表示连接不可用
validationQuery: SELECT 1
#注意:minEvictableIdleTimeMillis、maxEvictableIdleTimeMillis、timeBetweenEvictionRunsMillis的配置
#参考:https://www.jianshu.com/p/be9dbe640daf?ivk_sa=1024320u
#根据 https://blog.csdn.net/xingor/article/details/106698055 总结如下(对参考链接做了一定的优化):
#1. 明确我们业务连接的数据库对空闲链接的保留时长上限,例如MySQL的wait_time参数,其会终止掉sleep线程
#2. 配置timeBetweenEvictionRunsMillis、minEvictableIdleTimeMillis和maxEvictableIdleTimeMillis时
# 需要保证在两个清理周期之内超时(空闲时长>数据库wait_time)链接一定会被清理掉
#3. timeBetweenEvictionRunsMillis一定要小于:数据库wait_time-minEvictableIdleTimeMillis
# 和数据库wait_time-maxEvictableIdleTimeMillis 的最小值
#minEvictableIdleTimeMillis:连接空闲时间大于该值并且池中空闲连接大于minIdle
#如果没配置keepalive,则关闭该连接。如果配置了,关闭超出minIdle的连接之后,执行keepalive
minEvictableIdleTimeMillis: 160000
#maxEvictableIdleTimeMillis:连接空闲时间大于该值,不管minIdle都关闭该连接
#如果打开了keepAlive,keepAlive会不断的刷新,所以这个配置就用不上了
maxEvictableIdleTimeMillis: 230000
#有两个含义:
#1) Destroy线程会检测连接的间隔时间
#如果连接空闲时间大于等于minEvictableIdleTimeMillis则执行minEvictableIdleTimeMillis里的操作。
#如果连接空闲时间大于等于maxEvictableIdleTimeMillis则执行maxEvictableIdleTimeMillis里的操作。
#2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明
timeBetweenEvictionRunsMillis: 60000
#配置插件
filters: stat,wall,slf4j
#连接池预编译Sql
poolPreparedStatements: true
#预编译Sql语句
maxPoolPreparedStatementPerConnectionSize: 20
mybatis:
mapper-locations: classpath:mapper/**/*.xml
# type-aliases-package: com.truezir.talesstreet
management:
endpoints:
web:
exposure:
include: '*'
tencent:
yun:
#腾讯云api的APPID
APPID:
#腾讯云api秘钥id
secretid:
#腾讯云api秘钥key
secretkey:
#COS地域
region:
#COS路径-访问域名
url: https://
#COS储存桶名称
bucketName:
2.配置类
import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.http.HttpProtocol;
import com.qcloud.cos.region.Region;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 腾讯云COS配置
* 参考文档: https://cloud.tencent.com/document/product/436/10199#.E5.88.9B.E5.BB.BA.E5.AD.98.E5.82.A8.E6.A1.B6
*
* @author xn
* @date 2022/6/20 15:41
*/
@Configuration
@Data
public class TCCOSConfig {
@Value("${tencent.yun.secretid}")
private String secretId;
@Value("${tencent.yun.secretkey}")
private String secretKey;
@Value("${tencent.yun.region}")
private String region;
@Bean
public COSClient cosClient() {
// 1 初始化用户身份信息(secretId, secretKey)。
// SECRETID和SECRETKEY请登录访问管理控制台 https://console.cloud.tencent.com/cam/capi 进行查看和管理
COSCredentials cred = new BasicCOSCredentials(this.secretId, this.secretKey);
// 2 设置 bucket 的地域, COS 地域的简称请参照 https://cloud.tencent.com/document/product/436/6224
// clientConfig 中包含了设置 region, https(默认 http), 超时, 代理等 set 方法, 使用可参见源码或者常见问题 Java SDK 部分。
Region region = new Region(this.region);
ClientConfig clientConfig = new ClientConfig(region);
// 这里建议设置使用 https 协议
// 从 5.6.54 版本开始,默认使用了 https
clientConfig.setHttpProtocol(HttpProtocol.https);
// 3 生成 cos 客户端。
COSClient cosClient = new COSClient(cred, clientConfig);
return cosClient;
}
}

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



