微服务架构是分布式架构,分布式架构不一定是微服务架构
当系统的并发处理能力、存储能力不足时,我们可能会创建多个web服务(多个tomcat服务器),多个数据库服务(主从架构等),这些服务器通过网络进行连接,然后协同处理客户端的并发请求,这样的系统我们称之为分布式系统。
分布式架构可以更好的提高系统的容量、可靠性(避免单点故障)、性能。 同时因为模块化,系统的可重用性以及并行并发开发的效率也会提高。
当一个系统的业务量越来越大时,我们需要垂直或是水平拆分业务系统,同时为了避免所有业务都部署在一台机器上时,一旦机器出现故障从而导致整体不可用,就需要将这些业务部署在多台计算机上,来构建一个分布式架构。
服务治理最大的意义是需要把服务间的依赖关系、服务调用链,以及关键的服务给梳理出来,并对这些服务进行性能和可用性方面的管理。一般我们所讨论的服务拆分、服务注册、服务发现、服务限流、服务熔断、降级、服务的链路跟踪,监控等都属于服务治理的范畴。
基于服务所形成的架构需要用架构管理、整体架构的生命周期管理,以及对服务的编排、聚合事务处理等服务调度的功能。
分布式系统可以更为快速的更新服务,但是对于服务的测试和部署都会是挑战。所以,还需要DevOps的全流程,其中包括环境构建、持续集成、持续部署等、自动化运维。有了DevOps后,我们就可以对服务进行自动伸缩、故障迁移、配置管理、状态管理等一系列的自动化运维技术了。(AIOps)
应用层的自动化运维需要基础层的调度支持,也就是云计算IaaS层的计算、存储、网络等资源调度、隔离和管理。
如果没有一个好的监控系统,那么自动化运维和资源调度管理只可能成为一个泡影,因为监控系统是你的眼睛。没有眼睛、没有数据,就无法进行高效的运维。所以说,监控是非常重要的部分。这里的监控需要对三层系统(应用层、中间件、基础层)进行监控。
一般面对这样的问题,首先要从整体维度去思考,要分析问题,例如影响系统性能的因素有哪些?
为系统添加缓存,可以有效地提高系统的访问能力。从前端的浏览器,到网络,再到后端的服务,底层的数据库、文件系统、硬盘和CPU,全都有缓存,这是提高快速访问能力最有效的手段。
负载均衡是做水平扩展的关键技术,使用多台机器来共同分担一部分流量请求。
异步系统主要通过消息队列来对请求做排队处理,这样可以把前端的请求的峰值给“削平”了,而后端通过自己能够处理的速度来处理请求。
数据区分是把数据按一定的方式分成多个区(比如通过地理位置),不同的数据区分来分担不同区的流量。
具体从SQL调优层面如何进行优化呢?
服务拆分可以更好的实现故障隔离,同时也可以重用服务模块。
服务冗余是为了去除单点故障,支持服务的弹性伸缩,以及故障迁移。
当系统扛不住压力时,只能通过限流或者功能降级的方式来停掉一部分任务,或是拒绝一部分用户,以确保整个架构不会挂掉。
高可用就是从冗余架构的角度来保障可用性。比如多租户隔离,灾备多活等,总之是wield不出单点故障。
指的是DevOps中的CI(持续集成)、CD(持续部署)。一个良好的运维应做了足够的自动化测试,做相应的灰度发布,以及对线上系统的自动化控制。这样就可以做到“计划内”或是“非计划内”的宕机事件的时长最短。
构建软件时使用的编程语言、通讯协议、数据格式、运维标准可能不同,进而导致架构设计的复杂度越来越高。
传统的单体应用,一台机器挂了,整个软件就垮掉了,分布式架构下也可能出现这样的问题,因为一个服务可能会依赖另一个服务,某个服务挂掉了,会导致调用链上的服务都出现故障。
分布式架构中,服务和机器都会比较多,故障发生的频率会更大,只是影响面没有单体应用的影响面大,分布式系统中故障可以被隔离。还有就是分布式架构管理相对于单体架构也更加复杂,没有优秀的架构管理人员,故障的频率还是会非常高。
分布式架构中,我们可以将系统分为四层(基础层、平台层、应用层、接入层)
- 基础层:包括机器、网络和存储设备
- 平台层:就是中间件层包括tomcat、MySQL、Redis、RocketMQ类似的软件。
- 应用层:就是我们的业务软件,包括各种业务服务。
- 接入层:就是接入用户请求的网关、负载均衡、CDN、DNS等。
微服务是一种软件架构风格,是一种分布式架构解决方案,简单点就是将整体大应用,基于业务划分为更加微小的服务。然后作为独立的进程进行开发、测试、部署、运行、维护,每个服务都具备独立的自治能力。
微服务架构具有以下特点:
服务太大了太臃肿,容易产生单点故障,更新迭代也比较慢,所以要拆成若干个小系统,然后进行分而治之。这样分了之后,可以把每个服务作为一个独立的开发项目,由小团队进行快速开发、迭代升级。
微服务架构是从soa架构模式演变过来的,比SOA架构对服务拆分的粒度更加精细,让业务界限更加清晰
对于上述这些问题,可以想到的解决方案有:组件化、服务化。
微服务架构将各个组件或者模块分散到各个服务中,对整个系统实现解耦。那微服务架构强调的重中之重就是业务系统需要完善的组件化和服务化。
服务注册与发现:
微服务之间相互调用完成整体业务功能,需要考虑如何在众多微服务中找到正确的目标服务地址。 这就是所谓「服务发现」功能,常用的做法是:
运维成本:
微服务将系统分成多个独立的部分,每个部分都是可以独立部署的业务单元。这就意味着,在微服务架构下,随着服务数量的增多,每个服务都需要独立的配置、部署、监控、日志收集等,因此成本呈指数级增长。
部署自动化:
对于微服务架构而言,每个服务都是一个独立可部署的业务单元,每个服务的修改都需要独立部署。如何有效地构建自动化部署流水线,降低部署成本、提高部署频率,是微服务架构下需要面临的一个挑战。
服务容错:
生产环境复杂多变,服务运行过程中不可避免的发生各种故障(宕机、过载等等),需要引入「熔断、隔离、限流和降级、超时机制」等「服务容错」机制来保证服务持续可用性。
微服务是拆分成多个服务进行部署,服务间的通信都是通过网络,此时的性能会受影响。同时可靠性也会受影响。数据一致性也需要严格控制,其成本也比单块系统高。
服务治理:
由于微服务架构是把系统拆分为若干个可独立部署的服务,所以需要:
服务安全:
有些服务的敏感数据存在安全问题,「服务安全」就是对敏感服务采用安全鉴权机制,对服务的访问需要进行相应的身份验证和授权,防止数据泄露的风险。
DevOps 与组织结构:
传统单块架构中,团队通常是按技能划分,如开发部、测试部、运维部,并通过项目的方式协作,完成系统交付。而在微服务架构的实施过程中,在组织或者团队层面,如何传递 DevOps 文化的价值,让团队理解 DevOps 文化的价值,并构建全功能团队,也是一个不小的挑战。
Dubbo
Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC(一种远程调用) 分布式服务框架(SOA),致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
Dubbo 提供的基础能力包括: 服务发现、流式通信、负载均衡、流量治理等等。
提供的通信模型: 同步的 Request-Response (默认)、消费端异步请求、提供端异步执行、消费端请求流、提供端响应流、双向流式通信。
Dubbo 提供的是 Client-Based 的服务发现机制,使用者可以有多种方式启用服务发现:
部署架构: 为了在分布式环境下实现各个微服务组件间的协作, Dubbo 定义了一些中心化组件。
Tars
腾讯内部使用的微服务架构 TAF(Total Application Framework)多年的实践成果总结而成的开源项目。
仅支持 C++ 语言,目前在腾讯内部应用也非常广泛。2017 年对外开源,仅支持 C++ 语言。
gRPC
是Google开发的高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发。
本身它不是分布式的,所以要实现上面的框架的功能需要进一步的开发。2015 年对外开源的跨语言 RPC 框架,支持多种语言。
thrift
最初是由 Facebook 开发的内部系统跨语言的高性能 RPC 框架,2007 年贡献给了 Apache 基金,成为 Apache 开源项目之一, 跟 gRPC 一样,Thrift 也有一套自己的接口定义语言 IDL,可以通过代码生成器,生成各种编程语言的 Client 端和 Server 端的 SDK 代码,支持多种语言。
微服务框架与RPC
什么是RPC? RPC (Remote Procedure
Call)远程过程调用是一个计算机通信协议。我们一般的程序调用是本地程序内部的调用,RPC允许你像调用本地函数一样去调用另一个程序的函数,这中间会涉及网络通信和进程间通信,但你无需知道实现细节,RPC框架为你屏蔽了底层实现。RPC是一种服务器-客户端(Client/Server)模式,经典实现是一个通过发送请求-接受回应进行信息交互的系统。
两者关系: 微服务框架一般都包含了RPC的实现和一系列「服务治理」能力,是一套软件开发框架。我们可以基于这个框架之上实现自己的微服务,方便的利用微服务框架提供的「服务治理」能力和RPC能力,所以微服务框架也被有些人称作RPC框架。
分布式架构和微服务架构是两种不同的架构模式,它们在设计和实现上有一些明显的区别。下面是它们之间的对比:
分布式架构 | 微服务架构 | |
---|---|---|
定义 | 分布式架构是将一个大型系统划分为多个独立的模块,这些模块可以在不同的服务器上运行,通过网络进行通信。 | 微服务架构是一种将应用程序划分为一组小型、独立的服务的架构,每个服务都可以独立部署、扩展和维护。 |
系统复杂性 | 分布式架构通常需要更多的协调和管理,因为不同的模块需要通过网络进行通信和协调。 | 微服务架构通过将系统拆分为小型服务,降低了系统的复杂性,每个服务可以独立开发和部署。 |
扩展性 | 分布式架构通常需要在整个系统上进行扩展,当系统的负载增加时,需要增加整个系统的资源。 | 微服务架构允许对系统的不同服务进行独立的扩展,当某个服务的负载增加时,只需增加该服务的资源。 |
可维护性 | 分布式架构的模块间的依赖关系较强,当一个模块发生变化时,可能会影响到其他模块,导致维护困难。 | 微服务架构的每个服务都是独立的,当一个服务发生变化时,只需关注该服务的维护,不会影响其他服务。 |
部署 | 分布式架构需要将整个系统一起部署,当一个模块发生变化时,需要重新部署整个系统。 | 微服务架构允许每个服务独立部署,当某个服务发生变化时,只需重新部署该服务。 |