服务框架 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

原文地址:https://www.cnblogs.com/kaleidoscope/p/11571462.html

时间: 2024-10-23 20:25:07

服务框架 Pigeon 的设计与实现的相关文章

美团大众点评服务框架Pigeon

服务框架Pigeon架构 ? Pigeon提供jar包接入 ,线上运行在tomcat里 ? Monitor-CAT ,负责调用链路分析.异常监控告警等 ? 配置中心-Lion ,负责一些开关配置读取 ? Governor-服务治理门户 ? 一个interface定义为一个服务 ,每个服务有一个唯一标识 服务的注册与发现 ? 注册信息包括service name.ip.port.group等 ? 服务提供方初始化完成后自动注册 ,也可以通过api或管理端注册 ? 服务调用方通过service na

RSF 分布式 RPC 服务框架的分层设计

RSF 是个什么东西? 一个高可用.高性能.轻量级的分布式服务框架.支持容灾.负载均衡.集群.一个典型的应用场景是,将同一个服务部署在多个Server上提供 request.response 消息通知.使用RSF可以点对点调用,也可以分布式调用.部署方式上:可以搭配注册中心,也可以独立使用. 渊源 RSF 的核心思想参考了淘宝HSF.Dubbo 等优秀框架.功能上大体相似,但是实现逻辑完全不同.因此没有什么历史包袱.总的来说对比淘宝HSF少了历史包袱,相比Dubbo更加轻量化.而且还支持了虚拟机

消息服务框架

"一切都是消息"--MSF(消息服务框架)入门简介 "一切都是消息"--这是MSF(消息服务框架)的设计哲学. MSF的名字是 Message Service Framework 的简称,中文名称:消息服务框架,它是PDF.NET框架的一部分. 1,MSF诞生的背景 MSF最初来源于2009年,我们为某银行开发的基金投资分析系统,由于银行安全的原因并且这些投资资料属于机密资料,规定必须使用邮件系统来发送这些资料,但是邮件的收发不是直接针对人,而是两端的计算机程序.为

RSF 分布式服务框架设计

是时候设计一个分布式服务框架了.我先将它定名为 Hasor-RSF,"RSF"为 Remote Service Framework 的缩写. RSF的目的是为了提供一种高效的远程服务访问方式,例如"A机器访问在B机器上的一个服务".当然首先它是运行在Java上的,但是我并不希望 Java 成为 RSF的唯一平台. 它应该是分布式的,就是说服务 A 可能会分布在若干台机器内. 当我的应用打算调用这个服务时我应该可以在这若干服务提供的机器上随机调用.这样做的好处是有助于

如何设计一个完善可用的服务框架

上一篇博客整理了一些关于服务框架基础知识的内容,这篇博客,从实际的生产需要出发,谈谈一个完善可用的服务框架,需要包含哪些功能... PS:部分内容参考自<京东基础架构建设之路> 一个完善可用的RPC服务框架,需要包含以下几点: 框架组成 具体功能说明 服务注册中心 服务框架基础知识 管理端 接口管理+配置中心 统一的RPC框架 监控中心+分布式追踪+服务治理+网关 管理端 1.接口管理 提供统一的接口管理和查询入口,比如公共wiki或者类似swagger之类的系统. 功能:定义接口,包括接口描

DICOM:开源DICOM服务框架DCM4CHE 构建

背景: 前一篇博文DICOM:开源DICOM服务框架DCM4CHE 安装中介绍了一款开源DICOM服务框架DCM4CHE,对于开源项目学习的流程是先下载二进制可执行包安装,然后使用测试.在熟悉了大致的功能服务后,从官网下载源代码进行本地构建(Build),进而从根本上了解开源项目的底层框架设计,为后续修复.扩展做准备.本博文是继DCM4CHE安装后的续篇,讲解如何在本地构建DCM4CHE开源项目,文中尽量做到全面,但是由于刚开始接触J2EE领域,且多半都是自学,因此博文中还留有部分未解问题,如有

分布式服务框架 Zookeeper -- 管理分布式环境中的数据

安装和配置详解 Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理等.本文将 从使用者角度详细介绍 Zookeeper 的安装和配置文件中各个配置项的意义,以及分析 Zookeeper 的典型的应用场景(配置文件的管理.集群管理.同步锁.Leader 选举.队列管理等),用 Java 实现它们并给出示例代码. 单机模式 单 机安装非常简单,只要获取

分布式服务框架下,如何做到服务化最佳实践?

“升级服务框架后,性能.可靠性等问题日益明显.服务化之后面临的诸多挑战,怎样分析才能给出实践最优解? 在服务化之前,业务通常都是本地API调用,本地方法调用性能损耗较小.服务化之后,服务提供者和消费者之间采用远程网络通信,增加了额外的性能损耗,业务调用的时延将增大,同时由于网络闪断等原因,分布式调用失败的风险也增大.如果服务框架没有足够的容错能力,业务失败率将会大幅提升. 除了性能.可靠性等问题,跨节点的事务一致性问题.分布式调用带来的故障定界困难.海量微服务运维成本增加等也是分布式服务框架必须

Thrift 个人实战--Thrift RPC服务框架日志的优化

前言: Thrift作为Facebook开源的RPC框架, 通过IDL中间语言, 并借助代码生成引擎生成各种主流语言的rpc框架服务端/客户端代码. 不过Thrift的实现, 简单使用离实际生产环境还是有一定距离, 本系列将对Thrift作代码解读和框架扩充, 使得它更加贴近生产环境. 本文讲述RPC服务框架中, 日志的重要性, 以及logid的引入. 日志不仅包含丰富的数据(就看是否会挖掘), 而且还是线上服务问题追踪和排查错误最好的方式. 日志级别 采用大家喜闻乐见的log4j作为该RPC服