编辑: ok2015 | 2019-08-28 |
有幸参与了58同城多个重大核心系统的设计与研 发工作 sina微博:@58陈春 关于这次分享 主要介绍如何塔建一个跨平台,分布式,高性能,高可用的中间层服务, 以及58.com开源的中间层服务框架(容器)-- Gaea(盖亚) 目录: 1. 设计异构平台高可用,高性能的中间层服务的挑战 2. 常见的解决方案 3. 58.com的解决方案 4. Gaea的设计和实现细节 设计一个异构平台中间层服务有哪些挑战? 异构平台 => 如何跨平台? 如何通讯,采用哪种通讯模型? 采用什么协议? 如何序列化(json, xml, binary …)? 每秒上万(几十万)次的请求 => 如何保证高吞吐,低延时? 7*24不间服务 => 热布署?采用哪种HA方案? 服务有(无)状态,两次请求是否有上下文关系? 服务有(无)事务,如何解决? 是否方便扩展,是否可以通过简单的加机器来解决性能问题? …… 常见的解决方案 .net => WCF, Remoting Windows通信基础 (Windows Communication Foundation) 是基于Windows平 台下开发和部署服务的软件开发包 Java => EJB, RMI Enterprise JavaBean sun的服务器端组件模型,最大的用处是部署分布式应 用程序 WebService C 描述数据的方法:XML C 信息交换的协议:SOAP C 传输协议:HTTP RestFull C HTTP原语封装,回归HTTP本性(get、post、put、delete) C 业界开放api新标准 C 面向资源开发 C 公开目录结构式的 URI netflix, dubbo, Hessian, JBoss-Remoting, xxxRPC….. 其他的一些解决方案 google => Protocol buffer PB是一种用于序列化结构化数据的机制,它具有灵活、高效、自动化的特点. 在Google 几乎所有它内部的RPC协议和文件格式都是采用PB facebook => Thrift Thrift 最初由Facebook于2007年开发,2008年进入Apache开源项目.跨平台通 信中thrift可以作为二进制的高性能的通讯中间件,支持数据(对象)序列化和多 种类型的RPC服务 58想做什么? 让一般的程序员能够快速的开发出 和优秀程序员一样高效,安全,稳定的跨平 台中间层服务 ? 学习成本要足够的低,只需要看很少的文档或看个简单的demo就能快速上手 ? 开发效率要足够高,能够快速的开发出一个高质量的服务 ? 程序运行速度要足够快,能够轻松应对每秒上万次的QPS,占用机器资源 要尽可能的少 ? 运维要足够的方便,各种指标的监控方便运维和定位问题 ? 健状性要足够的好,需要有很好的HA和负载均衡机制 ? 要能够跨平台,58同时有java, c++, .net(少量老项目)项目 怎么做? 服务开发者 => 不需要关心通讯细节 不需要关心序列化细节 不需要关心HA 不需要关心如何跨平台 有很完善的监控和性能计数器功能方便快速定位问题 只专注于具体的业务处理 服务调用者 => 就像调用本地方法一样,其他细节均无需关心 ? 通讯组件 ? 跨平台序列化组件 ? 客户端 ? 服务容器 动态代理 负载均衡 网络通讯 Gaea Client(组件) Gaea Serializer (组件) Gaea Server(容器) Gaea Protocol (组件) 网络通讯 过虑器 服务代理 & 热部署 服务监控 权限控制 等待窗口 Gaea 实现细节 如何跨平台 服务端:Java开发,宿住在Gaea服务端容器里 serializer protocol client Java serializer protocol client C & C++ serializer protocol client .NET serializer protocol client XXX TCP长链接,遵守相同的传输协议 Gaea通讯协议 SFP(传输协议) SDP(数据协议): - RequestProtocol (请求协议: lookup, methodName, paramKVList) - ResponseProtocol (响应协议: result, outParam) - ExceptionProtocol (异常协议:toIP, fromIP, errorCode , errorMsg) Gaea序列化 . 跨平台 => 定义统一的序列化协议 . 序列化出来的数据包要尽可能的小 => 二进制,无元数据 . 支持泛型,支持多重继承 . 使用要尽可能的方便,尽量排除干扰RD的困素,让RD的精力集中在业务 处理上(为什么不用pb?) Gaea Client 请求处理模型 动态代理 java.lang.reflect.InvocationHandler 等待窗口(WaitWindow) 过载保护 一.每一个Server node都有一个请求记数器(请求进来+1 返回后-1) 二.超时时间生成器(保护Client) a. gaea.config配置的超时时间其实是一个种子时间 b. 超时时间生成器根据种子时间和请求记数器的值动态的生成每次请求的 超时时间 三.负载丢弃(保护Server) HA & 负载均衡 .一个服务至少同时部署在两台或以上的机器 . Client在对node进行调度的时候可以配置权重 . Client对Server Node健康检测 . Client重试机制 . 无缝重启: gaea_restart.sh -> 服务端下发重启命令 -> client收到后之后的请求不再转发给这台server -> server达到指定的时间后重启 -> client经过指定的时间周期后偿试链接该server Server端访问权限控制 IP黑白名单: 通过IP黑白名单设置(可是指定的ip,也可以是一个网段)达到对访问者进行 一个比较粗粒度的控制 方法调用授权: 可以细粒度的进行访问限制(具体过程见下图) Server Filters 应用示例: 1. Geae Server协议解析与生成 2. 访问执行情况时时查看MonitorFilter 3. 记录方法被哪些IP调用过? 服务运行状态时时监控器 telnet 运维 来看一个基于Gaea开的demo Just try it~ 第一步:定义接口,打上相关的注解 第二步:写具体的实现,打上相关的注解 第三步:在传输的实体上打相关的注解 Done!!! 服务开发完成 Client端调用示例: Done!!! 客户端如同调用本地方法 Gaea的生产应用 58.com基乎所有的服务都是基于Gaea开发的(大大小小服务加起大约有100 多个) 其中访问量比较高的几个服务: 信息管理服务 (58.com的核心服务,已经生产环境上运行了快三年) QPS: 1.4W 用户管理服务 QPS: 8K 安全性要求比较高的服务: 58交易系统的相关服务 后续 Gaea RoadMap 一.写个Eclipse插件集成到Eclipse方便开发人员调试(像tomcat一样) 二.自动生成不同平台接口的功能 三.应用程序域的概念 四.运维监控平台 关于开源 Gaea开源啦~ 命名为Gaea(盖亚) 之后58.com SPAT所有开源的项目都以希腊神话中的人物名称来命名项目 后续还会有: WF(web开发框架) github: https://github.com/58code/Gaea Q&A 谢谢!