编者按:J2EE异军突起之时,那些2层架构(web+后端)的人必定是崩溃的;而后spring以without ejb革命了,现在spring已渐成全家桶之势。SOA概念兴起之时,ESB相关的厂商大赚,而今老马又携微服务而来,受益者包括企业软件厂商,各云平台厂商等,眼花缭乱渐迷眼,各领风骚好几年!多点生活架构师陈泽洪本着【少谈些概念、多解决问题】的原则给我们分享他们用几个月完成的这一套分布式服务框架。近期中生代社群由ppmoney敖小剑同学分享的微服务架构非常干货,几近跨省追杀;本文同样是这样的干货,很干...

选择开源产品的时候,需要根据自己的实际情况,做必要的改造才能打造出真正适合自己的产品。多点生活通过一系列的减法和加法,打造出了自己的分布式服务化平台。

陈泽洪,多点架构师,此前曾在京东、蚂蚁金服工作

背景

多点生活成立于2015年初,1亿美元天使轮,和物美超市深度合作,目标是打造线上线下一体化的全渠道零售平台。技术研发团队基本上全  在成都,在成都JAVA好招人,所以基本上在多点内部就是JAVA一统天下了,也没有去考虑其他的语言了。10几个人,2个月时间,上线了第一版的业务系统,麻雀虽小五脏俱全,从APP到H5,从商品到购物车,从订单到交易,从会员到配送履约,十几个系统。为了快速开发,全部基于REST API,通过一个叫API Center的中心服务进行中转服务调用。

图1、早期的API Center

随着业务量的增长,3个月时间用户量就超过200万,业务系统不断增加,服务之间的调用变得越来越复杂,没有谁能完全理清楚服务之间的关系了。同时APICenter慢慢成为瓶颈,也占用了我们不少服务器资源,作为创业公司,还是要精打细算的。而且APICenter作为服务中心路由节点,所有的服务调用都走这里通过。有一次,我们的一个工程师出了一个bug,在一个死循环中不停调用某个服务,直接把APICenter搞挂了,所有服务都不能提供服务,只能简单粗暴重启服务或干掉问题服务。

图2、业务发展一年后的全景图

创业公司,时间宝贵,拿来主义

为了解决上面的问题,迫切要有一套分布式服务框架来解决这些问题,由于时间紧,人手有限,从头开发一个肯定是来不及了。所以我们本着拿来主义的原则选择了一个开源的框架来用,那就是dubbo。虽然dubbo并不是市面上最好、最新的服务框架,但是我们很多人对dubbo都很熟悉,使用成本低,于是就选择了它,本身我们只需要支持JAVA语言就够了。

先做减法,再做加法

dubbo相对来说是一个很老的框架了,功能很庞杂,有很多我们用不上的东西,同时有很多我们想要的功能却没有。于是我们第一步先做减法:精简内核,去掉所有不要的功能,干掉了差不多一半的功能;第二步:调整策略,修改测试发现的bug;第三步:添加我们必要的功能。2个人,1个月时间,就基本上改造完成了符合我们预期的分布式服务化框架。

图3、多点服务化框架DSF

核心功能点:

1RPC [保持不变]

这块基本上没有做什么调整,直接沿用dubbo基于netty的长连接的传输,hessian的序列化,在满足我们的业务调用量的前提下,不引入更多的依赖,保持简单就好。

2、服务注册和发现[改进]

我们是基于Zookeeper来做服务注册与发现,也没有什么大的问题,而且几乎是现成的解决方案,不需要开发什么代码。随着我们开始多机房(混合云)部署,就创建了一个大的ZK集群,不同机房的应用优先连本地的ZK节点,优先调用本地机房的服务,当本地机房的服务不可用的时候,自动跨专线调用另外机房的服务。

这些功能本身dubbo并没有提供,需要我们代码来实现。但是由此带来了不少的运维复杂度,我们需要针对不同机房的应用部署打包配置不同的参数,以适应优先本地机房配置。于是我们就开发了我们自己的配置中心(Admiral),可以用同一个打包部署文件,自动适配不同机房不同的参数来达到本地机房优先的原则。

图4、优先注册和调用本地服务

图5、基于配置中心,自动获取配置参数

3、监控与报警[新增]

监控对于一个系统来说是就像人的耳目,不可或缺。我们就在框架层无侵入的采集服务调用的关键指标:调用次数、响应时间、错误率等,然后基于开源的监控系统open-falcon来存储监控数据,通过内部的DMC报警平台通知应用负责人。对于监控数据,我们还从两个维度去监控数据:服务提供方维度,服务使用方维度。这样我们就可以在监控数据报警时,发现是哪一方出现问题了。比如,调用方发现响应时间很高,但是服务提供方的响应时间很低,那么问题就出在服务调用方或提供方到调用方的网络有问题。

图6、基于Open-falcon的服务调用监控

4、服务依赖管理[新增]

作为分布式服务平台,我们迫切需要知道服务的部署情况,服务的依赖情况,需要很直观的查看和搜索。这样就能清楚明白服务的调用关系,在升级服务之前可以一键邮件通知依赖方。同时还可以通过不同维度查看服务依赖:服务提供方视角、服务使用方视角、应用视角、服务视角、机器视角,以满足不同场景的需求。

图7、可视化的服务依赖关系

图8、服务依赖的明细

5、鉴权控制[新增]

很多时候有些服务是不希望别人随意调用的,就需要增加鉴权管理。dubbo本身只提供服务注册层面的管理,没有提供服务级别的健全管理。我们就在框架层统一增加了鉴权token支持,通过简单的xml配置,只有提供了鉴权token key的调用方才能正常调用,否则会被拒绝。

6、动态配置[改进]

有时候业务需要在不重启服务的情况下动态调整参数,比如:权重、超时时间等。dubbo原生的动态配置很简陋,几乎不太可能直接拿到生产环境使用。于是我们做了不少改进,在web页面上可视化动态调整参数,还可以指定参数生效的scope:服务提供方,服务调用方,全局配置,单一实例配置,应用级别,服务级别等,极大方便了线上发布调整。

图9、在线动态参数调整

7、在线验证[新增]

因为我们用的是基于二进制协议的RPC调用,要想像rest api一样用postman之类的工具简单方便地无client调用验证服务API,其实是很麻烦的。为了解决有些纯后台的服务发布上线验证,我们就增加了在线验证功能,通过泛化调用,无需写调用方代码,直接在线可视化调用服务进行验证,极大地方便了研发测试验证。

图10、在线服务验证

8、调用链跟踪[待实现]

作为分布式系统,服务的调用链跟踪对于问题的排查是非常有帮助的,鉴于开发人手不足,我们暂时没有提供这个功能,后续计划整合pinpoint,提供完善的调用链跟踪。

总结

通过这一系列的减法和加法,很快就打造出了多点生活自己的分布式服务化平台,其实市面上很多的服务化框架只提供了基本的RPC调用和服务注册,对于服务治理和监控,以及动态管理和鉴权控制几乎很少有开源的。在大家选择开源产品的时候,需要根据自己的实际情况,做必要的改造才能打造出真正适合自己的产品。

分布式服务框架DSF(Distributed Service Framework)相关推荐

  1. java配置dsf,基于Spring-DM实现分布式服务框架(DSF)(一)

    评论 # re: 基于Spring-DM实现分布式服务框架(DSF)(一) 2008-04-14 17:03 赵斌 BlueDavy,你好: 最近正在研究关于"服务框架"的内容,看 ...

  2. 多点生活的分布式服务框架DSF

    背景 多点生活成立于2015年初,1亿美元天使轮,和物美超市深度合作,目标是打造线上线下一体化的全渠道零售平台.技术研发团队基本上全  在成都,在成都JAVA好招人,所以基本上在多点内部就是JAVA一 ...

  3. java配置dsf,基于Spring-DM实现分布式服务框架(DSF)(二)

    在上篇分析完了在V 0.7需要干的活后,开始细化其中的实现细节,由于技术细节和之前想的有点不同,在细化的同时也稍做了调整,系统的架构仍然保持不变,在这篇blog中来看看实现每项任务的技术细节,之后就可 ...

  4. 分布式服务框架学习笔记2 常用的分布式服务框架 与 通信框架选择

    传统垂直架构改造的核心就是要对应用进行服务化,服务化改造使用到的核心技术就是分布式服务框架. 分布式服务框架演进 应用从集中式走向分布式 大规模系统架构的设计一般原则就是尽可能地拆分,以达到更好的独立 ...

  5. DSF学习1_Dubbo详解(一)分布式服务框架的概念理解

    Dubbo分布式服务框架的概念理解 Dubbo是是一个高性能,基于Java的RPC框架,由阿里巴巴开源.一个分布式的服务框架.可以实现SOA(面向服务的架构)架构. Dubbo使用的公司:京东.当当. ...

  6. RSF 分布式服务框架设计

    为什么80%的码农都做不了架构师?>>>    是时候设计一个分布式服务框架了.我先将它定名为 Hasor-RSF,"RSF"为 Remote Service F ...

  7. 分布式服务框架——Dubbo

    1. Dubbo 概述 1.1 什么是分布式系统 <分布式系统原理与范型>定义: "分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统" 分布式系 ...

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

    2019独角兽企业重金招聘Python工程师标准>>> 转自:http://www.ibm.com/developerworks/cn/opensource/os-cn-zookee ...

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

    FROM: http://www.superwu.cn/2014/11/26/1461 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它涉及到了paxos算法.Z ...

最新文章

  1. 利用CodeIgniter中的Email类发邮件
  2. 【MatConvnet速成】MatConvnet图像分类从模型自定义到测试
  3. Entity Framework 与 LINQ to SQL
  4. TCP/IP,Http,Socket,XMPP的区别
  5. SqlServer自定义聚合函数
  6. 33种编程语言为您送上祝福,新年快乐!
  7. sql mysql assoc和row_mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别
  8. 45.Android 第三方开源库收集整理(转)
  9. python定时任务启动与停止_对Python定时任务的启动和停止方法详解
  10. 基于R语言分析决策树和随机森林(1)
  11. excel找出重复值
  12. java field.gettype,Java Field getType()用法及代码示例
  13. 国产计算机系统有哪些,国产电脑操作系统有哪些(华为鸿蒙系统笔记本电脑)...
  14. 前方荆棘遍地,愿砥砺前行
  15. 荷包app软件测试,智能分贝测试仪app
  16. 最新信用卡养卡技巧,大神分享
  17. 【转】dB的计算方法
  18. sublime text3入门教程
  19. 量子信息 量子计算机的新闻,应用挑战知多少?美国学界公布量子信息路线图...
  20. rabbitmq在centos7下安装

热门文章

  1. 惨遭面试官吊打高并发系统设计,回来学习 2400 小时后成功复仇
  2. 微信视频号强制置顶朋友圈:盈利不可牺牲用户体验
  3. vue网站第三方登录-微信登录
  4. powermock静态类_使用Powermock对静态内部类单例模式模拟
  5. 身心健康类应用潮汐App完成近千万Pre-A轮融资,熊猫资本投资...
  6. Z-Library使用教程
  7. 问剑java_中秋国庆佳节 十大Java手机网游推荐
  8. http 状态码499
  9. 基于强化学习的多智能体框架在路由和调度问题中的应用
  10. 手写jQuery框架