`
longgangbai
  • 浏览: 7339451 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【转】使用spring的动态路由实现数据库负载均衡

阅读更多

使用spring的动态路由实现数据库负载均衡

 

系统中存在的多台服务器是“地位相当”的,不过,同一时间他们都处于活动(Active)状态,处于负载均衡等因素考虑,数据访问请求需要在这几台数据库服务器之间进行合理分配, 这个时候,通过统一的一个DataSource来屏蔽这种请求分配的需求,从而屏蔽数据访问类与具体DataSource的耦合

系统中存在的多台数据库服务器现在地位可能相当也可能不相当,但数据访问类在系统启动时间无法明确到底应该使用哪一个数据源进行数据访问,而必须在系统运行期间通过某种条件来判定到底应该使用哪一个数据源,这个时候,我们也得使用这种“合纵连横”的方式向数据访问类暴露一个统一的DataSource,由该DataSource来解除数据访问类与具体数据源之间的过紧耦合;
更多场景需要读者根据具体的应用来判定,不过,并非所有的应用要做这样的处理,如果能够保持简单,那尽量保持简单.要实现这种“合纵连横”的多数据源管理方式,总的指导原则就是实现一个自定义的DataSource,让该DataSource来管理系统中存在的多个与具体数据库挂钩的数据源, 数据访问类只跟这个自定义的DataSource打交道即可。在spring2.0.1发布之前,各个项目中可能存在多种针对这种情况下的多数据源管理方式, 不过,spring2.0.1发布之后,引入了AbstractRoutingDataSource,使用该类可以实现普遍意义上的多数据源管理功能。

假设我们有三台数据库用来实现负载均衡,所有的数据访问请求最终需要平均的分配到这三台数据库服务器之上,那么,我们可以通过继承AbstractRoutingDataSource来快速实现一个满足这样场景的原型(Prototype):

 

[java] view plaincopy
  1. public class PrototypeLoadBalanceDataSource extends AbstractRoutingDataSource  {  
  2.     private Lock lock = new ReentrantLock();  
  3.     private int counter = 0;  
  4.     private int dataSourceNumber = 3;  
  5.     @Override  
  6.     protected Object determineCurrentLookupKey() {  
  7.         lock.lock();  
  8.         try{  
  9.             counter++;  
  10.             int lookupKey = counter % getDataSourceNumber();  
  11.             return new Integer(lookupKey);  
  12.         }finally{  
  13.             lock.unlock();  
  14.         }  
  15.     }  
  16.     // ...  
  17. }  

我们在介绍AbstractRoutingDataSource的时候说过,要继承该类,通常只需要给出determineCurrentLookupKey()方法的逻辑即可。 下面是针对PrototypeLoadBalanceDataSource的配置:

[html] view plaincopy
  1. <bean id="dataSourc1" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  2.     <property name="url" value=".."/>  
  3.     <property name="driverClassName" value=".."/>  
  4.     <property name="username" value=".."/>  
  5.     <property name="password" value=".."/>  
  6.     <!-- other property settings -->  
  7. </bean>  
  8. <bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  9.     <property name="url" value=".."/>  
  10.     <property name="driverClassName" value=".."/>  
  11.     <property name="username" value=".."/>  
  12.     <property name="password" value=".."/>  
  13.     <!-- other property settings -->  
  14. </bean>  
  15. <bean id="dataSource3" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  16.     <property name="url" value=".."/>  
  17.     <property name="driverClassName" value=".."/>  
  18.     <property name="username" value=".."/>  
  19.     <property name="password" value=".."/>  
  20.     <!-- other property settings -->  
  21. </bean>  
  22. <util:map id="dataSources">  
  23.     <entry key="0" value-ref="dataSource1"/>  
  24.     <entry key="1" value-ref="dataSource2"/>  
  25.     <entry key="2" value-ref="dataSource3"/>  
  26. </util:map>  
  27. <bean id="dataSourceLookup" class="org.springframework.jdbc.datasource.lookup.MapDataSourceLookup">  
  28.     <constructor-arg>  
  29.         <ref bean="dataSources"/>  
  30.     </constructor-arg>  
  31. </bean>  
  32. <bean id="dataSource" class="..PrototypeLoadBalanceDataSource">  
  33.     <property name="defaultTargetDataSource" ref="dataSourc1"/>  
  34.     <property name="targetDataSources" ref="dataSources"/>  
  35.     <property name="dataSourceLookup" ref=""/>  
  36. </bean>  
  37. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">  
  38.     <property name="dataSource" ref="dataSource"/>  
  39. </bean>  
  40. <bean id="someDao" class="...">  
  41.     <property name=""jdbcTemplate"" ref=""jdbcTemplate""/>  
  42.     <!-- other property settings -->  
  43. </bean>  
分享到:
评论

相关推荐

    Springcloud 多数库 多数据源整合,查询动态切换数据库

    本主题聚焦于在Spring Cloud环境中实现多数据库和多数据源的整合,并且能够动态切换查询的数据库。这是一个复杂但至关重要的需求,特别是在大型企业级应用中,可能需要根据业务逻辑或用户权限连接到不同的数据库。 ...

    Spring动态切换datasource实现mysql多住多从

    "Spring动态切换datasource实现mysql多主多从"是针对大型分布式系统中数据读写分离、负载均衡的一种常见策略。该技术使得应用程序能够在运行时根据业务需求灵活地选择不同的数据源,从而提高系统的可扩展性和可用性...

    springcloud集成flowable6.5.0适配达梦数据库的模块

    2. 路由与负载均衡:使用Zuul或Spring Cloud Gateway作为API网关,实现请求的路由和负载均衡。 3. 配置管理:利用Spring Cloud Config服务器集中管理所有微服务的配置,方便统一更新。 4. 安全认证:集成Spring ...

    springaop多数据库读写分离

    在IT行业中,数据库读写分离是一种常见的优化策略,主要用于提高系统的并发处理能力和数据读取...在实际项目中,还可以考虑使用中间件如MySQL的Proxy或商业化解决方案如MaxScale来实现更高级的读写分离和负载均衡策略。

    CAS JPA-Ticket存储解决负载均衡配置

    对于CAS Server,实现负载均衡有多种策略,例如使用反向代理、轮询或者基于会话粘滞性的策略。会话粘滞性允许将特定用户的请求始终路由到处理其初始请求的同一服务器,以保持会话状态的一致性。在CAS中,采用Ticket...

    Mysql主从集群搭建方法,以及基于spring boot注解式数据库读写分离代码示例.zip

    MySQL主从集群是一种常见的数据库高可用性和负载均衡解决方案,它通过数据复制技术使得多个数据库实例之间保持数据同步,其中一个是主节点,负责处理所有写操作,其他是从节点,用于读取数据,从而实现读写分离。...

    SpringCloud黑马商城后端代码

    3. **负载均衡**:Spring Cloud Ribbon是客户端负载均衡器,可以与Eureka结合,为服务调用提供智能路由。在hmall项目中,当请求到达Zuul后,Ribbon会根据预设策略选择一个合适的服务实例进行转发,实现负载均衡。 4...

    springcloud实现服务注册,提供,消费,结合MySQL数据

    Ribbon可以实现客户端的负载均衡,而Zuul则是边缘服务,可以作为API网关,对多个服务实例进行统一的路由和过滤处理,从而实现负载均衡和集群。 此外,Spring Cloud Config提供了配置中心的功能,可以集中管理所有...

    springcloud 完整练习项目

    Zuul 可以过滤请求,实现身份验证、动态路由、负载均衡、限流、熔断等功能,为后端微服务提供了统一的访问入口和保护屏障。 4. **微服务集群**:描述中提到的“微服务集群”指的是将多个相同的服务实例部署在一起,...

    基于Spring-Boot和Spring-Cloud实现微服务架构学习(一).doc

    而Spring Cloud则是一套微服务解决方案的集合,提供了诸如服务发现、配置中心、熔断机制、负载均衡等功能,帮助开发者构建复杂的企业级微服务系统。 在学习Spring Boot时,官方文档是最佳的学习资源。尽管阅读英文...

    基于Spring Boot框架的微服务网关系统.zip

    项目包含多个微服务模块,通过Spring Cloud Gateway进行统一路由和负载均衡,同时利用Docker进行容器化部署,确保环境一致性和快速部署。 项目的主要特性和功能 1. Spring Boot应用 提供了一个标准的Spring Boot...

    (视频和源码)spring boot cloud实战租房网平台

    Spring Boot简化了Java应用程序的初始设置和配置,而Spring Cloud则提供了微服务架构所需的各种组件,如服务发现、配置中心、断路器、路由、负载均衡等。在这个租房网平台项目中,开发者可能利用了Spring Boot的自动...

    spring cloud微服务框架demo完整可用2版(注册中心+生产者+消费者+feign负载均衡+hystrix断路器+仪表盘+gate路由网关+配置中心)

    spring cloud微服务框架demo完整可用2版 比第一版多集成了mybatis...(注册中心+生产者+消费者+feign负载均衡+hystrix断路器+仪表盘+gate路由网关+config配置中心+mybatis+oracle+mybatisPlus generator代码自动生成)

    微服务书籍管理系统springcloud.rar

    Spring Cloud是基于Spring Boot实现的服务发现、配置、路由、熔断、负载均衡等全套微服务解决方案,它为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁...

    springcloud框架直接复制模板写项目就可以了

    智能路由和负载均衡也是SpringCloud的特点,Zuul或Gateway作为边缘服务,可以对请求进行路由,实现动态路由、过滤、熔断等功能。同时,Ribbon和Feign是客户端负载均衡器,它们可以帮助客户端在多个服务实例间分配...

    黑马程序员的SpringCloud教程的demo压缩文件,包含了demo工程以及两个数据库(tb-user和tb-order)

    4. **Ribbon**:客户端负载均衡器,与Eureka配合,用于在消费服务时做负载均衡。 5. **Feign**:声明式服务调用,简化了服务之间的调用,使得调用像本地方法一样简单。 6. **Spring Cloud Config**:配置中心,...

    SpringCloud全套完整架构

    总结来说,SpringCloud通过一系列组件实现了微服务架构的关键功能,包括服务发现、API网关、负载均衡、服务调用、容错保护以及动态配置。这些工具协同工作,构建出一个高效、健壮、易于扩展的分布式系统,为现代云...

    Spring cloud和Spring boot介绍

    - **客户端负载均衡 - Netflix Ribbon**:Ribbon 是一个客户端负载均衡库,用于实现软负载均衡,支持多种负载均衡算法。 - **断路器 - Netflix Hystrix**:Hystrix 是一个延迟和容错库,用于隔离远程系统、服务和第...

    Spring和SpringCloud视频

    6. **Spring Boot与数据库集成**:JDBC、MyBatis、Hibernate等持久层技术的使用。 7. **RESTful API设计**:使用Spring MVC创建RESTful服务。 8. **错误处理和日志记录**:异常处理机制和日志框架集成。 第二部分,...

    尚硅谷2018最新SpringBoot 上下 核心技术和整合,SpringCloud教学视频

    3. ** Ribbon客户端负载均衡**:介绍Ribbon如何在客户端实现负载均衡,提升服务的可用性。 4. **Hystrix容错管理**:理解断路器模式,学习如何使用Hystrix实现服务间的熔断、降级和隔离。 5. **Spring Cloud Config...

Global site tag (gtag.js) - Google Analytics