服务框架Pigeon架构
? Pigeon提供jar包接入 ,线上运行在tomcat里
? Monitor-CAT ,负责调用链路分析、异常监控告警等
? 配置中心-Lion ,负责一些开关配置读取
? Governor-服务治理门户
? 一个interface定义为一个服务 ,每个服务有一个唯一标识
服务的注册与发现
? 注册信息包括service name、ip、port、group等
? 服务提供方初始化完成后自动注册 ,也可以通过api或管理端注册
? 服务调用方通过service name去发现服务
Registry (Zookeeper)
/DP/SERVER/com.dianping.iphub.IpService
10.66.1.1:5020,10.66.1.2:5020
服务的注销
? 服务地址通过zookeeper持久节点存储 ,避免临时节点的不稳定
? 关闭tomcat时会调用pigeon脚本去注册中心摘除本机服务地址
? 对于残留的无效地址 ,有独立的心跳服务会检测无效的服务地址进行zookeeper删除
? 客户端对于无效的服务地址 ,内部也有心跳检测机制等来保证
编程方式、序列化
? 基于Hessian序列化 ,通过netty实现自定义TCP协议格式 ,开发成本低 ,通过java interface定义服务接口
? 基于Thrift序列化 ,通过netty实现自定义TCP协议格式 ,性能更高 ,开发成本稍高 ,通过定义IDL或annotation方式定义服务接口 ,
更方便接入其他语言 ,thrift会有一些制如方法不支持重载、struct不支持继承等
调用模式
? Sync ,同步等待返回调用
? Future ,可实现并行发出多个请求 ,总耗时是最慢的请求的执行时长 ,推荐方式
? Callback ,发出结果不等待返回 ,结果回调 ,完全异步化
? Oneway ,无需返回结果
客户端心跳
? 心跳线程客户端发起 ,定期发送 ,服务端响应 ,连续5次不成功则在本地路由缓存里摘除该服务端节点 ,摘除后下次尝试重连
客户端负载均衡
? 多种负载均衡策略 ,默认是自适应策略 ,客户端会计算发往每个服务端节点的在途请求数 ,新的请求会优先选择在途请求数最小的节点发送
? 预热控制 ,针对服务端某个刚启动的节点 ,客户端按从慢到快的频率 ,将请求逐步发往这个节点 ,防止服务端刚启动的节点大量请求进来导致大量超时
? 也可自定义负载均衡策略
服务限流
? 可以在服务端对某一个服务接口的某一个方法 ,针对不同的调用方应用的请求进行流量QPS限制 ,超出阀值后调用端会收到服务拒绝异常 ,未来会在调用端进行限流
? 服务端会对任意接口的请求所占用的线程数进行控制 ,防止单个接口某个方法用尽线程池所有可用线程
服务隔离
? 服务端默认会监控每个接口的超时情况 ,超时多的接口请求会自动路由到独立的慢线程池处理 ,如果该接口恢复正常 ,则会回到正常共享线程池处理
? 也可以为某些接口方法配置独立的线程池 ,剩余的使用公共池
服务监控分析与告警
? 通过监控系统CAT (已开源 )分析调用链路 ,包括调用量、TP耗时、异常、请求及响应大小、区间耗时明细、QPS等
项目地址:https://github.com/dianping/pigeon
采用的监控系统:Central Application Tracking
项目地址:https://github.com/dianping/cat
监控系统环境搭建:http://www.cnblogs.com/softidea/p/5719331.html