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

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

    博客分类:
  • Java
 
阅读更多

使用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>  
分享到:
评论

相关推荐

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

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

    spring-boot示例项目

    cloud-zuul|[zuul服务网关、过滤器、路由转发、服务降级、负载均衡](https://github.com/smltq/spring-boot-demo/blob/master/cloud-zuul) cloud-alibaba|[nacos服务中心、配置中心、限流等使用(系列示例整理中...)...

    微服务框架demo (mvn+springboot+springcloud)

    微服务模块初始化时,常量和数据库信息等使用云配置服务(spring config)获取; 微服务之间使用负载均衡(ribbon); 微服务网关路由配置; 微服务断路器(hystrix)及监听服务等 启动步骤: 1.启动server-...

    2024年java面试题-SpringCloud面试题

    它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、智能路由、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。...

    Java课设基于Spring Boot和Spring Cloud开发的加密货币爱好者流量的平台源码(含项目说明+数据库).zip

    * 反向代理负载均衡:Nginx * CDN服务器:基于Nginx搭建 前端主要技术栈 * 前端框架:Bootstrap + jQuery * 前端模板:AdminLTE 自动化运维 * 持续集成:GitLab * 持续交付:Jenkins (后期考虑加入) * 容器...

    cloud-shard-jdbc:SpringCloud实现基于Shard-jdbc分库分表模式下,数据库扩容解决办法

    微服务基础:Ribbon和Feign组件,实现请求负载均衡 03 微服务基础:Hystrix组件,实现服务熔断 04 微服务基础:Turbine组件,实现微服务集群监控 05 微服务基础:Zuul组件,实现路由网关控制 06 微服务基础:Config...

    XXX-JAVA开发工程师-2年经验简历模板

    ➢ 熟练使用 SpringBoot 简化 SpringCloud 进行微服务架构的搭建,熟悉微服务模块,如 Eureka服务的注册中心,Zuul服务的网关智能路由,Hystrix服务的降级与熔断,Feign 服务的发现和 Ribbon负载均衡,Quartz...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    12.2.4 负载均衡 457 12.2.5 断路器 458 12.3 实战 458 12.3.1 项目构建 458 12.3.2 服务发现——Discovery(Eureka Server) 459 12.3.3 配置——Config(Config Server) 461 12.3.4 服务模块——Person 服务 463 ...

    ship-gate:使用SpringWebFlux,Netty和Nacos构建高性能的响应式API网关

    高性能,高响应API网关 ...支持多种负载均衡策略 支持HTTP协议,包括GET,PUT,POST等 支持基于版本的动态路由规则 支持接口身份验证(未实现) 用法 1.nacos 您可以参考此( )来安装nacos。 2.创建数据库 首先在项

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    12.2.4 负载均衡 457 12.2.5 断路器 458 12.3 实战 458 12.3.1 项目构建 458 12.3.2 服务发现——Discovery(Eureka Server) 459 12.3.3 配置——Config(Config Server) 461 12.3.4 服务模块——Person 服务 463 ...

    Java思维导图xmind文件+导出图片

    Nginx反向代理服务器及负载均衡服务器配置实战 利用keepalived+Nginx实战Nginx高可用方案 基于Nginx实现访问控制、连接限制 Nginx动静分离实战 Nginx Location ReWrite 等语法配置及原理分析 Nginx提供https...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    12.2.4 负载均衡 457 12.2.5 断路器 458 12.3 实战 458 12.3.1 项目构建 458 12.3.2 服务发现——Discovery(Eureka Server) 459 12.3.3 配置——Config(Config Server) 461 12.3.4 服务模块——Person 服务 463 ...

    课设项目代码.zip

    运行工具SpringToolSuite4(eclipse...6.对服务消费者配置基于Robin的客户端负载均衡;(10分) 使用Hystrix Dashboard + Tubine进行可视化聚合监测数据;(10分) 进阶要求 9.使用Zuul构建微服务网关及路由配置;

    nacos-server-2.0.3部署以及教程

    4)动态 DNS 服务: Nacos 支持动态 DNS 服务权重路由,能够让我们很容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单 DNS 解析服务。 5)服务及其元数据管理: Nacos 支持从微服务平台...

    java版飞机大战源码-micro-service:简单微服务的使用

    在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现、服务消费、负载均衡、断路器、智能路由、配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统。一个简答的微服务系统如下图:...

    compass:Compass是一个轻量级的嵌入式分布式数据库访问层框架

    Compass是搜狗商业平台研发部开发的一套轻量级的分布式数据库访问框架,支持单库、主从库读写分离、分库、分库之后再分表、从库负载均衡和HA等使用场景,并且在框架层面提供了主从反延迟策略。Compass采用Spring配置...

    分布式微服务

    微服务也不一定必须使用cloud来实现,只是微服务中有许多问题,如:负载均衡、服务注册与发现、路由等等。而cloud则是将这些处理问题的技术整合了。Eureka是Netifix的子模块之一,Eureka有2个组件,一个EurekaServer...

    完整版微服务源码下载

    采用SpringCloud+SpringBoot+Netflix+mybatis敏捷框架,同时整合swagger在线文档、oralce/mysql数据库、redis缓存、Ribbon负载均衡、Hystrix熔断、minio文件容器、easypoi导入导出模板等常用组件,并且源码中还提供...

    mallcloud商城 v1.0

    服务注册发现、路由与负载均衡 服务降级与熔断 服务限流(url/方法级别) 统一配置中心 统一日志中心 统一分布式缓存操作类、cacheManager配置扩展 分布式锁 分布式任务调度器 支持CI/CD持续集成(包括前端和...

    mallcloud商城-其他

    服务注册发现、路由与负载均衡 服务降级与熔断 服务限流(url/方法级别) 统一配置中心 统一日志中心 统一分布式缓存操作类、cacheManager配置扩展 分布式锁 分布式任务调度器 支持CI/CD持续集成(包括前端和后端) ...

Global site tag (gtag.js) - Google Analytics