微服务设计原则与实际落地

微服务架构是目前大多数企业应用架构的必选,微服务之所以火热也是因为相对之前的应用开发方式有很多优点,如更灵活、扩展性更好、故障影响范围更小、更能适应现在需求快速变更与迭代的大环境。

我将从微服务架构的演进、优缺点、微服务应用的设计原则以及实际落地经验,给大家分享,然后着重介绍作为一个“微服务应用平台”需要提供哪些能力、解决哪些问题才能更好的支撑企业应用架构。

微服务架构也是我目前正在管理的项目群中的大多数主流技术架构,架构设计主要是以SpringCloud为基础,结合了我个人十多年来对企业应用技术架构设计与开发的理解和互联网软件产品设计的经验,逐步演化的一个分布式应用架构平台。

一、微服务架构演进

近年来各位同仁都体会到了互联网、移动互联网、物联网等带来的好处,作为软件行业从业者,在生活中时刻感受移动互联网与物联网好处的同时,在工作中可能感受的却是来自各方的一些压力,那就是我们传统企业的IT建设也是迫切需要转型,需要面向外部客户,我们也需要应对外部环境的快速变化、需要快速创新,那么我们的IT架构也需要向互联网企业学习作出相应的改进,来支撑企业的数字化转型。

我们再看一下应用架构的演进过程,回忆一下微服务架构是如何一步一步进化产生的,最早是应用是JSP/ASP技术为主,页面逻辑与业务高度耦合,接下来是单体架构(SSH or SSM),做了适当的分离或者分层处理,项目体积越做越大,后来为了具备一定的扩展、吞吐量、性能和可靠性,就有了垂直架构,也就是加了负载均衡,随着企业信息化的发展,每个企业的内部系统越来越多,形成了很多信息孤岛,为了打通企业内外部的信息壁垒,接下来使用SOA架构解决这些问题,主要讲了应用系统之间如何集成和互通,随着移动互联网、物联网时代的到来,现在的微服务架构就应运而生了,使得开发迭代更加敏捷、模块之间耦合度更低,排查问题的速度大幅度提升等诸多好处。

微服务架构的基本思想就是“围绕业务领域组件来创建应用,让应用可以独立的开发、管理和加速”。

二、微服务架构的好处

我总结了几个方面的优点,分别如下:

高度自治:每个微服务组件都是简单灵活的,能够独立部署。不再像以前一样,应用需要一个性能强悍的应用服务器来支撑。

小团队高效协作:一个复杂的大型应用可以由几个小团队负责更专注专业,相应的也就更高效可靠。

高内聚,低耦合:微服务之间是松耦合的,微服务内部是高内聚的,每个微服务很容易按需扩展。

语言无关性:微服务架构与语言工具无关,自由选择合适的语言和工具,高效的完成业务目标即可。

看到这里,大家会觉得微服务架构挺不错,然而还会有一些疑问,什么样的应用算是一个微服务架构的应用?该怎样设计一个微服务架构的应用?那我们来一起看看我们推荐的微服务应用的设计原则。

三、微服务应用架构的几个设计原则

1. AFK拆分原则

业界对于可扩展系统架构设计有一个朴素的理念:通过加机器就可以解决容量和可用性问题。

  这一理念在云计算概念疯狂流行的今天,得到了广泛的认可,对于一个规模迅速增长的系统而言,容量和性能问题当然是首当其冲的。但随着时间的向前,系统规模的增长,除了面对性能与容量的问题外,还要面对功能与模块数量上的增长带来的系统复杂性问题以及业务的变化带来的提供差异化服务的问题。

  然而许多系统在架构设计时为充分考虑这些问题,导致系统重构成为常态,而影响业务交付能力,还浪费人力财力。对此《可扩展艺术》一书提出了一个系统可扩展模型--AKF可扩展立方(Scalability Cube)。

Y轴(功能)关注应用中功能划分,基于不同的业务拆分

  Y轴扩展会将庞大的整体应用拆分为多个服务,每个服务实现一组相关的功能,如订单管理、客户管理等。在工程上常见的方案是服务化架构(SOA),比如对于一个电子商务平台,我们可以拆分成不同的服务,组成类似下面的架构:

  但通过上图可以发现,当服务数量增多时,服务调用关系变得复杂,为系统添加一个新功能,要调用的服务数变得不可控,由此引发了服务管理上的混乱,所以一般情况下,需要采用服务注册的机制形成服务网关来进行服务治理

X轴(水平扩展)关注水平扩展,也就是“加速器解决问题”

  X轴扩展与我们前面朴素理念是一致的,通过绝对平等的复制服务与数据,以解决容量与可用性的问题,其实就是将微服务运行多个实例,做集群加负载均衡的模式。

  为了提升单个服务的可用性与容量,对每一个服务进行X轴扩展划分。

Z轴(数据分区)关注服务与数据的优先级划分,如按地域划分

  Z轴扩展通常是指基于请求者或用户独特的需求,进行系统划分,并使得划分出来的子系统相互隔离但又是完整的。以生产汽车的工厂来举例:福特公司为了发展在中国的业务,或者利用中国的廉价劳动力,在中国建立一个完整的子工厂,与美国工厂一样,负责完整的汽车生产。这就是一种Z 轴扩展。

工程领域常见的Z轴扩展有以下两种方案

单元化架构

  在分布式服务设计领域,一个单元Cell就是满足某个分区所有业务操作的自包含闭环。如上面我们说到的Y轴扩展的SOA架构。客户端对服务端节点的选择一般是随机的,但是,如果在此上加Z轴扩展,那服务节点的选择将不再是随机的,而是每个单元自成一体。

数据分区

  为了性能数据安全上的考虑,我们将一个完整的数据集按一定维度划分出不同的子集。一个分区(Shard),就是整体数据集的一个子集。比如用尾号来划分用户,那同样尾号的那部分用户就可以认为是同一个分区,数据分区一般包括以下几种数据划分形式:

  数据类型:如业务类型

  数据范围:如时间段、用户ID

  数据热度:如用户活跃度、商品热度

  按读写分:如商品描述、商品库存

2.前后端分离

何为前后端分离?前后端分离在不同时期有不同的理解,大约在十年前的前后端分离指的是表示层技术、业务逻辑代码以及数据访问层的分离,但是部署还是在一起,最终形成了一个大大的war包或者EAR包。随着时代的进步,出现了模板化技术,使得团队角色分工进一步细化,再后来出现了分布式部署项目,形成了前端团队与后端团队独立开发、独立部署,最终以中立的RestAPI接口进行无状态交互,好处显而易见。

  前后端分离原则,简单的将就是前端和后端的代码分离,我们推荐的模式是最好采用物理分离的方式部署,进一步促使更彻底的分离。如果您还是继续使用十几年前的服务端模板技术,如jsp,把java、js、css、html都堆到一个页面里,一方面被时代远远的甩在了不起眼的小角落,另一方面现代复杂的应用痛苦至极。

这种前后端分离有几个好处:

1,前后端技术分离,可以由各自的专家来对各自的领域进行优化,这样前端的用户体验会更好。

2,分离模式下,前后端交互界面更清晰,就剩下接口模型,后端接口简介明了,更易于维护。

3,前端多渠道继承场景更容易实现,后端服务无需变更,采用统一的数据和模型,可以支持多个前端,例如:微信h5前端、PC前端、安卓前端、IOS前端、车载端等等。

3.无状态服务

对于无状态服务,首先说一下什么是状态:如果一个数据需要被多个服务共享,才能完成一笔交易,那么这个数据被称为状态。进而依赖这个“状态”数据的服务被称为有状态服务,反之称为无状态服务。

那么这个无状态服务原则并不是说在微服务架构里就不允许存在状态,表达的真实意思是要把有状态的业务服务改变为无状态的计算类服务,那么状态数据也就相应的迁移到对应的“有状态数据服务”中。

4.无状态通信风格

无状态通讯有很多好处:

无状态协议HTTP,具备先天优势,扩展能力很强。例如需要安全加密是,有现成的成熟方案TLS/HTTPS可用。

JSON 报文序列化,轻量简单,人与机器均可读,学习成本低,搜索引擎友好。

语言无关,各大热门语言都提供成熟的Restful API框架,相对其他的一些RPC框架生态更完善。

当然在有些特殊业务场景下,也需要采用其他的RPC框架,如thrift、avro-rpc、grpc。但绝大多数情况下Restful就足够用了。

场景说明:例如我们以前在本地内存中建立的数据缓存、Session缓存,到现在的微服务架构中就应该把这些数据迁移到分布式缓存中存储,让业务服务变成一个无状态的计算节点。迁移后,就可以做到按需动态伸缩,微服务应用在运行时动态增删节点,就不再需要考虑缓存数据如何同步的问题。

四、微服务架构带来的问题

做到了前面讲的四个原则,那么就可以说是构建了一个微服务应用,感觉上也不复杂。但实际上微服务也不是个万金油,也是有利有弊的,接下来我们来看看引入微服务架构后带来的问题有哪些。

依赖服务变更很难跟踪,其他团队的服务接口文档过期怎么办?依赖的服务没有准备好,如何验证我开发的功能。

部分模块重复构建,跨团队、跨系统、跨语言会有很多的重复建设。

微服务放大了分布式架构的系列问题,如分布式事务怎么处理?依赖服务不稳定怎么办?

运维复杂度陡增,如:部署物数量多、监控进程多导致整体运维复杂度提升。

上面这些问题我们应该都遇到过,并且都会有一些成熟稳定的解决方案,比如提供文档管理、服务治理、服务模拟的工具和框架; 实现统一认证、统一配置、统一日志框架、分布式汇总分析; 采用全局事务方案、采用异步模拟同步;搭建持续集成平台、统一监控平台等等,但是,给团队随之带来了更多的挑战。

五、微服务架构落地经验

1. 采用成熟的调用链监控系统,进行微服务之间调用链的实时监控,通过一张图可以直观的看到复杂应用的调用关系;

2. 采用SpringCloud技术栈进行实施,技术成熟,社区活跃;

3. 采用目前最火的K8S docker集群管理系统,进行微服务的运维部署,使得运维更加弹性与轻松;

4. 做好日志集中检索,出现问题及时发现;

5. 故障告警连接钉钉、短信、邮件等方式,随时掌握线上情况,及时进行处理,给客户带来极致体验。

发布了4 篇原创文章 · 获赞 0 · 访问量 43

猜你喜欢

转载自blog.csdn.net/leijun_110/article/details/104602327