核心存储切换
概述
对于常规的应用系统来说,使用一个关系型数据库作为数据存储介质,就可以满足绝大多数应用功能需求。对于某些特殊应用场景来说,比如:更快的查询速度、海量时序数据的存储和查询等,使用关系型数据库虽然也能实现相应的功能,但受数据库软件自身机制的局限实际应用效果却差强人意。
在开发过程中我们会先选择合适的、不同的数据存储介质,比如:NOSQL、TMDB 等,然后将相应的功能提取出单独的模块,在把原来使用关系型数据库的代码变更为其它异构存储的代码。这种方式通常需要对原有功能或模块进行大量修改、拆分以及数据的迁移。想要恢复为原有数据存储,仍旧需要投入大量时间和精力进行修改。
Dante Cloud 系统平台中也存在这种类型的数据,例如:认证(Token数据)核心数据。默认是使用关系型数据库进行认证数据的存储,加上有多级缓存的支撑,对于常规应用场景式完全可以满足的。对于一些需要高性能应用的场景,特别是数据查询频次高、并发性能要求高的场景,还是会受到关系型数据库自身机制的局限导致难以满足需求。
为了解决这个问题,自 Dante Cloud v3.4.1.0 版本起,新增了系统核心关键数据的多种异构数据源切换功能。可以在不修改代码的情况下,通过修改系统配置,快速实现系统关键性数据底层存储介质的切换。
[一] Spring Authorization Server 核心认证数据存储切换
Spring Authorization Server
是 Dante Cloud 核心的认证安全组件。默认的是采用关系型数据库存储和管理 Token 以及相关的认证信息。
- 如果您是使用 JWT 自包含 Token,认证服务进需要负责签发 Token,无需在使用时到服务端进行 Token 校验。服务端的压力较小。
- 如果您需要更高级别的安全保证,使用 Opaque 不透明 Token,每个请求都需要到服务端进行 Token 校验。这就需要服务端产生大量的 Token 查询。
NOSQL 类型数据存储相比关系型数据库,在查询效率以及水平扩展方面有其自身独特的优势。
Dante Cloud 对 Spring Authorization Server
核心认证数据的存储新增了 NOSQL 类型数据存储的支持,而且支持无需修改代码通过修改配置参数即可实现。
[1]使用方法
目前,Dante Cloud 新增了 Redis 和 MongoDB 两种 NOSQL 存储介质存储 Spring Authorization Server
核心认证数据。原有基于 JPA 实现的关系型数据库存储方式,并没有抛弃仍旧保留。
默认使用的是 JPA 方式存储,您可以根据需要修改为 Redis 或者 MongoDB。
Redis
想要修改为使用 Redis 作为 Spring Authorization Server
核心认证数据的存储介质。修改方式仅需要在 UAA 服务对应的配置文件中,增加以下配置:
herodotus:
oauth2:
datastore:
sas: redis
MongoDB
想要修改为使用 MongoDB 作为 Spring Authorization Server
核心认证数据的存储介质。
首先,要在 UAA 服务中,添加 data-mongodb-spring-boot-starter
以开启 MongoDB 支持
然后,在配置文件合适的位置中,添加 Spring Data MongoDB 相关的配置,以保证服务可以正常访问 MongoDB,参考配置如下:
spring:
data:
mongodb:
host: 192.168.101.10
database: herodotus-reactive
username: herodotus
password: herodotus
最后,需要在 UAA 服务对应的配置文件中,增加以下配置:
herodotus:
oauth2:
datastore:
sas: mongodb
注意
- 注意此种数据存储介质,并不是整体切换整个系统的存储介质,仅仅只是切换
认证
相关核心数据的存储介质(毕竟不是所有查询都需要高性能),整个系统还是以关系型数据库为主 - 如果使用 Redis 作为存储介质,因为 Spring Data Redis 不支持根据时间类型的查询,所以【账号多点登录踢出】功能使用受限
[2]数据初始化
基于 OAuth2 的 认证
功能依赖于关键的 client
相关数据信息,即数据表 oauth2_registered_client
中的数据,没有这个信息即使系统可以正常运行,登录和认证相关功能都会出错。
系统默认使用关系型数据库,也提供相关数据初始化脚本,在部署搭建系统时就会正常初始化数据,所以不会存在任何问题。
变更为使用 Redis 或 MongoDB 作为认证
相关核心数据的存储介质后,Redis 或 MongoDB 库中并没有相关数据初始化,所以就需要进行数据初始化的操作。
为了简化初始化的操作,系统提供了 Redis 或 MongoDB 自动初始化的支持。当存储介质变更为 Redis 或 MongoDB 后,服务在启动时会自动查询存储介质中是否有 OAuth2 关键的 client 数据存在,如果不存在就从关系数据库中查询该信息,然后初始化到 Redis 或 MongoDB 中。
注意
从前面的描述中可以看出,系统默认初始化实现依赖于关系型数据库中的数据。所以初次安装部署时,还是建议默认选用关系型数据库作为认证
相关核心数据的存储介质,后续根据实际使用需要再行修改。否则,就只能自己手动进行数据的初始化工作。
[3]自定义扩展
如果系统当前提供的 JPA、Redis、MongoDB 三种存储方式均不能满足你的需求,那么你可以参考 datastore-module-sas-mongodb
、datastore-module-sas-redis
和 datastore-module-sas-jpa
三个模块中的代码,自行进行扩展。
三个模块虽然看着多,核心的关键点就是实现以下四个接口即可
cn.herodotus.stirrup.oauth2.core.sas.definition.EnhanceAuthenticationManager
org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationConsentService
cn.herodotus.stirrup.oauth2.core.sas.definition.EnhanceOAuth2AuthorizationService
org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository
[二]系统审计数据存储切换
Dante Cloud 系统中内置了用户使用记录以及 REST 接口审计功能。
- 用户使用记录:会记录用户登入和登出系统信息。这通常为应用安全合规测评要求功能,并不是系统必要应用功能。
- REST 接口审计:会记录具体哪个接口,在什么时间,由哪个用户调用使用。该功能应用安全合规测评的一种补充。
传统单体系统一般是记录用户的实际操作,主要是界面操作。微服务系统是面向 REST 接口的应用系统,一个操作也许会涉及多个接口。所以,本系统采用的方式是直接记录 REST 接口使用的记录。
既然是记录数据,常规的做法就是直接使用关系数据库进行存储。Dante Cloud 中 用户使用记录 和 REST 接口审计 最初的实现就是使用关系数据库。但是,用户使用记录 和 REST 接口审计 功能记录的数据属于 日志
型数据,如果开启了相关功能,随着系统的使用,数据会越积越多,不仅无法有效利用数据,可能还会影响系统的使用。
为此,Dante Cloud 新增了针对 用户使用记录 和 REST 接口审计 功能的时序数据存储支持。可根据你的实际需求,通过修改配置,变换实际使用的存储类型。
介绍
时序数据库和关系型数据库在数据模型、存储方式、查询性能、适用场景等方面存在明显的差异。时序数据库适用于大规模时间序列数据的高效存储和查询,而关系型数据库更适合处理多种类型和复杂关系的数据。根据自身需求,选择合适的数据库类型可以提高数据处理效率和开发维护成本。
[1]使用方法
目前,Dante Cloud 新增了 Cassandra 存储介质存储 用户使用记录 和 REST 接口审计数据。原有基于 JPA 实现的关系型数据库存储方式,并没有抛弃仍旧保留。
默认使用的是 JPA 方式存储,您可以根据需要修改为 Cassandra。
想要修改为使用 Cassandra 作为 用户使用记录 和 REST 接口审计 功能数据的存储介质。
首先,要在 UAA 服务中,添加 data-cassandra-spring-boot-starter
以开启 Cassandra 支持
然后,在配置文件合适的位置中,添加 Spring Data Cassandra 相关的配置,以保证服务可以正常访问 Cassandra
spring:
cassandra:
keyspace-name: herodotus
username: herodotus
password: herodotus
local-datacenter: datacenter1
schema-action: create_if_not_exists
request:
timeout: 10s
最后,需要在 UAA 服务对应的配置文件中,增加以下配置:
herodotus:
oauth2:
datastore:
sys: cassandra
注意
注意此种数据存储介质,并不是整体切换整个系统的存储介质,仅仅只是切换认证
相关核心数据的存储介质(毕竟不是所有查询都需要高性能),整个系统还是以关系型数据库为主
[2]自定义扩展
如果系统当前提供的 JPA、Cassandra 两种存储方式均不能满足你的需求,那么你可以参考 datastore-module-sys-cassandra
和 datastore-module-sys-jpa
两个模块中的代码,自行进行扩展。
核心的关键点就是实现以下两个接口即可
cn.herodotus.stirrup.datastore.core.definition.HerodotusInterfaceAuditService
cn.herodotus.stirrup.datastore.core.definition.HerodotusUserLoggingService