FreeWheel业务系统微服务化过程经验分享

2016 年下半年开始,FreeWheel 开始将其业务系统从 Rails 单体应用逐步迁移到微服务,同时技术栈从 Rails 改为 Golang,两年之后,整个迁移接近尾声,FreeWheel 业务系统技术团队对外分享了它们在微服务化过程中的经验。

原有架构的问题

FreeWheel 是一家为客户提供数字视频广告管理技术和服务的公司。其业务端产品需要对接客户,提供视频广告投放优化界面,类似于 Web ERP,该业务系统采用 Rails 技术栈开发,其架构是一个典型的三层架构。

这个系统经过近十年的研发和迭代,代码量达到数十万行,业务的特殊性和代码的复杂度让团队的维护和新功能研发越来越困难:

  • 广告系统本身业务逻辑非常复杂,体现在它的数据实体很多,业务流程很长,分支逻辑很多。这样导致代码修改起来困难,可能改一个会影响好几个其它模块,同时维护也变困难,后来者不清楚模块具体实现细节,难以接手继续开发。
  • Ruby 本身是一个高度动态的语言,通过解释执行。带来的坏处就是团队大了,维护成本很高,当发现问题的时候很难通过看代码知道问题出在哪儿,而且它也缺乏静态检查的工具,导致代码质量难以控制。

由于以上这些原因,FreeWheel 架构组决定将系统进行拆分,通过模块化来梳理和简化业务逻辑,当时微服务已经有不少公司采用,并取得了不错效果,架构组在调研之后决定采用微服务架构。同时团队还决定切换技术栈,选择更利于开发维护的语言和工具,基于种种理由,团队最后选择了 Golang。

从 Rails 到 Golang

在实施微服务时,很多团队都选择 Java 技术栈,毕竟有 Spring Cloud 等较为成熟的框架可以使用。FreeWheel 选择 Golang,则基于以下几个原因:

  • Golang 本身上手门槛较低,有优秀的标准库可以快速开发应用,同时,Golang 生态也逐渐丰富,有不少大型项目采用;
  • 微服务化过程中需要使用容器,FreeWheel 很早就确定使用 Docker 和 Kubernetes 作为容器化技术栈,而这两者都是 Golang 开发,不管是熟练掌握容器技术,还是要进行一些 K8S 扩展开发、定制,使用 Golang 都顺理成章;
  • 新的技术栈不仅仅是业务系统团队使用,公司在研发新业务时也会使用,FreeWheel 之前各个系统的技术栈各不相同,有用 C++,有用 Java,也有用 Ruby 的,因此从大家都能接受的角度,Golang 也是一个较好的选择;
  • 公司在美国的技术团队有过使用 Golang 的经验,并在内部做过分享,通过这种方式团队能快速了解这门新语言特点,遇到难题也可以向公司内部请教。

值得一提的是,FreeWheel 新的 Golang 应用都是由原来的 Rails 工程师研发的,为了让这些工程师顺利转移到新的技术栈,公司通过内部分享、黑客松等方式帮助团队成员快速上手,在短时间内即形成了战斗力。

迁移策略

FreeWheel 业务系统在决定重构时,新的需求仍然源源不断的产生,不能把需求停掉转而研发新系统;同时团队人力有限,不可能划出一部分人来转型微服务研发,因此,团队在一边研发原有 Rails 应用的同时,一边做新的系统研发。

在设计服务的粒度上,因为 FreeWheel 业务系统本身已经有了一套成熟的数据模型,这个数据模型可以反映经营的业务概念,也作为大家共同的语言,围绕这些数据模型是业务实体,团队在确认出三到四个核心业务实体后,围绕这些先创建了大概三到四个服务,最终创建的服务在 10 个左右,服务的粒度其实比较粗。FreeWheel 采用微服务的架构模式,其实主要也是吸收微服务架构中服务治理的一些实践经验,在初期服务设计上先从粗粒度开始。

在进行微服务改造时,团队还面临一个比较大的问题,就是原有架构使用单个数据库,里面有上千张表,数据分支很多,难以进行拆分。为了解决数据访问问题,专门设计了一个数据访问层,将原系统和新系统的数据库连接都通过数据访问层进行。数据访问层(内部简称 DAL)的设计目标包括:

  1. 对业务数据的访问进行全局路由,控制和优化,比如对不同客户的数据做软隔离,读写分离等;
  2. 在不分库的情况下,实现不同服务对数据的分治;
  3. 将应用与数据库具体实现隔离,为今后拆分数据库以及应用多种数据源做准备。

其基本架构如下图所示:

最后,FreeWheel 还需要解决上线问题,因为面向大 B 类客户,需要保证新老系统切换的平滑稳定。在这方面,对已开放的 Open API,FreeWheel 都保证接口和输入输入不变,通过添加一层适配器来将实现切换到新的服务上,同时通过完善的线下测试和 QA,以及线上的灰度发布来解决,并且,代码的单测覆盖率达到 80% 以上以保证代码质量,通过线下流量回放来保证原有系统的业务逻辑能够顺利完成。

微服务技术选型

由于 FreeWheel 业务系统功能较为单一,服务间的复杂交互不多,团队规模也不大,因此在进行微服务改造时较多依赖 Kubernetes 提供的原生能力,以及在它基础上开发的扩展来满足需求。

新的微服务架构如图:

具体组件的技术选型如下:

API 网关

API 网关包括认证、权限管理、限流、Metrics 等功能,这一部分为自研。它最初是为了将 FreeWheel 的自定义 token 认证切换到 Auth0 而研发的,一开始就是为了满足需求,逐渐扩展出其它功能,其请求处理流程如下:

 服务框架

服务框架也为 FreeWheel 原 Rails 团队自研的轻量级框架,内部代号 Wheels,该框架借鉴了 Rails 脚手架的理念,基于 gPRC 进行了必要的扩展,比如在 protobuffer 对象中区分空值和未指定等,并集成了已有的数据访问,监控,消息,服务发现等服务,同时提供了一组单元测试,集成测试和面向 docker 和 kubernetes 的构建工具,使业务开发团队能快速开发出一个符合公司代码质量和服务治理标准的服务,而只需关注业务逻辑本身。下图展示了 Wheels 框架所包含的主要组件:

服务注册发现

这部分使用的 K8S 原生 DNS 组件 kube-dns,因为服务框架统一,所以无需进行额外配置或使用开源工具。

配置中心

FreeWheel 的配置中心组件基于 K8S 进行扩展而来,目前业界比较知名的配置中心开源组件有携程的 Apollo,但配置中心其实是 K8S 的一个核心功能,其它的开源库都是在它的 API 基础上封装而来。自研的配置中心与其它相比更有可控性,出了问题方便排查,该配置中心也无需面向业务,而由研发和 DevOps 负责操作,因此无需封装的太多。

 数据总线

这个使用 Kafka 进行服务间的数据交换。Kafka 也是 FreeWheel 其它业务如大数据平台重要的基础设施。

日志

新的微服务架构里包含多个日志,包括 K8S 本身的日志、服务框架产生的日志、在业务中埋点产生的日志等,团队不仅依靠日志做监控和告警,也通过日志来做 debug。对日志收集处理的系统为 ELK。

 监控与告警

使用 Prometheus,前段时间发布了 1.0 版本,也是目前主流的微服务监控框架。

 Service Mesh

使用 Istio,网络治理对于微服务来说是非常关键的一环,而 Service Mesh 可以将开发人员从一些琐碎的关注点中解救出来。FreeWheel 团队主要利用了 Service Mesh 中的断路、连接管理、流量接管、自动重试、全链路跟踪、安全等功能。

微服务化成功要素总结

FreeWheel 的业务系统重构实践,可以说是一个很典型的中小型团队的微服务改造案例,它的经验值得其它团队学习,从中我们可以总结出一些成功经验:

  1. 选择合适的技术栈,可以做到事半功倍,在学习新的技术栈的同时,可以提 升团队的整体实力。
  2. 对于一些功能较为单一的业务系统,用好 Kubernetes,微服务就成功了一半,团队里一定要有对 Kubernetes 非常熟悉、能够搞定它的各种问题的人。
  3. 微服务架构很多时候运维和研发已经不太能分的开,需要研发团队转型为 DevOps,设计并实现新的运维体系。
  4. 从自己的需求出发,简单的以及核心的需求可以自研,较为复杂的可以采用开源库,在研发能力和效率之间取得平衡。

文章转载自InfoQ

原文地址:https://www.cnblogs.com/FreeWheel2019/p/10678561.html

时间: 2024-08-02 21:27:22

FreeWheel业务系统微服务化过程经验分享的相关文章

微信小程序豆瓣电影项目的改造过程经验分享

在学习微信小程序开发过程中,一部分的难点是前端逻辑的处理,也就是对前端JS的代码编辑:一部分的难点是前端界面的设计展示:本篇随笔基于一个豆瓣电影接口的小程序开源项目进行重新调整,把其中遇到的相关难点和改进的地方进行讨论介绍,希望给大家提供一个参考的思路,本篇随笔是基于前人小程序的项目基础上进行的改进,因此在开篇之前首先对原作者的辛劳致敬及感谢. 1.豆瓣电影接口的小程序项目情况 豆瓣电影接口提供了很多相关的接口给我们使用,豆瓣电影接口的API地址如下所示:https://developers.d

网易容器云平台的微服务化实践(一)

作者:冯常健来自: 网易云-共创云上精彩世界 摘要:网易云容器平台期望能给实施了微服务架构的团队提供完整的解决方案和闭环的用户体验,为此从 2016 年开始,我们容器服务团队内部率先开始进行 dogfooding 实践,看看容器云平台能不能支撑得起容器服务本身的微服务架构,这是一次很有趣的尝试. 一旦决定做微服务架构,有很多现实问题摆在面前,比如技术选型.业务拆分问题.高可用.服务通信.服务发现和治理.集群容错.配置管理.数据一致性问题.康威定律.分布式调用跟踪.CI/CD.微服务测试,以及调度

C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 几十套业务系统集中统一授权管理实现经验分享

由于这几年互联网电商的快速发展,快递公司也进入了快速发展的绝好快速成长期.随着社会的强劲需求公司的业绩年年攀新高.快速发展的公司都需要有强大的IT信息系统,硬件设备基本上款到了货也可以到了,但是软件系统就不是那么简单了,需要长期的维护完善才能平稳运行. 公司有几十套业务系统需要快速开发.开发队伍的建设.软件系统的建设.基础平台的建设都堆在了一起,由于我们用了成熟的通用快速开发平台,所有的用户都能集中统一授权.所有的业务系统都有统一的管理后台配置管理,几乎很多精力都放在业务模块的开发上就可以了.

全民拥抱Docker云--Lhotse系统经验分享

前言 "只要站在风口,猪也能飞起来",这碗心灵鸡汤不知道激励了多少英雄豪杰踏上寻风口之路.而现如今,Docker这阵龙卷风呼啸来袭,更让众人生起迎风而上.直冲云霄的欲望.为了找到这风口,数据平台部开始全面拥抱Docker,基于多年的大数据集群管理经验,倾力打造DockerOnGaia云平台(简称Gaia云),并动员将数平自身的核心系统Lhotse.Hermes.Hive.TRE.TDBank等全面接入Gaia云. Lhotse系统作为先锋部队,经过一段时间的改造-验证-灰度,目前现网已

业务初期野蛮生长阶段,微服务化比较麻烦

谈谈后端业务系统的微服务化改造 本文所提倡的微服务,是结合作者所在team自身业务特点来说的,适合自身的场景,是建立在团队人员素质到了,有成熟的基础设施和框架.中间件辅助,流程也规范,包括CI.敏捷等,团队都做好了准确去做这个转变,有足够的能力来实施,微服务化也就是水到渠成的事了. 相反,小团队在前期或者野蛮生长时期,不宜选择微服务,不但影响效率还带来额外的复杂度.成长型或者大公司,有成熟的流程.规范.基础设施.平台等,要想在整条交付链路上加速,就需要投入更多的资源保障微服务化,一切自动化了,能

CIO必看:跨国集团采购部报表系统的建设经验分享

CIO必看:跨国集团采购部报表系统的建设经验分享 引言 福耀集团是国内最具规模.技术水平最高.出口量最大的汽车玻璃生产供应商,产品"FY"商标是中国汽车玻璃行业第一个"中国驰名商标",自2004年起连续两届被授予"中国名牌产品"称号:福耀玻璃股票为上证红利指数样本股,于2009年被上海证券交易所授予"年度董事会奖",并于2011年起,连续三年获颁"央视财经50指数"年度最佳成长性上市公司等等. 随着福耀集团

优云CMDB经验分享之 – 剖析CMDB的设计过程

作为IT管理的核心,CMDB逐渐成为系统管理项目实施的热点.在很多的案例中,由于忽视了CMDB的因素,ITIL的深入应用受到了极大的挑战.同时,由于CMDB是IT管理信息的集中,CMDB也是一个重要的工具和手段. 在CMDB落地过程中需要注意的是,CMDB项目不是一个简单的软件安装过程,而是一个咨询.培训.实施.优化密切结合的综合过程,涉及到平台工具采购.咨询服务.实施服务.培训.甚至扩展开发等内容.同时,一个成功的CMDB项目不能一蹴而就,而是一个循序渐进.持续发展的过程,需要企业后续的投入和

【经验分享】响应式网站项目实操过程中的那些事儿

本次网站改版升级是我来到新公司的第一个项目,需求之初并没有提及要做响应式,在首次评审时领导和研发均认为响应式处理与我们网站相对契合,就这样我开始了我职场生涯中第一个响应式网站设计.下面就跟大家分享响应式网站设计中的那些事儿. 因为本人之前并没有接触过响应式设计,在项目开始前便恶补了一些响应式的基础知识.理论性资料网上众多,为了使各位对响应式有初步印象和认知,我在这里只做简单描述,各位若想要更全面深入的了解可自行百度. 1什么叫响应式设计,为什么要做响应式设计 (1)页面的设计和开发应当根据用户行

【转载】千万级规模高性能、高并发的网络架构经验分享

在开始谈我对架构本质的理解之前,先谈谈对今天技术沙龙主题的个人见解,千万级规模的网站感觉数量级是非常大的,对这个数量级我们战略上 要重视它,战术上又要藐视它.先举个例子感受一下千万级到底是什么数量级?现在很流行的优步(Uber),从媒体公布的信息看,它每天接单量平均在百万左右, 假如每天有10个小时的服务时间,平均QPS只有30左右.对于一个后台服务器,单机的平均QPS可以到达800-1000,单独看写的业务量很简单 .为什么我们又不能说轻视它?第一,我们看它的数据存储,每天一百万的话,一年数据