DockOne微信分享(九十七):现有系统实施微服务架构改进经验分享

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 本文讲的是DockOne微信分享(九十七):现有系统实施微服务架构改进经验分享【编者的话】微服务是最近非常热门的话题了,它带来的好处吸引不少互联网公司对现有项目进行微服务架构改进。 本次分享是博主根据自身的项目经验,介绍如何对现有架构进行调整,总结这过程中的相关技术选型,以及如何实施技改,并分享最终取得的非常让人意外的成果。
本文讲的是DockOne微信分享(九十七):现有系统实施微服务架构改进经验分享【编者的话】微服务是最近非常热门的话题了,它带来的好处吸引不少互联网公司对现有项目进行微服务架构改进。 本次分享是博主根据自身的项目经验,介绍如何对现有架构进行调整,总结这过程中的相关技术选型,以及如何实施技改,并分享最终取得的非常让人意外的成果。

大家好,我是凤凰牌老熊,很高兴能有机会和大家交流关于微服务系统建设相关的话题。 近期和微服务相关的话题非常地火,大家看到的各种开发技术网站,微服务都是一个热门的话题。 今天我也来凑凑热闹吧。 将要和大家分享的是我已经做过的一个项目和正在做的一个项目。这两个项目都是对现有系统进行微服务改造,我将重点介绍具体技术改造的内容,为后来者提供借鉴参考。 一些关于微服务的高大上的理论内容,比如微服务的意义、为什么要微服务、限流熔断的理论依据和实现框架等等内容,大家可以参看以前专家的分享。

先介绍第一个项目的技术改造。这是一个数据仓库的建仓项目。 公司的业务数据的读写往往都会分布在多个项目中,这给前端数据展示以及数据分析造成困难。拿视频数据来说,其元数据,如作者、演员等信息,一般会由内容管理系统来生产;而视频流数据,如编码、时长等,是由编码系统来产生的。视频的观看人数、点击数等,又是由统计系统来提供。 而在页面展示的时候,这些内容都要同时显示出来。这就需要一个数据仓库作为中介,将所有数据收集起来,并提供给前端使用。 这个数据仓库系统基本上会对接公司所有的业务系统,提供数据读、写和分析支持。 

我在2014年接手这个项目的时候,已经有一个比较稳定运行的系统。实际技改工作是2015年初开始,2015年底完成。成果主要包括:
  • 数据读写的性能大幅提升。高峰期读的QPS 由 50次/分钟,提升到 2万/秒,日访问量也从2万左右,提升到接近20亿。并可以轻易横向扩展。数据写入能力,也从30TPS/秒,提升到3000TPS/秒。
  • 从单机房服务,扩展到异地三机房同时提供服务。让大部分业务访问都能够在同机房内部完成。跨机房数据同步,正常情况下,在1s内可以完成。
  • 新接口开发投入的effort缩短,从原有的1-2天,进一步缩短到2小时即可上线。

在这过程中,我们在对原有系统做技术升级的同时,也引入了微服务框架来做实现。作为技改项目,我们的原则是:小步快跑,积小胜为大胜。在保证线上系统稳定运行的同时,逐步改进原有系统。 这是一个核心系统,一旦出问题,公司整个业务都会受到影响。技术改造是一个高风险的工作。 除非是上级领导明确要求并同意把这个工作作为考核指标来激励团队,否则很难以推进。 另外也要得到团队成员的支持。 我们启动这个工作前有半年的准备期,其中很大一部分工作是在争取大家的支持。最后也是认可这个架构的人才参与系统改进工作,确保整个工作是按照预定设计逐步推进。

这个项目我们进行的还比较顺利,原来的系统的基础还算比较好。 老项目有三个大工程,实现数据读、写、同步。对外提供的是RPC接口,使用Apache Thrift作为RPC框架和服务器。 数据同时写入到MongoDB和HBase中。MongoDB主要用来支持数据读取,而HBase用来支持数据写入。 

主要问题在于:
  • 虽然原项目设计打算用Mongodb和HBase来做读写分离,实际实现的时候并未达到这个目标。数据是同时写入MongoDB和Hbase的。这经常导致数据不一致,在高峰期写入时,由于MongoDB的特性,经常发生写入失败的情况。
  • 项目规模大,维护困难。几个核心类,每个类规模都超过2000行。新员工入职后,没有半年的熟悉时间,都不敢动核心代码。
  • 开发进展慢。由于这个项目提供的是后台数据功能,一般产品规划时很容易漏掉这里的工作。当想起来需要支持的时候,给的开发时间都不多。

需要我们在架构和流程上做调整。具体来说,在微服务化的层面,我们做了如下工作: 

1. 建立服务网关

这是一个很重要的工作,有了网关的支持,我们就可以根据需要把流量在新老系统之间切换。我们采用的是zookeeper和网关服务来实现。所有服务注册到zookeeper上,网关服务根据zookeeper的注册项来将用户请求按比例打到具体的工作机上。这比直接访问工作机会增加1ms左右的开销。在网关上使用Netflix Hystrix来实现熔断和限流。

2. 细分业务,读写分离

一提到读写分离,很多人直观概念是使用主从的方式来实现。 实现上还需要根据业务情况来详细分析。 这个项目中,我们将数据写入场景做了详细的分析,按场景来拆分原有数据读写接口。 在写入上,我们按照场景拆分为如下接口:
  • 高速写入。主要用于离线分析结果入库。 采取的方案是分析数据通过MapReduce、Spark等框架写入到Kafka中,我们接受Kafka的数据,灌入到HBase中。 每天变更数据在千万量级,1小时左右时间完成写入。这些数据变更无需实时通知业务方。
  • 中速写入。主要用于支持线上数据的入库。数据通过RPC服务接口直接入库到Hbase中,支持每秒在3000TPS左右的写入。
  • 低速可靠写入。主要用于支持人工生产数据入库。数据也是通过RPC接口来写到HBase中。数据写入后,通过消息机制来通知各业务方相关的改动。

在读取功能上,我们也拆分为两类工作:
  • 可靠读取,主要用于支持数据生产工作。同一条数据会有不同业务方来通过工作流来写入,后写入者需要通过上一个写入者的数据来确定写的内容。这种情况,要求能够随时读取到可靠的数据。 对于这些读取,我们是直接将请求打到持久化库中(Hbase)。
  • 高速读取,主要用于支持线上数据查看。这类操作一般对数据的实时性要求不高。我们采用Couchbase来做缓存,支持线上读取。 废弃早期的MongoDB。我们一个Couchbase可以轻松支持线上上万的QPS。

这就涉及到数据同步问题了:
  • 读写库之间的数据同步,我们通过MQ(Apache ActiveMQ,桥接)来实现。 数据写入到HBase时,发出Message。读库接收到Message之后,更新自己的数据。
  • 跨机房数据同步,我们也是走的MQ。相对来说,MQ对网络不像数据库内部同步机制这么敏感。 在网络出问题的时候,MQ能够尽快恢复。同时监控起来也方便。

这里有一个小细节,实际上跨机房的Couchbase数据同步,我们也是走的MQ。在每个机房接受MQ之后更新Couchbase的数据。 我们的Couchbase定位于缓存,仅保存热数据。从实践中发现,不同地域的人,关注的数据还是不一样的。这导致Couchbase的内容差异不少。

3. 接口拆分,微服务化

有了网关的支持,明确拆分目标和架构后,我们就可以将原项目中庞大的实现类做拆分,按照服务来切分,建立Project。每个Project仅实现不会超过5个接口,这些接口都是高内聚的、同功能的,仅仅是参数略有不同。 拆分之后,每个项目中的实现类都很少,不会超过10个,而且每个类的规模也很小,代码行数不会超过300行。 新员工入职后,都能够立即上手。

4. 完善基础设施

在微服务环境上,我们采用Git做版本控制,GitLab做代码审核, Jenkins来支持自动发布和上线。正在小规模试用Spring Cloud,效果还不错,后续会继续推广。

这是第一个项目的情况。第二个项目是我当前正在做的。这是一个支付系统,面临的情况比第一个项目复杂多了,也是更典型的一个项目。原系统是SSH框架,很难想象支付系统会采用这个技术选型。不过大部分现存的web系统也都是采用这个框架,这个改造可以为大家提供更相似的实战经验。老系统规模庞大,每个项目都有超过1000个类,最大的一个项目有3000多个类。由于项目正在进行中,可以分享的内容还不多。项目完成后,争取有机会和大家一些再做交流。 目前可以分享的要点主要有:
  • 这个项目我们采用Spring Cloud来作为微服务的框架。
  • 我们将系统拆分2个大层,不包括前端系统。一层是对外提供的Web服务,采用http/json。 一层是业务逻辑层,供Web服务层调用,采用RPC来实现。
  • Web层采用Spring Boot来实现;
  • RPC层采用Apache Thrift 来实现。
  • 服务网关使用Nginx + Lua实现Load Balance、限流、服务自动发现。
  • 基础设施上,仍然是Git + GitLab + Jenkins。

关于这个项目的进展,以及项目开发中的一些想法和设计,大家可以关注我的公众号“凤凰牌老熊”,或者访问 个人博客 ,谢谢。

Q & A

Q:服务网关使用Nginx + Lua 方案有考虑过吗?
A:有,我第二个项目就用这个方案来做,正在做。
Q:我想问个问题,微服务后分布式事务如何处理的?
A:非常好的问题。第一个项目没有这方面的问题。第二个项目,支付项目,事务处理问题就很突出。 网上有不少分享,关于如何使用MQ来做分布式事务的。不过我们用的方式比较简单粗暴。 那就是去掉分布式事务,追求最终一致。 从实际情况来看,这已经能够满足绝大部分的场景需求了。
Q:关于ZooKeeper / Curator+ 自己实现的发现服务来做服务的自动注册和发现,能否详细一点说明?
A:Apache Curator是对ZooKeeper API的一个封装,支持事件处理和重试,和Spring Framework也集成得很好。在服务注册实现上,我们是在服务提供方通过Curator API来写入到ZooKeeper上,服务消费者从ZooKeeper上来发现所需要的服务。
Q:1-5个内聚的接口一个project。 能在详细下么?
A:内聚的接口,指这些接口功能相同,主要是输入参数不一样。比如检索的接口,有按关键字检索,有按作者 + 时间的检索。这样的接口,可以放在同一个项目里面。但是根据ID来读取的接口,和这个检索接口,就是不同的项目。 这样控制项目规模不会太庞大,也便于维护。
Q:我有个问题,你们这个项目一定有很多微服务的jar包,这是jar包在服务器上是怎么分布的?
A:对Web接口类型的微服务,其实和普通的项目一样,每个项目就管自己的jar包以及它所依赖的jar包。 也有人会把所有的jar包汇总起来打成一个大jar包,这种方式,容易出现资源文件被覆盖的情况,也不容易更新,不推荐。
Q:RPC为什么不用国产Dubbo啊?
A:这是个好问题,我们经常被问这个问题。 Dubbo是个不错的框架,相对微服务来说,还是太重了。 而且,性能上,比Thrift 还是要差不少。 所以我们就直接上Thrift了。
Q:支付的这个需要对接多个银行么?
A:需要,我们现在对接了快10个银行,还在对接更多的银行。除了银行,第三方支付、外卡等,也都在接。
Q:服务网关重点需要关注那些点?
A:我们实际有两个网关,一个是对外的Web接口服务网关,关注的是Load Balance以及可靠性。 特别是服务重启的时候,网关要提前解除注册,重启之后,网关要延后注册上。 这有不少成熟的组件可以用,不一定像我们这样自己开发。 RPC网关,也是要注意稳定性和性能,以及网关决不能和业务耦合。
Q:微服务是按表来拆分的,那么是一个服务自己连一个数据库还是有统一得数据层呢?
A:RPC层的微服务,基本是按表来拆分了,自己连一个数据库。这里实际也分两层,数据访问层和业务逻辑层。如果业务逻辑很薄,就合并成一层了。
Q:用 Thrift 做 RPC,服务发现也是自己做的吗?
A:是的,这个用Apache Curator比较容易实现,我们就自己搞一个。
Q:Hbase和mongo读写分离这块能具体说一下嘛? 和mongo副本集比较有啥优势么?
A:这个问题就是涉及到如何使用数据库的问题。每个数据库都有自己的优势,比如HBase写入性能极好,上万的TPC都没问题,但是读取的性能就差了,就小几千。 Couchbase读取的性能极佳,但是写入就很一般。 Redis读写都很不错,就是不能支持太大粒度的数据,以及容量有限制。 MongoDB似乎比较尴尬,功能很全面,但是读写都一般。
Q:Couchbase通过MQ实现跨机房同步是怎么实现的?
A:在主流程中,数据修改的时候会发出一个Message,监听程序接收到这个消息后,去更新couchbase中的数据。 采用MQ的原因,在于它对网络波动不像数据库直接同步那么敏感。

以上内容根据2016年11月29日晚微信群分享内容整理。分享人李雄峰,程序员 & 架构师,来自中科大的本科,研究生在软件所学习。先后在中科辅龙、三星(中国)研究院和国内一些大型的互联网公司呆过。在中科辅龙公司负责电子政务内容管理系统建设,负责研发龙驭系列产品的研发,这款产品最终实施到2000多个电子政务网站上,期间也参与了一些支付反洗钱以及支付系统的建设。之后在三星中国研究院,负责自然语言处理(NLP)以及智能家居相关项目。智能家居项目在2014CES消费电子展上作为三星重点项目推介。2014年开始加入爱奇艺公司,负责数据仓库和支付系统的建设。 DockOne每周都会组织定向的技术分享,欢迎感兴趣的同学加微信:liyingjiesz,进群参与,您有想听的话题或者想分享的话题都可以给我们留言。

原文发布时间为:2016-11-30

本文作者:李雄峰

本文来自云栖社区合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。

原文标题:DockOne微信分享(九十七):现有系统实施微服务架构改进经验分享

相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
  相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情: https://cn.aliyun.com/product/hbase   ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
26天前
|
监控 安全 API
使用PaliGemma2构建多模态目标检测系统:从架构设计到性能优化的技术实践指南
本文详细介绍了PaliGemma2模型的微调流程及其在目标检测任务中的应用。PaliGemma2通过整合SigLIP-So400m视觉编码器与Gemma 2系列语言模型,实现了多模态数据的高效处理。文章涵盖了开发环境构建、数据集预处理、模型初始化与配置、数据加载系统实现、模型微调、推理与评估系统以及性能分析与优化策略等内容。特别强调了计算资源优化、训练过程监控和自动化优化流程的重要性,为机器学习工程师和研究人员提供了系统化的技术方案。
146 77
使用PaliGemma2构建多模态目标检测系统:从架构设计到性能优化的技术实践指南
|
1月前
|
运维 监控 持续交付
微服务架构解析:跨越传统架构的技术革命
微服务架构(Microservices Architecture)是一种软件架构风格,它将一个大型的单体应用拆分为多个小而独立的服务,每个服务都可以独立开发、部署和扩展。
197 36
微服务架构解析:跨越传统架构的技术革命
|
20天前
|
机器学习/深度学习 算法 数据可视化
基于深度混合架构的智能量化交易系统研究: 融合SSDA与LSTM自编码器的特征提取与决策优化方法
本文探讨了在量化交易中结合时序特征和静态特征的混合建模方法。通过整合堆叠稀疏降噪自编码器(SSDA)和基于LSTM的自编码器(LSTM-AE),构建了一个能够全面捕捉市场动态特性的交易系统。SSDA通过降噪技术提取股票数据的鲁棒表示,LSTM-AE则专注于捕捉市场的时序依赖关系。系统采用A2C算法进行强化学习,通过多维度的奖励计算机制,实现了在可接受的风险水平下最大化收益的目标。实验结果显示,该系统在不同波动特征的股票上表现出差异化的适应能力,特别是在存在明确市场趋势的情况下,决策准确性较高。
56 5
基于深度混合架构的智能量化交易系统研究: 融合SSDA与LSTM自编码器的特征提取与决策优化方法
|
1月前
|
机器学习/深度学习 人工智能 并行计算
【AI系统】Kernel 层架构
推理引擎的Kernel层负责执行底层数学运算,如矩阵乘法、卷积等,直接影响推理速度与效率。它与Runtime层紧密配合,通过算法优化、内存布局调整、汇编优化及调度优化等手段,实现高性能计算。Kernel层针对不同硬件(如CPU、GPU)进行特定优化,支持NEON、AVX、CUDA等技术,确保在多种平台上高效运行。
84 32
|
1月前
|
存储 机器学习/深度学习 人工智能
【AI系统】计算图优化架构
本文介绍了推理引擎转换中的图优化模块,涵盖算子融合、布局转换、算子替换及内存优化等技术,旨在提升模型推理效率。计算图优化技术通过减少计算冗余、提高计算效率和减少内存占用,显著改善模型在资源受限设备上的运行表现。文中详细探讨了离线优化模块面临的挑战及解决方案,包括结构冗余、精度冗余、算法冗余和读写冗余的处理方法。此外,文章还介绍了ONNX Runtime的图优化机制及其在实际应用中的实现,展示了如何通过图优化提高模型推理性能的具体示例。
57 4
【AI系统】计算图优化架构
|
15天前
|
机器学习/深度学习 存储 人工智能
基于AI的实时监控系统:技术架构与挑战分析
AI视频监控系统利用计算机视觉和深度学习技术,实现实时分析与智能识别,显著提升高风险场所如监狱的安全性。系统架构包括数据采集、预处理、行为分析、实时决策及数据存储层,涵盖高分辨率视频传输、图像增强、目标检测、异常行为识别等关键技术。面对算法优化、实时性和系统集成等挑战,通过数据增强、边缘计算和模块化设计等方法解决。未来,AI技术的进步将进一步提高监控系统的智能化水平和应对复杂安全挑战的能力。
|
20天前
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
64 3
|
18天前
|
前端开发 搜索推荐 安全
陪玩系统架构设计陪玩系统前后端开发,陪玩前端设计是如何让人眼前一亮的?
陪玩系统的架构设计、前后端开发及前端设计是构建吸引用户、功能完善的平台关键。架构需考虑用户需求、技术选型、安全性等,确保稳定性和扩展性。前端可选用React、Vue或Uniapp,后端用Spring Boot或Django,数据库结合MySQL和MongoDB。功能涵盖用户管理、陪玩者管理、订单处理、智能匹配与通讯。安全性方面采用SSL加密和定期漏洞扫描。前端设计注重美观、易用及个性化推荐,提升用户体验和平台粘性。
52 0
|
18天前
|
监控 Java 数据中心
微服务架构系统稳定性的神器-Hystrix
Hystrix是由Netflix开源的库,主要用于微服务架构中的熔断器模式,防止服务调用失败引发级联故障。它通过监控服务调用的成功和失败率,在失败率达到阈值时触发熔断,阻止后续调用,保护系统稳定。Hystrix具备熔断器、资源隔离、降级机制和实时监控等功能,提升系统的容错性和稳定性。然而,Hystrix也存在性能开销、配置复杂等局限,并已于2018年进入维护模式。
26 0
|
1月前
|
机器学习/深度学习 人工智能 调度
【AI系统】推理引擎架构
本文详细介绍了推理引擎的基本概念、特点、技术挑战及架构设计。推理引擎作为 AI 系统中的关键组件,负责将训练好的模型部署到实际应用中,实现智能决策和自动化处理。文章首先概述了推理引擎的四大特点:轻量、通用、易用和高效,接着探讨了其面临的三大技术挑战:需求复杂性与程序大小的权衡、算力需求与资源碎片化的矛盾、执行效率与模型精度的双重要求。随后,文章深入分析了推理引擎的整体架构,包括优化阶段的模型转换工具、模型压缩、端侧学习等关键技术,以及运行阶段的调度层、执行层等核心组件。最后,通过具体的开发流程示例,展示了如何使用推理引擎进行模型的加载、配置、数据预处理、推理执行及结果后处理。
89 0