Apache Thrift 初学小讲(七)【负载均衡】
2017-05-15 10:35
218 查看
本节在《代理》和《连接池》的基础上加上负载均衡,主要的思路是在代理上加上集群服务的n个连接池,客户端连接到代理上,代理转发时根据负载均衡算法选择一个合适连接池中的连接:
一般的负载均衡算法有:
1 [加权]轮询法([Weight] Round Robin),
2 [加权]随机法([Weight] Random),
3 源地址哈希法(Hash),
4 [加权]最小连接数法([Weight] Least Connections)。
这里只实现加权最小连接数法:least_conn算法很简单,首选遍历后端集群,比较每个后端的conns/weight,选取该值最小的后端。如果有多个后端的conns/weight值同为最小的,那么对它们采用加权轮询算法。
首先在ConnectionPoolFactory.java加上计算该连接池的权重值的方法:
//取得权重值 public double getWeight() { //活动的连接数 除以 最大连接数 double numActive = pool.getNumActive(); double maxTotal = pool.getMaxTotal(); System.out.println(numActive + "**" + maxTotal); return numActive / maxTotal; }
然后在ThirftProxy.java加上如下代码,其中getLeastConnPoolFactory就是least_conn算法的实现:
private static List<ConnectionPoolFactory> poolFactorys = new ArrayList<ConnectionPoolFactory>(); static { GenericObjectPoolConfig config = new GenericObjectPoolConfig(); //链接池中最大连接数,默认为8 config.setMaxTotal(2); //当连接池资源耗尽时,调用者最大阻塞的时间,超时将跑出异常。单位:毫秒;默认为-1,表示永不超时 config.setMaxWaitMillis(3000); ConnectionPoolFactory poolFactory = new ConnectionPoolFactory(config, "127.0.0.1", 9090); poolFactorys.add(poolFactory); poolFactory = new ConnectionPoolFactory(config, "127.0.0.1", 9091); poolFactorys.add(poolFactory); } public static ConnectionPoolFactory getLeastConnPoolFactory() { ConnectionPoolFactory selectPoolFactory = poolFactorys.get(0); double selectWeight = selectPoolFactory.getWeight(); for (int i = 1; i < poolFactorys.size(); i++) { ConnectionPoolFactory poolFactory = poolFactorys.get(i); double weight = poolFactory.getWeight(); System.out.println(selectWeight + "--" + weight); //这里为了简单,没有实现:如果有多个后端的conns/weight值同为最小的,那么对它们采用加权轮询算法 if ( weight < selectWeight ) { selectPoolFactory = poolFactory; selectWeight = weight; } } return selectPoolFactory; }
最后在ProxyProcessor的process要转发的时候用getLeastConnPoolFactory取得连接:
//转发请求 ConnectionPoolFactory poolFactory = getLeastConnPoolFactory(); TTransport transport = poolFactory.getConnection();
工程结构图:
启动两个服务TestServer,端口分别是9090和9091,并发的执行TestClient,结果如预期。
几种简单的负载均衡算法及其Java代码实现:https://www.geek-share.com/detail/2676986660.html
附件是整个eclipse工程。
相关文章推荐
- Apache Thrift 初学小讲(九)【测试接口的QPS】
- Apache Thrift 初学小讲(八)【zookeeper实现服务注册与发现】
- Apache 实现Web Server 负载均衡,不考虑Session版
- Apache Thrift
- Apache Thrift环境配置
- Apache+Tomcat构建Tomcat负载均衡集群
- 实现Apache,Tomcat集群和负载均衡
- 轻松实现Apache,Tomcat集群和负载均衡
- 【 Nginx+Apache-Tomcat7+Memcached搭建负载均衡实现Session共享】
- Hessian学习之(三):Hessian+Apache+Tomcat在windows上实现负载均衡
- Apache + MOD_JK + TOMCAT实现集群和负载均衡配置指南
- 最新版整合Apache2.2.9和Tomcat6.0.18 集群和负载均衡
- apache+jetty 配置web jsp服务器负载均衡
- apache(单机)负载均衡配置(七)
- apache(单机)负载均衡配置(十五)
- 架构设计:系统间通信(12)——RPC实例Apache Thrift 中篇
- apache+tomcat 负载均衡
- apache thrift
- Apache,Tomcat集群和负载均衡 教程
- Apache Thrift - 可伸缩的跨语言服务开发框架