演变过程:

单一应用(单点容错率低且并发能力差)→垂直拆分解决了并发问题但是有很多重复代码)分布式服务(提高了代码复用系统间耦合度变高SOA着重中央管理,松耦合但是应用服务粒度较大微服务架构去除ESB,总是松耦合且服务粒度很小)

集中式单体架构monolithic architecture(单点容错率低且并发能力差)

当网站流量很小时,只需一个应用,所有业务功能都部署在一起,部署在一台服务器上,以减少部署节点和成本。

优点:

系统开发速度快

维护成本低(开发、测试比较方便)

适用于并发要求较低的系统(在一个系统中需要处理各类业务,并发量不能支撑很大)

缺点:

1、代码耦合度高(high coupling),后期维护困难(当模块间有相互之间的调用的时候,代码耦合度就高了)

2、无法针对不同模块进行针对性优化(当某一个模块需要特别处理时,因为这是一整个系统,其他模块也要处理才行,也就是说要全部改变)

3、无法针对某个模块进行水平扩展(horizontal scaling)(当某一个模块被访问的频率比较大时,要进行集群部署,但是无法水平扩展,因为如果要进行集群部署,整个项目都要集群部署才可以)

4、单点容错率低(low single point fault tolerance)(当某个模块在运行当中出现问题,导致宕机了的话,其他模块即使没有问题,也会因为系统的宕机而无法使用。一旦服务器故障,项目无法正常运行),并发能力差(poor concurrency)(一个系统要处理各类业务,并发量不能支撑很大)

垂直架构vertical structure解决了并发问题但是有很多重复代码)

当访问量逐渐增大,单一应用无法满足需求,此时为了应对更高的并发和业务需求,我们根据业务功能对系统进行拆分,拆分成多个子系统:

优点:

1、系统拆分实现了流量分担,解决了并发问题(原来请求一个系统,现在请求多个子系统,减轻了服务器并发压力)

2、可以针对不同模块进行优化(系统之间是独立的,针对某一个系统的特定优化,不会影响到其他的子系统)

3、方便水平扩展(系统之间是相互独立的),负载均衡(可以通过反向代理服务器,将请求转发到不同的子系统上),容错率提高(当某些子系统出现问题,并不影响其他业务,因为每个业务是独立的子系统)

缺点:

系统间相互独立,会有很多重复开发工作,影响开发效率。

分布式架构distributed  architecture(提高了代码复用系统间耦合度变高

当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,来提供给要用到这些服务的应用,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。

优点:

基础服务进行了抽取系统间相互调用提高了代码复用和开发效率。

缺点:

系统间耦合度变高调用关系错综复杂难以维护。

业务服务可以使用HTTP客户端工具访问基础服务,从而获取数据。但是在服务的消费方,我们把url地址硬编码到了代码中,不方便后期维护。服务的消费方需要记忆服务提供方的地址,如果地址出现变更,可能得不到通知,地址将失效。服务的消费方不清楚服务提供方的状态,服务宕机也不知道。服务提供方只有1台服务,不具备高可用性。即便服务提供方形成集群,服务的消费方还需自己实现负载均衡。

其实上面说的问题,概括一下就是分布式服务必然要面临的问题:

• 服务管理

  如何自动注册和发现

  如何实现状态监管

  如何实现动态路由(如果有多个地址时选择一个地址)

• 服务如何实现负载均衡

• 服务如何解决容灾问题(如果一个服务挂了,是否其他服务来保障服务的稳定性)

• 服务如何实现统一配置(服务提供方做集群时,其中一个配置改了,则要改集群中所有的配置,而一个一个去改又太麻烦)

面向服务架构(SOA)着重中央管理,松耦合但是应用服务粒度较大,远程调用使用RPC

SOA(Service Oriented Architecture)面向服务的架构:它是一种设计方法,其中包含多个服务, 服务之间通过相互依赖最终提供一系列的功能。一个服务 通常以独立的形式存在与操作系统进程中。各个服务之间 通过网络调用

SOA结构图:

 

ESB(企业服务总线),简单 来说 ESB 就是一根管道,用来连接各个服务节点。为了集 成不同系统,不同协议的服务,ESB 做了消息的转化解释和路由工作,让不同的服务互联互通。

SOA缺点:每个供应商提供的ESB产品有偏差,自身实现较为复杂;应用服务粒度较大ESB集成整合所有服务和协议、数据转换使得运维、测试部署困难。所有服务都通过一个通路通信,直接降低了通信速度

Dubbox 致力于提供高性能和透明化的 RPC 远程服务调用方案,以及SOA 服务治理方案。说白了就是个远程服务调用的分布式框架。

微服务架构microservices architecture去除ESB,总是松耦合且服务粒度很小,远程调用使用HTTP)

微服务架构是使用一套小服务(服务拆分粒度很小,一个用户管理就可以作为一个服务来开发单个应用的方式或途径,每个服务基于单一业务能力构建,运行在自己的进程中,并使用轻量级机制通信,通常是HTTP API,并能够通过自动化部署机制来独立部署。这些服务可以使用不同的编程语言实现,以及不同数据存储技术,并保持最低限度的集中式管理。

微服务结构图:

 API Gateway网关是一个服务器,是系统的唯一入口。为每个客户端提供一个定制的APIAPI网关核心是,有的客户端消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能(主要功能为路由)。如它还可以具有其它职责,如身份验证(鉴权)、监控、负载均衡、缓存、请求分片与管理、静态响应处理。通常,网关提供RESTful/HTTP的方式访问服务。而服务端通过服务注册中心进行服务注册和管理。

微(粒度小,单一职责)服务(面向服务、服务可独立部署)的特点: 

1、单一职责:微服务中每一个服务都对应唯一的业务能力,做到单一职责。

2、微:微服务的服务拆分粒度很小,例如一个用户管理就可以作为一个服务。每个服务虽小,但“五脏俱全”。

3、面向服务:面向服务是说每个服务都要对外暴露Rest风格服务接口API。并不关心服务的技术实现,做到与平台和语言无关,也不限定用什么技术实现,只要提供Rest的接口即可。

4、自治:自治是说服务间互相独立,互不干扰

  1)、团队独立:每个服务都是一个独立的开发团队,人数不能过多。

  2)、技术独立:因为是面向服务,提供Rest接口,使用什么技术没有别人干涉

  3)、前后端分离:采用前后端分离开发,提供统一Rest接口,后端不用再为PC、移动端开发不同接口

  4)、数据库分离:每个服务都使用自己的数据源

  5)、部署独立,服务间虽然有调用,但要做到服务重启不影响其它服务。有利于持续集成和持续交付。每个服务都是独立的组件,可复用,可替换,降低耦合,易维护

微服务架构与SOA都是对系统进行拆分;微服务架构基于SOA思想可以把微服务当做去除了ESB的SOAESB是SOA架构中的中心总线,设计图形应该是星形的,而微服务是去中心化的分布式软件架构

两者比较类似,但其实也有一些差别:

 spring cloud是微服务架构的实现

服务调用方式:RPC和HTTP

无论是微服务(HTTP)还是SOA(RPC),都面临着服务间的远程调用。那么服务间的远程调用方式有哪些呢?

常见的远程调用方式有以下2种:

1、RPC:Remote Procedure Call远程过程调用,RPC基于Socket,工作在会话层。自定义数据格式,速度快,效率高。早期的webservice,现在热门的dubbo,都是RPC的典型代表

2、Http:http其实是一种网络传输协议,基于TCP,工作在应用层,规定了数据传输的格式。现在客户端浏览器与服务端通信基本都是采用Http协议,也可以用来进行远程服务调用。缺点是消息封装臃肿,优势是对服务的提供和调用方没有任何技术限定,自由灵活,更符合微服务理念。现在热门的Rest风格,就可以通过http协议来实现。

区别:RPC的机制是根据语言的API(language API)来定义的,而不是根据基于网络的应用来定义的。

如果你们公司全部采用Java技术栈,那么使用Dubbo作为SOA架构是一个不错的选择。相反,如果公司的技术栈多样化,而且你更青睐Spring家族,那么Spring Cloud搭建微服务是不二之选

 

 

posted on 2021-02-26 11:51  周文豪  阅读(187)  评论(0编辑  收藏  举报