【系统架构师】-论文-微服务设计

1、摘要:


        2017年10月,我被任命为系统架构师参与了XXX 运营商AOP 系统架构升级项目,负责架构设计工作,该系统是运营商面向互联网销售产品的系统,自从年中上线流量包订购业务以来,系统订单量飞速上涨,月末订单量达 10 余万笔,客户希望通过营销活动进一步提升订单量,并承载更多业务,但我们评估当前架构无法支撑客户需求,因此提出本项目。
        本文以此项目为例,论述了微服务架构的在项目中的实际应用;首先我梳理了微服务架构的思想、优点和挑战因素,然后分析了本项目的系统现状、影响可靠性的风险点,再大致交代了解决可靠性问题的举措,然后重点论述了采用微服务架构如何达成架构升级目标;最后制定了本次架构升级的技术方案,评审并实施后,经过 1年多来的稳定运行,成功达成了设计目标,获得客户一致好评。

2、正文:


        微服务,是面向服务架构的一种,顾名思义,微服务架构下,服务的粒度很小,每个服务专注于一件事情,微服务架构提倡将系统拆分成一系列细粒度的服务,通过服务的编排组合实现业务需求,服务间通过轻量级通讯协议交互,从而支持微服务架构的系统达成松耦合、组件化、高扩展、高弹性、可修改行、可替代性俱佳的目标,最终提高系统的交付速度,提高交付质量。
微服务的好处很多,首先,它很适合成为新技术的试验场,每个服务都是独立的,可以根据服务自身需要采用合适的技术,如社交网络适合采用图数据库,而结构化数据适合采用关系数据库;其次,微服务系统对外提供了众多的服务,系统的可组合性好,业务变化时能轻易组合服务实现;再次,微服务的可替代性、弹性、可扩展性都很好,服务可以独立替换,每个服务可以内置自己的降级限流方案,也可以独立扩展性能,方便调整系统的整体处理能力。

        微服务虽说有很多好处,但也有很多挑战,首先,几乎所有业务需求都需要通过服务的编排组合实现,服务间的通讯开销可能影响性能,同时数据的一致性、可靠性等都可能受影响;其次,运维成本高,相对单体应用,微服务数量众多,每个微服务都需要独立部署,运维监控、运行成本高昂;再次,自动化部署的要求,服务间依赖关系的管理,服务依赖的测试都是挑战,需要妥善解决。

        微服务架构只是一种理念,具体的实现框架技术中,Springloud 无疑是最为成熟的,Spring 生态强大的集成能力体现无疑,微服务各方面的需求都有对应的组件能满足,如服务网关 Zuul、注册中心Eureka.容错降级 Hystrix、客户端负载均衡 Ribbon、配置中心 Springcloudconfig等,为微服务系统开发提供了全面的支持,除此之外,基于阿里巴巴开源的 Dubbo 服务治理框架也是一种选择,相对来说它没有那么全面的组件支持,但国内应用此框架较多,经历过互联网企业巨大流量的历练,框架成熟度较高。

         2017 年10 月,我被任命为系统架构师参与 XXX运营商AOP 系统的架构升级工作负责架构升级方案制定,组织架构升级工作实施,本次架构升级的目标是提高系统的性能扩展能力和可靠性,为互联网营销活动提供支撑。该系统是 XXX 运营商面向互联网销售产品的系统,目前承载了宽带业务订购、存费送费活动、流量包订购等业务,其中流量包订购业务占据总体业务量的绝大部分,月底订购高峰时日订单量超过10万笔,客户对系统现状较为满意,希望能通过系统进行互联网营销活动,如红包、满减、直降、抢购等大家都知道这些营销活动时用户请求将呈现指数级增长,我们评估目前的系统架构难以支撑此类需求。

        当前系统是基于轻量级J2EE 架构,大体上可分为两个子系统,订单处理子系统和接口子系统,因运营商的业务复杂、支撑系统众多,简单的流量包订购业务涉及多达 6 个系统提供的近 10 个接口,订单处理子系统的一部分工作就是调度后端系统接口完成业务需求;两个子系统通过 Dubbo 服务治理框架交互,订单处理子系统和接口子系统都是单体系统,分别部署了3 个和5个节点,数据库为 2台双机热备,前端接入采用一台 nginx反向代理。

        分析完系统现状后,我们分析了影响系统可靠性、扩展性的薄弱点:1、nginx 的单点失效风险;2数据库的性能瓶颈; 3、单体应用中的服务雪崩风险,服务间未做隔离,很容易一个服务的问题影响到整个系统;4、快速交付要求下的系统部署风险,客户要求支持每周进行营销活动,目前架构下单体应用没有时间经过充分测试。

        以上薄弱点中,nginx失效风险可以增加 nginx 节点,前置负载均衡器解决;数据库性能瓶颈可通过订单处理异步化部分解决(只能缓解,仍存在瓶颈);服务雪崩和快速交付风险,甚至数据库瓶颈,我们考虑可以通过微服务架构解决。

        微服务架构可以很完美的实现服务隔离,可以从物理上隔离服务占用的资源,配合降级机制可以较完美的解决服务雪崩风险;此外,配合良好的 DevOps 工具链,微服务系统可以单独发布影响到的服务,影响范围很容易控制,而营销活动时基本上都是独立开发一个或少数几个附加服务,对整体逻辑基本不影响,能很完美的达成快速交付目标,最后,进行促销活动的一般只有流量包等热点业务,微服务架构下我们可以将这些热点业务的订单数据库独立出来,甚至营销活动的服务独立数据库,然后通过 binglog 将订单数据同步到全订单库。

        确定好微服务架构思路后,我们评估了当前微服务架构实现方案,出于平滑过渡、保护原有投资、工期等因素,最后我们决定采用Dubbox方案实现,Dubbox 是当当网基于Dubbo2.5.3 继续开发的,增加了Restful、Kyro等协议支持,具体设计方案及迁移路线图如下:
1、Dubbo2.5.3迁移到 Dubbox2.8.4,经灰度环境全面测试正常后,迁移生产环境
2、构建容器环境:当前系统是运行在云平台上的,但云平台未提供容器服务,向运营商云平台申请资源,与云平台协商,提供预装了容器环境的虚拟机镜像,我们项目新申请的资源统一使用此镜像3、搭建 Jenkins 工具链,测试 DevOps 自动化部署、自动化构建流水线,培训运维、开发人员掌握Devops模式的开发部署流程,配合容器化环境实现性能高效扩展。
接口子系统拆分,在建立上述基础设施后,基本按每个接口一个服务方式拆分,同时每个服务内置4、超时处理和降级措施;因接口的逻辑相对简单,比较容易切分,考虑到处理性能且不直接对外,服务通过高效的 kyro 协议交互。
5、订单子系统拆分,订单处理逻辑较为复杂,因此只考虑把热点业务拆分,每个热点业务的订单处理独立服务,本期只有流量包业务;且独立数据库,订单处理异步化,收单先入库到 redis 中,同时记录文件日志以防万一时补偿;订单处理过程全部在通过 redis 进行,同时另开同步线程池将脏订单数据入库到订单库:处理完的订单及时从 redis 中清理,以降低 redis 持久化的开销;最后基于阿里巴巴 Canal 将订单表同步到总订单库中。

        按上述思路输出设计方案后,我们召集内外部专家、客户一起评审,大家基本认可此方案,补充部分细节后,经过近 2个月的实施,系统成功上线,上线 2 年来,系统运行稳定,扩展性、可修改性、灵活性、可靠性、交付速度都得到大幅提高,得到客户一致好评,团队也经此一役得到锻炼,此后的微服务系统实施更为得心应手。

        此项目的设计过程让我深深体会了架构师就是在各种方案间权衡这句话,要达到架构升级的目标不止这一种方案,不采用微服务,通过线程池隔离+异步处理+数据库集群也能基本解决问题,实施工期、实施风险也要小一些,但解决问题不够彻底,且难以达成客户提高交付速度的要求,但若工期、成本不允许的话也可能采用这种方案。通过此项目更能认识到架构师宽广的技术视野非常重要,要不断学习,跟进技术发展,以设计出更适合的架构,为各方创造最大价值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/34215.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pytorch-ResNet-50 网络表情识别项目(深度学习)

ResNet-50 网络表情识别 1. 导入依赖库2. 加载中文字体文件3. 设置图像尺寸和训练参数4. 数据增强和预处理5. 加载数据集6. 检查数据维度7. 定义ResNet50模型8. 初始化模型、损失函数和优化器9. 训练和测试函数10. 训练和测试模型11. 保存模型12. 评估数据保存和可视化 原码 本…

欧盟指控苹果应用商店规则非法压制竞争,面临巨额罚款风险

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Excel 宏录制与VBA编程 —— 14、使用VBA处理Excel事件

简介 若希望特定事件处理程序在触发特定事件时运行,可以为 Application 对象编写事件处理程序。 Application 对象的事件处理程序是全局的,这意味着只要 Microsoft Excel 处于打开状态,事件处理程序将在发生相应的事件时运行,而不…

计算机网络 交换机的基本配置

一、理论知识 1.三种模式: ①用户模式:当登录路由器后,系统自动进入用户EXEC命令模式。 例如: Router> 在用户模式状态下,用户只能查看路由器的连接状态和基本信息,访问其他网络和主机&#xff0c…

Dubbo 中查看动态生成的 class 文件

我们知道,在 Dubbo 框架中,对外发布服务时,会把每个服务提供者的实现类通过 Javassist 包装为一个 Wrapper 类,以减少反射调用开销。这个 Wrapper 是动态生成的,默认是不输出 class 文件的,如果想查看生成的…

数据库管理与数据库语句

数据库用户管理及高级sql语句 数据库管理 数据库用户管理 mysql权限表 在mysql中mysql库中的user表是最重要的权限表,记录允许连接到服务器的账号信息以及全局权限, 在mysql库中db和host表也是重要的权限表 db表中存储了用户对某个数据库的操作权限&…

Hyper-V 简介

Hyper-V 是微软开发的一种虚拟化技术,它允许在单个物理服务器上创建和运行多个虚拟机(VM),每个虚拟机都可以运行不同的操作系统和应用程序。Hyper-V 技术是 Windows Server 的一部分,并且也作为独立产品 Microsoft Hyp…

DataGrip 2024 mac/win版:让数据库管理更简单

JetBrains DataGrip 2024 是一款专为数据库开发者设计的集成开发环境(IDE),它凭借其卓越的性能和丰富的功能,为数据库管理提供了前所未有的便利。 DataGrip 2024 mac/win版获取 DataGrip 2024 支持几乎所有主流的关系型数据库管理系统,如 My…

一个角阀引起的思考和启示

给大家说一说,遇到的这个情况很有可能在你家也会出现。      发现马桶角阀处滴水,当时也没在意,擦干了几次之后,发现还是在滴,看了一下软管是新的,应该不会漏水,那就是角阀出问题了。    …

浅谈目标检测之YOLO(You Only Look Once)v1

简介:本文章要介绍的YOLOv1算法,它与之前的目标检测算法如R-CNN等不同,R-NN等目标检测算法是一种两阶段(two-stage)算法,步骤为先在图片上生成候选框,然后利用分类器对这些候选框进行逐一的判断…

记录一下MATLAB优化器出现的问题和解决

今天MATLAB优化器出了点问题。我想了想,决定解决一下,不然后面项目没有办法进行下去。 我忘了截图了。 具体来说,是出现了下面的问题。 Gurobi: Cplex: 在上次为了强化学习调整了Pytoch环境以后(不知道是不是这个原因&#…

Scala的Trait与Java的Interface:相似性与差异性深度解析

在面向对象编程中,接口(Interface)和特质(Trait)是实现代码复用和模块化设计的重要工具。Java和Scala作为两种流行的编程语言,它们对接口和特质有着不同的实现和理念。本文将深入探讨Scala中的Trait与Java中…

仓库管理系统09--修改用户密码

1、添加窗体 2、窗体布局控件 UI设计这块还是传统的表格布局&#xff0c;采用5行2列 3、创建viewmodel 4、前台UI绑定viewmodel 这里要注意属性绑定和命令绑定及命令绑定时传递的参数 <Window x:Class"West.StoreMgr.Windows.EditPasswordWindow"xmlns"http…

制造业工厂的管理到底有多难

一、引言 随着全球经济的不断发展&#xff0c;制造业作为实体经济的核心&#xff0c;对国家的经济增长起着至关重要的作用。然而&#xff0c;制造业工厂的管理却是一项复杂而艰巨的任务。本文将深入探讨制造业工厂管理所面临的挑战&#xff0c;并提出相应的应对策略。 二、制造…

TCP: 传输控制协议

TCP: 传输控制协议 TCP的服务TCP 的首部小结 本系列文章旨在巩固网络编程理论知识&#xff0c;后续将结合实际开展深入理解的文章。 TCP的服务 T C P和U D P都使用相同的网络层&#xff08;I P&#xff09;&#xff0c;T C P却向应用层提供与U D P完全不同的服务。 T C P提供一…

【已解决】Python报错:AttributeError: module ‘json‘ has no attribute ‘loads‘

&#x1f60e; 作者介绍&#xff1a;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff0c;视频号&#xff1a;AI-行者Sun &#x1f388; 本文专栏&#xff1a;本文收录于《AI实战中的各种bug…

离散数学上机报告

一、 实验题目&#xff08;编程上机题&#xff09; &#xff08;1&#xff09; 从键盘分别对P、Q输入数据1、0&#xff0c;分别输出P∧Q、P∨Q、P→Q的逻辑结果值。 &#xff08;2&#xff09; 从键盘输入无向图的邻接矩阵&#xff0c;判断输出该图结点最大度数、最小度数。 &a…

synchronized关键字和ReentrantLock在不同jdk版本中性能哪个高?该怎么选择呢?

synchronized关键字和ReentrantLock在不同JDK版本中的性能差异经历了显著的变化。早期&#xff0c;在JDK 1.5及以前的版本中&#xff0c;ReentrantLock通常提供了更好的性能&#xff0c;主要是因为synchronized关键字的实现较为简单&#xff0c;没有太多的优化&#xff0c;导致…

图片如何去水印,分享4个小妙招,手把手教会你!

作为一个经常逛社区网站下载表情包、头像的人&#xff0c;遇到的一个大难题就是图片有水印。如何才能快速去除水印&#xff1f;询问了一圈身边朋友&#xff0c;搜集了各种资料&#xff0c;小编整理了4个超好用的方法。 如果大家和小编一样&#xff0c;能坐着就不站着&#xff0…

PHP 高频面试题

PHP 初级面试题及详细解答 1. 什么是 PHP&#xff0c;PHP 的全称是什么&#xff1f; 解答: PHP 是一种流行的开源脚本语言&#xff0c;特别适合用于 web 开发并可以嵌入 HTML。PHP 的全称是 “PHP: Hypertext Preprocessor”&#xff0c;它最初代表的是 “Personal Home Page…