目录
主要作用
- 支持多数据源切换:
- 在微服务架构中,不同的服务或同一服务的不同部分可能需要访问不同的数据库。DynamicDatasource允许开发者根据业务需求动态地切换数据源,无需修改代码或重新部署服务。
- 读写分离:
- 通过配置主从数据库,DynamicDatasource可以实现读写分离,即主数据库负责写操作,从数据库负责读操作,从而提高系统的性能和稳定性。
- 负载均衡:
- 在多数据库实例的场景下,DynamicDatasource可以自动分配请求到不同的数据库实例,实现负载均衡,防止单一节点过载。
- 高可用性和故障切换:
- 当某个数据库实例出现故障时,DynamicDatasource可以快速切换到其他可用的数据库实例,确保服务的连续性和可用性。
- 易于集成和配置:
- DynamicDatasource与Spring Boot等主流框架无缝集成,通过简单的配置即可实现数据源的管理和切换,降低了开发和维护成本。
具体例子
假设有一个基于Spring Cloud的微服务架构的电商平台,该平台包含多个服务,如用户服务、订单服务、商品服务等。每个服务都需要访问数据库来存储和检索数据。
- 场景描述:
- 用户服务需要访问用户数据库来存储和查询用户信息。
- 订单服务需要访问订单数据库来存储和查询订单信息。
- 商品服务需要访问商品数据库来存储和查询商品信息。
- 为了提高性能,每个服务都配置了主从数据库,实现读写分离、负载均衡、高可用性和故障切换。
- DynamicDatasource的应用:
- 在每个服务的Spring Boot配置文件中,配置DynamicDatasource的相关参数,包括数据源列表、默认数据源、读写分离策略等。
DynamicDatasource的配置
在Spring Boot中配置DynamicDatasource,通常需要以下几个步骤:
- 添加依赖:
首先,你需要在你的pom.xml
中添加DynamicDatasource的依赖。 - 配置数据源:
在application.yml
或application.properties
配置文件中,你需要定义你的数据源列表、默认数据源、以及每个数据源的详细配置(如URL、用户名、密码等)、配置读写分离策略。
以application.yml
为例,配置可能如下所示:
spring:
datasource:
dynamic:
primary: master # 设置默认数据源
datasource:
master:
url: jdbc:mysql://localhost:3306/master_db?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
username: root
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
slave1:
url: jdbc:mysql://localhost:3307/slave_db1?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
username: root
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
# 可以配置更多的从数据源...
# 读写分离配置(可选)
slave-load-balance-algorithm-type: round_robin # 轮询算法
在这个例子中,我们配置了两个数据源:master
和slave1
,并指定了master
为默认数据源。我们还配置了读写分离的负载均衡算法为轮询(round_robin
)。
- 配置DataSourceProvider:
某些DynamicDatasource实现可能需要你实现或配置DataSourceProvider
来提供数据源。这通常是通过Java配置类来实现的,但具体取决于你所使用的DynamicDatasource库的版本和特性。 - 使用@DS注解(可选):
为了实现更细粒度的数据源切换,你可以在你的Mapper接口或Service层的方法上使用@DS
注解来指定使用哪个数据源。例如,@DS("slave1")
会指示该方法使用slave1
数据源。然而,这并非所有DynamicDatasource实现都支持的特性,具体取决于你所使用的库。
-
- 在服务启动时,DynamicDatasource会根据配置自动加载和初始化数据源。
- 在服务执行数据库操作时,DynamicDatasource会根据请求的类型(读或写)和配置的读写分离策略,自动选择相应的数据源进行操作。
- 如果某个数据库实例出现故障,DynamicDatasource会检测到该故障并自动切换到其他可用的数据库实例,确保服务的连续性和可用性。
在Cloud项目中,当使用Maven进行多模块管理时,动态数据源(Dynamic Datasource)模块通常负责管理和配置数据库连接信息,但它并不直接存放所有Maven项目的数据信息,而是管理数据库连接的元数据和配置,以便其他模块能够根据需要连接到相应的数据库。
其他Maven模块如何利用动态数据源模块
- 依赖关系:在Maven项目中,其他模块通过依赖关系来利用动态数据源模块。这通常在子模块的
pom.xml
文件中通过<dependency>
标签声明对动态数据源模块的依赖来实现。 - 配置集成:其他模块在启动时会自动加载并集成动态数据源模块的配置。这意味着它们可以无缝地使用动态数据源模块提供的数据库连接服务,而无需关心具体的连接细节。
- 数据源注入:在Spring框架中,动态数据源模块通常会将配置好的数据源注入到Spring的
DataSource
Bean中。其他模块通过Spring的依赖注入机制来获取并使用这些DataSource
Bean,从而实现对数据库的访问。
就根据用户服务、订单服务、商品服务、DynamicDataSource服务,DynamicDataSource服务的application.yaml的配置信息,实现实现主从、读写分离、负载均衡、高可用性和故障切换
spring:
datasource:
dynamic:
primary: master # 设置默认数据源组为master,这里假设所有服务的主库都配置在master组
strict: false
datasource:
# 用户服务数据源
user-master:
url: jdbc:mysql://user-master-host:3306/userdb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
username: user_master
password: user_master_pass
driver-class-name: com.mysql.cj.jdbc.Driver
user-slave:
url: jdbc:mysql://user-slave-host:3306/userdb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
username: user_slave
password: user_slave_pass
driver-class-name: com.mysql.cj.jdbc.Driver
# 订单服务数据源
order-master:
url: jdbc:mysql://order-master-host:3306/orderdb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
username: order_master
password: order_master_pass
driver-class-name: com.mysql.cj.jdbc.Driver
order-slave:
url: jdbc:mysql://order-slave-host:3306/orderdb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
username: order_slave
password: order_slave_pass
driver-class-name: com.mysql.cj.jdbc.Driver
# 商品服务数据源
product-master:
url: jdbc:mysql://product-master-host:3306/productdb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
username: product_master
password: product_master_pass
driver-class-name: com.mysql.cj.jdbc.Driver
product-slave:
url: jdbc:mysql://product-slave-host:3306/productdb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
username: product_slave
password: product_slave_pass
driver-class-name: com.mysql.cj.jdbc.Driver
# 读写分离配置(这里需要动态数据源框架支持)
# 注意:以下配置可能需要根据你使用的动态数据源框架进行调整
seata:
enabled: true # 假设使用Seata进行分布式事务管理
application-id: ${spring.application.name}
tx-service-group: my_tx_group
# 负载均衡和故障切换通常不是在这里配置的,而是依赖于数据库中间件或集群
# 但你可以在这里配置一些基本的路由规则或数据源选择策略(如果框架支持)
# 其他配置...
标签:数据源,数据库,配置,初识,master,DynamicDatasource,mysql
From: https://blog.csdn.net/m0_57623482/article/details/142014208