最近,公司要求将组内的thrift客户端组件推广至公司内使用。基本的要求如下:

1.高可用

2.集成名称服务,也就配置文件支持服务发现

3.解耦,客户端和高可用组件解耦,简单来说就是,如果以后要切换其他的高可用组件,改动要尽可能的小;同理,如果要基于目前的高可用部分实现其他的客户端例如mysql,redis也要求能够轻松支持。

以上为公司要求,但是在实际业务使用中,我们发现以下几点也很重要:

1.支持对thrift业务层面的ping校验

2.客户端隔离策略

3.能够友好的支持任何thrift协议

针对上述要求,我们来一步一步推理,实现一个易用高可用thrift池化客户端。

首先,我们把项目分解成三块:

1.cluster:高可用的逻辑层

2.client:客户端的实现层

3.registry:服务注册发现层

高可用cluster组件:

一个高可用组件应该包含一下功能:

1.容灾策略

2.多种负载均衡策略

3.服务自动熔断

所以基本的框架如下:

─com                └─zhizus
└─forest
├─cluster
│ ├─ha
│ └─loadbalance
├─registry
│ ├─confcenter
│ └─s2s
└─utils

  

由于,我们是需要将高可用部分如client层解耦,所以,我们来创建一个client的描述类,LoadBalance引用的并不是真正的client,而是client的描述类,而这个描述类针对所有的客户端都是大同小异的。

如是便有了这样一个ServerInfo对象:

public final class ServerInfo {

	private final String host;

	private final int port;

	private final int chance;
... }

  

高可用thrift客户池的实现详解的更多相关文章

  1. java对象池commons-pool-1.6详解(一)

    自己的项目中用到了 对象池 commons-pool: package com.sankuai.qcs.regulation.protocol.client; import com.dianping. ...

  2. Java基础-DBCP连接池(BasicDataSource类)详解

    Java基础-DBCP连接池(BasicDataSource类)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程 ...

  3. 高并发架构系列:Redis为什么是单线程、及高并发快的3大原因详解

    Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...

  4. 线程池底层原理详解与源码分析(补充部分---ScheduledThreadPoolExecutor类分析)

    [1]前言 本篇幅是对 线程池底层原理详解与源码分析  的补充,默认你已经看完了上一篇对ThreadPoolExecutor类有了足够的了解. [2]ScheduledThreadPoolExecut ...

  5. Java多线程学习之线程池源码详解

    0.使用线程池的必要性 在生产环境中,如果为每个任务分配一个线程,会造成许多问题: 线程生命周期的开销非常高.线程的创建和销毁都要付出代价.比如,线程的创建需要时间,延迟处理请求.如果请求的到达率非常 ...

  6. Java:多线程,线程池,ThreadPoolExecutor详解

    1. ThreadPoolExecutor的一个常用的构造方法 ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepA ...

  7. Java自带线程池和队列详解

    Java线程池使用说明 一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后 ...

  8. [转]阿里巴巴数据库连接池 druid配置详解

    一.背景 java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池.数据库连接池有很多选择,c3p.dhcp.proxool等,druid作为一名后起之秀,凭借其出色 ...

  9. 阿里巴巴数据库连接池 druid配置详解

    一.背景 java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池.数据库连接池有很多选择,c3p.dhcp.proxool等,druid作为一名后起之秀,凭借其出色 ...

随机推荐

  1. c# 本周时间查询

    var now = DateTime.Now();int weeknow = Convert.ToInt32(now.DayOfWeek); //因为是以星期一为第一天,所以要判断weeknow等于0 ...

  2. 【BZOJ-3143】游走 高斯消元 + 概率期望

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2264  Solved: 987[Submit][Status] ...

  3. Smallest Common Multiple

    FCC题目:找出能被两个给定参数和它们之间的连续数字整除的最小公倍数. 范围是两个数字构成的数组,两个数字不一定按数字顺序排序. 例如对 1 和 3 -- 找出能被 1 和 3 和它们之间所有数字整除 ...

  4. springboot: mybatis集成参考

    http://blog.csdn.net/isea533/article/details/50359390

  5. Android源码——Logger日志系统

    Android的Logger日志系统是基于内核中的Logger日志驱动程序实现的. 日志保存在内核空间中 缓冲区保存日志   分类方法:日志的类型  +   日志的输出量   日志类型:   main ...

  6. oracle--存储过程--bai

    --1 无入参最简单的存储过程 create or replace procedure hello_proc as v_name varchar2(20); v_age number; begin v ...

  7. Win7 命令行强制杀死进程

    原理 1.查看当前正在运行的进程 tasklist 如下图所示 2.强制杀死映像名称为imagename的进程,映像名称可通过任务管理器或tasklist命令查看 taskkill /im image ...

  8. python的错误和异常

    python错误和异常 错误 错误分为语法错误和逻辑错误 语法错误 >>> if File "<stdin>", line 1 if ^ Syntax ...

  9. PHP中explode和implode的区别

    字符串的连接与分割是非常重要的两个内容,通过其可以将数组按照指定的规则转换成字符串,也可以将字符串按照指定的规则进行分割,返回一个数组.其应用范围很广,如在购物网站的购物车,在线投票系统等.这两项技术 ...

  10. chose.jquery 联动

    <!doctype html> <html lang="en"> <head> <meta charset="utf-8&quo ...