架构风格:微服务

本文涉及的产品
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 本文探讨: - 什么是微服务 - 微服务的约束 - 微服务对架构属性的影响

本文探讨:

  • 什么是微服务
  • 微服务的约束
  • 微服务对架构属性的影响

什么是微服务

「微服务」是一种架构风格,也就是说,「微服务」是一组架构约束

前面说到REST是一种复合式的架构风格,微服务也是!微服务的约束面更广,它对开发过程和开发人员也进行了约束

微服务的约束

MartinFlower在Microservices一文中,详细阐述了微服务所需要具有的约束!

- Componentization via Services:基于服务的组件化
- Organized around Business Capabilities:围绕业务能力进行组织
- Products not Projects:产品而不是项目
- Smart endpoints and dumb pipes:智能终端和静默管道
- Decentralized Governance:去中心化治理
- Decentralized Data Management:去中心化数据管理
- Infrastructure Automation:基础设施自动化
- Design for failure:容错性设计
- Evolutionary Design:进化式设计

实际上这些约束回答了架构设计所关心的几个问题:

  • 系统如何切分:围绕业务能力进行组织,去中心化数据管理
  • 模块之间如何通信:基于服务的组件化,智能终端和静默管道
  • 如何进行技术选型:去中心化治理
  • 容错性:容错性设计
  • 扩展性:产品而不是项目,进化式设计
  • 可维护性:基础设施自动化

下面一个个的说明!

系统如何切分?

在「架构风格:万金油CS与分层」一文中,最后提到,一般情况下,当你不知道一个系统使用何种架构比较好时,可以先使用分层架构。分层架构就是将系统一层一层的切分,下层为上层提供服务。

每一层的边界是什么呢?是「系统功能」!展现、业务逻辑、数据存储。你会发现,这种切分方式和业务本身没有任何关系,所以才是「万金油」!

另外,这种切分方法也将开发人员划分成了前端、后端、DBA!这是目前主流的做法,好像也没有出现什么大问题!

如果你在大公司待过,你就会发现进行一个需求变更是多么麻烦的一件事。即使一个很简单的需求,都可能要所有团队都参与进来。

导致这个问题的原因是什么呢?是沟通成本!

项目管理算法的复杂度是O(N 2),当人员变得越来越多时,沟通成本成倍增长:

  • 5人团队,需要沟通的渠道是 5*(5–1)/2 = 10
  • 15人团队,需要沟通的渠道是15*(15–1)/2 = 105
  • 50人团队,需要沟通的渠道是50*(50–1)/2 = 1,225
  • 150人团队,需要沟通的渠道是150*(150–1)/2 = 11,175

我们都知道「技术是为业务服务的」!如果一个架构和业务没有关系,如何为业务服务呢?如果沟通要花费大量的时间,如何快速推进项目呢?

所以,微服务「围绕业务能力进行组织」!

  • 既包括了系统的切分
  • 也包括了对人员的组织

因为康威定律提到:

"Organizations which design systems are constrained to produce designs which are copies of the communication structures of these organizations." - Melvin Conway (1967).

在微服务中,每个模块(这里的模块和我们平常所理解的模块有些区别,它的粒度更大,所以在微服务里一般称为是服务,下面均使用「服务」)都是一个完整的业务系统!包括了展现、业务逻辑和数据存储!相应的,负责开发的人员需要具备开发这个服务所需要的所有技能!

也就是说,在微服务中服务的边界是业务的边界

这很类似韩都衣舍的「以产品小组为核心的单品全程运营体系(IOSSP)」!将企业划分为“小集体”,像自由自在重复分裂的“阿米巴”——以各个“阿米巴”为核心,自行制订计划,独立核算,持续自主成长。以3人一组的产品组为例,这三个人分别是设计师、页面制作、库存管理员。这三人全权负责某一单品的页面制作、款式设计、尺码以及库存深度的预估等工作。

对应到微服务中,即两到三个人负责一个服务,这个服务包含了完整的业务流程,开发人员需要掌握开发这个服务所需要的完整的技能,包括UI、编程、DBA!

这里的难点是:

  • 一是要划分好业务边界,使得每个服务能够高内聚、低耦合!
  • 二是制定规范,利于各个服务之间的通信
  • 三是人员技能的要求更高

如何进行业务划分,需要根据具体的业务来具体进行。这里暂不展开。只提一点,就是要将事务考虑在内

就是说在切分系统的时候,要考虑事务问题!我们都知道远程事务是一个比较难处理的问题!两阶段提交、三阶段提交都不能很好的解决分布式事务问题!Paxos算法过于复杂,且性能较差。

所以微服务的建议是:

  • 尽量保证事务在一个服务中执行
  • 通过补偿的方式来弥补事务操作的问题

服务如何通信?

对于一般系统来说,我们都是使用的进程内通信,即通过调用同一内存内的方法的方式进行通信!公用的代码我们可以以「库」的形式进行组织,避免代码重复!这种系统我们一般称为「单体系统」!

「单体系统」的伸缩性不理想!比如说,双11需要做个活动,瞬间用户量大增!如果需要应对流量峰值,就需要对系统进行扩容。但是因为是单体系统,扩容只能整体扩容,而实际上需要扩容的只是那个活动页面!这就导致了资源的浪费。另外一个问题就是,如果这个活动导致了系统崩溃,这将导致这个系统的所有功能都不能使用!

一种解决方案是进行「服务化」!即将需要多个系统公用的逻辑或TPS较高的模块独立部署,通过进程间通信的方式,进行服务调用。比如上面的活动模块,当活动模块以服务的方式对外服务后,需要扩容时,只需要扩容活动服务就可以了。同时,如果活动服务出现了问题,只会导致这个活动相关内容无法访问,而不会影响系统的其它功能。今年双11淘宝的地址服务就挂了,但是并不影响淘宝本身的访问。

这里所说的「服务化」是使用dubbo这类服务化框架进行的服务化,而不是使用ESB的SOA!

基于ESB的SOA主要是为了将企业中的各个系统连接起来!ESB像一根「聪明」的管道,用来连接各个「愚笨」的节点。为了集成不同系统,不同协议的服务,ESB做了很多事情:

  • 消息路由
  • 编排
  • 转换
  • 业务处理规则

这就导致ESB很重、很复杂。这也是基于ESB的SOA被人诟病的一个原因。

dubbo这类服务化框架主要解决的是运行时代码复用、系统伸缩性以及高性能问题!但是服务粒度相对较小,带来的问题就是维护的成本相对较高

而微服务可以说做了一些折中:

  • 服务粒度较大,包含了一个完整的业务的展示、逻辑和存储。相对的数量就较服务化少,维护相对较容易
  • 以进程间通信的方式提供服务。包括对外服务、以及其它服务。保证了伸缩性。
  • 业务逻辑处理都在服务内部进行,通信组件只提供单纯的通信功能。保证了简单性。

这样既摆脱了繁重的ESB,也降低了维护难度!

如何进行技术选型?

对于「如何进行技术选型」,微服务不强制开发平台!因为「没有银弹」!微服务偏向于「适合的工具解决适合的问题」!

每个程序员都有自己喜欢的技术体系!有喜欢Java的、有喜欢.Net的、有喜欢C++的,还有喜欢Lisp的。。。。

那开发系统时需要选择哪种技术体系呢?按微服务的观点就是:哪种技术合适就用哪种技术吧!这个服务需要高并发,可以用Go来进行开发!这个服务需要快速推进,可以用PHP!这个服务需要稳定,可以用Java!看起来很完美!

而实际上内,这导致的是不可控!为什么Java语言会被很多企业使用?其中一个原因就是可控

举个例子,国内公司的技术栈相对比较单一!比如,公司的主流语言是Java,.Net,PHP等,其它语言就只是辅助!一般不会有两种、甚至三种主流语言!
假设一家公司的主流语言是Java!开发一个系统,可能需要10个人。那公司可以招5~6个一般的,2~3个不错的,1个牛逼的!公司只要稳住那个牛逼的就行了!如果有人走了,只要其他人顶上就行了!
而如果每种服务都使用不同的语言,那一个系统使用了三个左右的语言,每种语言得有个熟练掌握的吧?每种语言,公司都得稳住个相对牛逼的吧?成本高不说,难度也大了不少!

容错性

系统按照业务切分为一个个的服务,相对单体应用来说,运行的系统多了,系统整体不可用的几率降低了,但是单个服务出现问题的几率却变大了!这就需要微服务系统需要有比单体应用更好的容错性!

任何服务可能因为供应商的不可靠而故障,客户端需要尽可能的优化这种场景的响应。与单体构架相比,这是一个缺点,因为它带来额外的复杂性。这将让微服务团队时刻需要关注服务故障的情况下的用户体验
由于服务可能随时出现问题,所以快速故障检测,甚至自动恢复就变更非常重要。微服务应用把实时的监控放在应用的各个阶段中,检测构架元素(每秒数据库的接收的请求数)和业务相关的指标(每分钟接收的订单数)。监控系统可以提供一种早期故障告警系统,让开发团队跟进并调查。

这又无形中提高了对开发人员的技术要求!

扩展性

对于互联网产品来说,这是个必选项!

以前在网上看到过一句话,大意是:「当你有一个想法的时候,世界上可能有1万个人也有这个想法!其中1000个人已经开始做了!100个人已经做完了!10个人已经运营了!1个已经盈利了!」

也就是说,相同的产品千千万。用户为何就偏爱你这款?

你的系统需要有核心竞争力,来吸引新用户!同时还需要不断的加入新功能,保持用户不流失!

可维护性

服务的数量增加了,维护的成本也就相应的增加了。除了上面提到的通过降低沟通成本来提高可维护性外,微服务还通过「基础设施自动化」来降低维护难度!

基础设施自动化有如下几个原因:

  • 由于微服务的服务较单体应用会多了很多,这就导致了部署微服务较部署单体应用来说要复杂得多。单纯的靠运维来手动部署不现实
  • 部署的服务较多,且是网状通信,导致了一个请求可能会调用多个服务,对于请求的追踪不能像单体应用一样,靠日志来跟踪。需要追踪请求。
  • 当请求异常时,或服务异常时,需要能自动的处理一些常见情况(也涉及上面的「容错性」)

参考资料

目录
相关文章
|
7天前
|
缓存 负载均衡 JavaScript
探索微服务架构下的API网关模式
【10月更文挑战第37天】在微服务架构的海洋中,API网关犹如一座灯塔,指引着服务的航向。它不仅是客户端请求的集散地,更是后端微服务的守门人。本文将深入探讨API网关的设计哲学、核心功能以及它在微服务生态中扮演的角色,同时通过实际代码示例,揭示如何实现一个高效、可靠的API网关。
|
6天前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####
|
10天前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
51 6
|
10天前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
27 1
|
17天前
|
弹性计算 Kubernetes Cloud Native
云原生架构下的微服务设计原则与实践####
本文深入探讨了在云原生环境中,微服务架构的设计原则、关键技术及实践案例。通过剖析传统单体架构面临的挑战,引出微服务作为解决方案的优势,并详细阐述了微服务设计的几大核心原则:单一职责、独立部署、弹性伸缩和服务自治。文章还介绍了容器化技术、Kubernetes等云原生工具如何助力微服务的高效实施,并通过一个实际项目案例,展示了从服务拆分到持续集成/持续部署(CI/CD)流程的完整实现路径,为读者提供了宝贵的实践经验和启发。 ####
|
6天前
|
Dubbo Java 应用服务中间件
服务架构的演进:从单体到微服务的探索之旅
随着企业业务的不断拓展和复杂度的提升,对软件系统架构的要求也日益严苛。传统的架构模式在应对现代业务场景时逐渐暴露出诸多局限性,于是服务架构开启了持续演变之路。从单体架构的简易便捷,到分布式架构的模块化解耦,再到微服务架构的精细化管理,企业对技术的选择变得至关重要,尤其是 Spring Cloud 和 Dubbo 等微服务技术的对比和应用,直接影响着项目的成败。 本篇文章会从服务架构的演进开始分析,探索从单体项目到微服务项目的演变过程。然后也会对目前常见的微服务技术进行对比,找到目前市面上所常用的技术给大家进行讲解。
17 1
服务架构的演进:从单体到微服务的探索之旅
|
5天前
|
Cloud Native 安全 API
云原生架构下的微服务治理策略与实践####
—透过云原生的棱镜,探索微服务架构下的挑战与应对之道 本文旨在探讨云原生环境下,微服务架构所面临的关键挑战及有效的治理策略。随着云计算技术的深入发展,越来越多的企业选择采用云原生架构来构建和部署其应用程序,以期获得更高的灵活性、可扩展性和效率。然而,微服务架构的复杂性也带来了服务发现、负载均衡、故障恢复等一系列治理难题。本文将深入分析这些问题,并提出一套基于云原生技术栈的微服务治理框架,包括服务网格的应用、API网关的集成、以及动态配置管理等关键方面,旨在为企业实现高效、稳定的微服务架构提供参考路径。 ####
26 5
|
8天前
|
监控 API 微服务
后端技术演进:从单体架构到微服务的转变
随着互联网应用的快速增长和用户需求的不断演化,传统单体架构已难以满足现代软件开发的需求。本文深入探讨了后端技术在面对复杂系统挑战时的演进路径,重点分析了从单体架构向微服务架构转变的过程、原因及优势。通过对比分析,揭示了微服务架构如何提高系统的可扩展性、灵活性和维护效率,同时指出了实施微服务时面临的挑战和最佳实践。
26 7
|
6天前
|
Kubernetes 负载均衡 Cloud Native
云原生架构下的微服务治理策略
随着云原生技术的不断成熟,微服务架构已成为现代应用开发的主流选择。本文探讨了在云原生环境下实施微服务治理的策略和方法,重点分析了服务发现、负载均衡、故障恢复和配置管理等关键技术点,以及如何利用Kubernetes等容器编排工具来优化微服务的部署和管理。文章旨在为开发者提供一套实用的微服务治理框架,帮助其在复杂的云环境中构建高效、可靠的分布式系统。
21 5
|
6天前
|
负载均衡 监控 Cloud Native
云原生架构下的微服务治理策略与实践####
在数字化转型浪潮中,企业纷纷拥抱云计算,而云原生架构作为其核心技术支撑,正引领着一场深刻的技术变革。本文聚焦于云原生环境下微服务架构的治理策略与实践,探讨如何通过精细化的服务管理、动态的流量调度、高效的故障恢复机制以及持续的监控优化,构建弹性、可靠且易于维护的分布式系统。我们将深入剖析微服务治理的核心要素,结合具体案例,揭示其在提升系统稳定性、扩展性和敏捷性方面的关键作用,为读者提供一套切实可行的云原生微服务治理指南。 ####