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