服务框架 Pigeon 的设计与实现
1、服务框架Pigeon架构
- 监控系统 - CAT,负责调用链路分析、异常监控告警
- 配置中心 - Lion,负责一些开关配置读取
- 服务治理 - Governor
一个interface定义为一个服务,每个服务有唯一标识

2、主要模块

3、服务注册与发现
- 注册信息包括service name、ip、port、group等
- 服务提供方初始化完成后自动注册 ,也可以通过api或管理端注册
- 服务调用方通过service name去发现服务

4、服务注销
- 服务地址通过zookeeper持久节点存储 ,避免临时节点的不稳定
- 关闭tomcat时会调用pigeon脚本去注册中心摘除本机服务地址
- 对于残留的无效地址 ,有独立的心跳服务会检测无效的服务地址进行zookeeper删除
- 客户端对于无效的服务地址 ,内部也有心跳检测机制等来保证

5、编程方式、序列化
- 基于Hessian序列化 ,通过netty实现自定义TCP协议格式 ,开发成本低 ,通过java interface定义服务接口
- 基于Thrift序列化 ,通过netty实现自定义TCP协议格式 ,性能更高 ,开发成本稍高 ,通过定义IDL或annotation方式定义服务接口 ,更方便接入其他语言 ,thrift会有一些制如方法不支持重载、struct不支持继承

6、调用模式
- Sync ,同步等待返回调用
- Future ,可实现并行发出多个请求 ,总耗时是最慢的请求的执行时长 ,推荐方式
- Callback ,发出结果不等待返回 ,结果回调 ,完全异步化
- Oneway ,无需返回结果
7、客户端心跳
- 心跳线程客户端发起 ,定期发送 ,服务端响应 ,连续5次不成功则在本地路由缓存里摘除该服务端节点 ,摘除后下次尝试重连

8、客户端负载均衡
- 多种负载均衡策略 ,默认是自适应策略 ,客户端会计算发往每个服务端节点的在途请求数 ,新的请求会优先选择在途请求数最小的节点发送
- 预热控制 ,针对服务端某个刚启动的节点 ,客户端按从慢到快的频率 ,将请求逐步发往这个节点 ,防止服务端刚启动的节点大量请求进来导致大量超时
- 自定义负载均衡策略
9、服务限流
- 可以在服务端对某一个服务接口的某一个方法 ,针对不同的调用方应用的请求进行流量QPS限制 ,超出阀值后调用端会收到服务拒绝异常 ,未来会在调用端进行限流
- 服务端会对任意接口的请求所占用的线程数进行控制 ,防止单个接口某个方法用尽线程池所有可用线程
10、服务隔离
- 服务端默认会监控每个接口的超时情况 ,超时多的接口请求会自动路由到独立的慢线程池处理 ,如果该接口恢复正常 ,则会回到正常共享线程池处理
- 也可以为某些接口方法配置独立的线程池 ,剩余的使用公共池

11、服务降级
- 若依赖的服务可以降级处理,pigeon提供多种服务降级策略
- 降级的结果可以自动返回默认值(支持json和groovy配置),或抛出降级异常,或mock对象

12、多IDC支持
- 一个地域多个IDC,优先调用同地域的服务,也可配置优先调用同IDC的服务,同地域不同IDC可配置比例

13、内置HTTP服务
- 内置4080端口的HTTP服务,可以查看单机实时信息如QPS、注册状态、调用和被调用状态、内部线程池状态等
- 通过HTTP+(json/hessian)可以被其他应用通过GET/POST调用,未来会提供更好的REST服务
- 单机服务测试,通过ip:4080/services服务测试页面,也可以通过管理端同一入口进行测试

14、服务监控分析与告警
- 通过监控系统CAT分析调用链路,包括调用量、TP耗时、异常、请求及响应大小、区间耗时明细、QPS等


15、服务治理
- 服务可用性、耗时(平均、TP99等)排行运营日报
- 调用深度过长(>4)统计
- 出度、入度过大的服务,过大的服务设计
- 过长的超时时间统计
- 检测循环调用风险
- 检测可能可以并行调用的服务
- 梳理核心服务性能冗余度,基础底层服务建议采用异步提供服务吞吐量
16、微服务的一些实践--基础设施标准化
- 标准化的运行环境,如无特殊情况,线上业务的虚拟机KVM或Docker配置一样
- 标准化运行容器如Tomcat
- 标准化环境标识,如每台机器固定路径的appenv文件,env=production,文件内容标识机器属于线上环境还是测试环境
- 标准化应用名称规范,每个应用有一个唯一名称,如war包下放置一个app.properties,app.name = xxx-xxx-service
- 统一的开发语言
- 标准化发布工具,可以实现统一war包发布,jar包版本升级限制
- 统一的服务通信框架
- 统一的配置中心
- 统一的数据库、KV等存储访问层
- 统一的MQ
- 统一的监控系统
- 底层存储如MySQL、KV等尽量保证一个或少数几个服务访问,每个应用只能访问自己的存储
- 面向业务领域定义服务(interface),每个服务高内聚,一个应用可能多个服务
- 按业务产品线规划应用,理解业务本质,根据业务发展情况进行服务的拆分或重构
- 组织结构按业务产品线划分,做好微服务需要组织结构支持
备注
- Pigeon项目地址:https://github.com/dianping/pigeon
- CAT项目地址 :https://github.com/dianping/cat
服务框架 Pigeon 的设计与实现的更多相关文章
- 美团大众点评服务框架Pigeon
服务框架Pigeon架构 • Pigeon提供jar包接入 ,线上运行在tomcat里 • Monitor-CAT ,负责调用链路分析.异常监控告警等 • 配置中心-Lion ,负责一些开关配置读取 ...
- RSF 分布式 RPC 服务框架的分层设计
RSF 是个什么东西? 一个高可用.高性能.轻量级的分布式服务框架.支持容灾.负载均衡.集群.一个典型的应用场景是,将同一个服务部署在多个Server上提供 request.response 消息通知 ...
- “一切都是消息”--MSF(消息服务框架)入门简介
“一切都是消息”--这是MSF(消息服务框架)的设计哲学. MSF的名字是 Message Service Framework 的简称,中文名称:消息服务框架,它是PDF.NET框架的一部分. 1,M ...
- “一切都是消息”--iMSF(即时消息服务框架)入门简介
“一切都是消息”--这是iMSF(即时消息服务框架)的设计哲学. MSF的名字是 Message Service Framework 的简称,由于目前框架主要功能在于处理即时(immediately) ...
- 使用微服务架构思想,设计部署OAuth2.0授权认证框架
1,授权认证与微服务架构 1.1,由不同团队合作引发的授权认证问题 去年的时候,公司开发一款新产品,但人手不够,将B/S系统的Web开发外包,外包团队使用Vue.js框架,调用我们的WebAPI,但是 ...
- 基于Spring-Cloud的微服务框架设计
基于Spring-Cloud的微服务框架设计 先进行大的整体的框架整理,然后在针对每一项进行具体的详细介绍
- .NET Core/.NET5/.NET6 开源项目汇总6:框架与架构设计(DDD、云原生/微服务/容器/DevOps/CICD等)项目
系列目录 [已更新最新开发文章,点击查看详细] 开源项目是众多组织与个人分享的组件或项目,作者付出的心血我们是无法体会的,所以首先大家要心存感激.尊重.请严格遵守每个项目的开源协议后再使用.尊 ...
- 基于netty轻量的高性能分布式RPC服务框架forest<下篇>
基于netty轻量的高性能分布式RPC服务框架forest<上篇> 文章已经简单介绍了forest的快速入门,本文旨在介绍forest用户指南. 基本介绍 Forest是一套基于java开 ...
- 基于netty轻量的高性能分布式RPC服务框架forest<上篇>
工作几年,用过不不少RPC框架,也算是读过一些RPC源码.之前也撸过几次RPC框架,但是不断的被自己否定,最近终于又撸了一个,希望能够不断迭代出自己喜欢的样子. 顺便也记录一下撸RPC的过程,一来作为 ...
随机推荐
- Qt编写数据可视化大屏界面电子看板9-曲线效果
一.前言 为了编写数据可视化大屏界面电子看板系统,为了能够兼容Qt4和嵌入式linux系统,尤其是那种主频很低的,但是老板又需要在这种硬件上(比如树莓派.香橙派.全志H3.imx6)展示这么华丽的界面 ...
- PowerDesigner常用命令
在Tools=>Execute Commands下的Edit/Run Scripts,或者通过Ctrl+Shift+X就可以运行脚本.如图: 1.将所有的表名和列名都修改为大写 '******* ...
- python-Web-flask-数据库
3 数据库: Flask-SQLAlchemy 安装及连接 pip install flask-sqlalchemy pip install flask-mysqldb # 数据库链接地址 app.c ...
- 19 个让 MySQL 效率提高 3 倍的 SQL 优化技巧
优化成本: 硬件>系统配置>数据库表结构>SQL及索引 优化效果: 硬件<系统配置<数据库表结构<SQL及索引 本文我们就来谈谈 MySQL 中常用的 SQL 优化 ...
- systemctl daemon-reload
systemctl daemon-reload: 重新加载某个服务的配置文件,如果新安装了一个服务,归属于 systemctl 管理,要是新服务的服务程序配置文件生效,需重新加载. init 和 sy ...
- npm run build 报错 Error: No PostCSS Config found in...
module.exports = { plugins: [ require('autoprefixer')//自动添加css前缀 ] }; 在项目根目录新建postcss.config.js文件,添加 ...
- 最新 网宿科技java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.网宿科技等10家互联网公司的校招Offer,因为某些自身原因最终选择了网宿科技.6.7月主要是做系统复习.项目复盘.Leet ...
- information retrieval (CMU 11642)
1. Heap's law. predict the number of new vocabulary. 参考:https://www.youtube.com/watch?v=JDp12gU-vEQ ...
- UWP 保存音乐或视频缩略图图片到本地
开发项目时,有时需要将本地媒体文件的缩略图保存到本地,下面是源码. 需要打开Package.appxmanifest 功能 图片库 访问权限. <Page x:Class="SaveB ...
- Http请求头和响应头(Get和Post)
HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送 ...