数据访问模式
[一]核心用户数据访问模式切换
[1]背景
微服务架构下,非常推崇的方式就是一个服务对应一个专门的数据库。服务间通过远程调用方式来访问不同服务所管辖的数据。由于不同企业团队硬件资源配置的不同以及管理便捷性需求的不同,虽然还会选择微服务架构,但是会将所以服务的数据放在同一数据库中,方便管理与维护。
Dante Cloud 默认支持一个服务对应一个数据库的模式。用户认证在 UAA 服务中完成,用户数据由 UPMS 服务进行管理和提供,UAA 通过远程调用(Openfeign 或 GRPC) UPMS 的用户数据实现完整的用户认证和授权。
但是对于资源有限或者性能要求高,特别是所有服务使用同一个数据库的用户来说:数据原本就在同一个库中,用户登录时还要通过服务间的远程访问,无形中多了请求的消耗。
为了解决这个问题,Dante Cloud 专门设计可以灵活调整数据访问策略的机制。
[2]使用
Dante Cloud 提供两种系统用户核心数据的访问模式:远程模式和本地模式
- 远程模式:用于支持标准化的微服务架构,即:服务数据由各自独立的数据库进行存储,通过远程调用的方式进行数据访问。当前系统默认的就是该种模式。
- 本地模式:用于支持特殊化使用需求的方式,即:所有服务数据在同一个数据库中,UAA 服务通过数据库直接读取系统用户核心数据,而无需再多一次远程调用请求。(注:这和单体版本的逻辑一致)
想要将远程模式修改为本地模式,只需要找到 herodotus-cloud-platform.yaml
配置文件,修改 herodotus.platform.architecture
参数即可
herodotus:
platform:
architecture: monocoque
[二]核心用户远程访问协议切换
[1]背景
当前的系统版本,因为开始支持了响应式服务,所以原有的 Openfeign 远程调用就无法满足实际使用需求了,原因是:
- 如果远程服务的调用端和被调用端,均是阻塞式服务(即:Servlet 环境的服务),那么 Openfeign 仍旧可以使用。
- 如果远程服务的调用端和被调用端,其中一侧是阻塞式服务(即:Servlet 环境服务),另一侧是响应式服务(即:Reactive 环境服务),那么 Openfeign 将无法使用。
- 虽然 Feign 有另一开源的响应式版本,但是目前一方面还没有完全适配 Spring Boot 3.3,另一方面无法处理阻塞式服务端。
所以,这种条件下 GRPC 协议就更加适合,一方面 GPRC 不会受两端环境的影响;另一方面 GPRC 性能更优,更适合吞吐率高的场景。
[2]使用
既然提供了两种远程访问的方式,那么该如何来切换使用呢?
Dante Cloud 借鉴 Spring Boot 中可插拔模块的思想,通过在服务中添加和删除必要的依赖,来实现不同远程访问方式的切换。
在 herodotus-cloud-uaa
的 pom.xml
中,
- 如果添加了
spring-cloud-starter-openfeign
依赖,就会开启 Openfeign 方式远程调用。 - 如果添加了
grpc-client-spring-boot-starter
依赖,就会开启 GRPC 方式远程调用。
注意
Openfeign 和 GPRC 两种方式为互斥模式,即:不能两种方式同时开启。两种方式同时开启,启动服务会出错。
为什么不能使用 yaml 配置的方式切换?
Dante Cloud 中,很多策略化模式的实现,都是通过 yaml 配置参数。通过修改配置参数的值或者增加参数,就可以实现策略化的切换。
但是,远程调用方式无法采用参数的方式。主要有以下原因:
- 不管使用哪种方式,都需要考虑调用端和被调用端的实际环境。
- Dante Cloud 的配置和使用,给与用户很大灵活性和自主选择性。一旦增加动态性就会反向限制这种灵活性。