一、单体架构特点

把一整个项目包括数据库都放到一台服务器上的项目就是单体架构项目。

  • 优点:简单、部署方便
  • 缺点:只适合简单、小型的项目。


二、分布式架构特点

分布式架构特征:

  • 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责,避免重复业务开发。
  • 面向服务:微服务需要对外暴露业务接口。(因为每一个微服务被部署到了不同的服务器上,如有一个微服务需要使用另一个微服务,则需要跨服务器调用,故微服务需要对外暴露业务接口,具体接口是什么要看具体业务。)同一个项目中接口的标准必须是统一的,这样方便我们以后用统一的方式调用。
  • 自治:团队独立、技术独立、数据独立、部署独立 。(团队独立:一个微服务中可能包含有前端、服务端、测试、运维等,人数较少这样沟通方便,比较敏捷)(技术独立:不同的微服务可以使用开发团队擅长的技术或者更加适合此业务的技术去开发,这不影响其他的微服务,大家互不影响)(数据独立:每一个微服务可以有独立的数据库,而不是所有服务都访问同一个库了。这就实现了数据的解耦,即一个微服务不可能操作另一个微服务的数据库,避免了数据上的污染)(部署独立:各个微服务可以独立部署,用户可以通过服务网关根据自己的需求来访问任意的业务服务,要注意的是,每一个微服务有不同的入口,这个入口一般叫做网关。)
  • 隔离性强:服务调用做好隔离、容错、降级、避免出现级联问题。(服务之间虽然独立了,但他们之间存在相互调用的关系,若被调用的服务挂了,可能会对调用的服务产生影响,为了避免这样的影响,我们就要做好服务隔离,就是要提前做好一些容错措施,避免一个服务挂掉了,使得调用这个服务的服务也挂了。)

这些特征的目的是为了实现高内聚低耦合降低服务之间的影响,避免一个微服务的故障引发整个服务的故障。

分布式架构优缺点:

  • 优点:松耦合、扩展性好
  • 缺点:架构复杂,难度大。
  • 适合大型互联网项目,例如:京东、淘宝。

微服务是一种经过良好架构设计的架构方案,是在踩过很多坑之后设计出来的,微服务优缺点:

  • 优点:拆分粒度更小、服务更独立、耦合度更低。
  • 缺点:架构非常复杂、运维、监控、部署难度提高。


三、微服务结构

微服务这种方案需要技术框架来落地,全球的互联网公司都在积极尝试自己的微服务落地技术。在国内最知名的就是SpringCloud和阿里巴巴的Dubbo,它们包含的组件和实现的功能基本上是一致的:

  • 首先,它们都需要做微服务的拆分,形成一个微服务集群
  • 然而集群中的每一个微服务都要遵循单一职责的原则,并且对外暴露服务的接口,这样服务之间就可以互相调用了,不过单个服务若使用了不同的技术,那么在调用接口的方式上可能会有差异。不管是什么技术,服务之间的调用关系都可能是错综复杂的,使用人工维护不可行,因为太复杂了,调用关系太多了。
  • 所以在微服务里往往都会有一个注册中心,这个注册中心可以去维护微服务里面每一个节点的信息,并且去监控这些节点的状态。
  • 此外,随着项目中微服务越来越多,若将来有一个配置需要修改,我们手动的去微服务里面改这是不好实现的,因我们可以再设置一个配置中心,它可以管理整个服务集群的配置,若将来配置有变更,我们可以利用通知的方式,让对应的服务监控到配置的变化,从而实现配置的热更新。
  • 将来,微服务上线之后,用户就可以访问了,那么用户怎么访问?通过一个统一的网关作为入口来进行访问。用户可以访问网关,网关再把请求路由到微服务集群,在这个过程中还可以去做负载均衡。
  • 并且我们还要做好微服务之间调用的容错处理,避免因为某个服务故障带来级联问题,还要做好服务保护、隔离、降级等等措施。


四、微服务技术对比

上述的这些功能都需要相应的技术来实现:


Dubbo

SpringCloud

SpringCloudAlibaba

注册中心

zookeeper、Redis

Eureka、Consul

Nacos、Eureka

服务远程调用

Dubbo协议

Feign(HTTP协议)

Dubbo、Feign

配置中心

SpringCloudConfig

SpringCloudConfig、

Nacos

服务网关

SpringCloudGateway、

Zuul

SpringCloudGateway、

Zuul

服务监

dubbo-admin,功能弱

Hystrix

Sentinel

  • Dubbo技术在2012年左右就被阿里巴巴公司开源出来了,是国内的先锋,但是严格来说当时它并不是一个真正意义上的微服务技术,它当时的核心是服务的远程调用和以及注册中心,所以在Dubbo中技术体系并不完整,而且注册中心也不是Dubbo自己实现的,而是依赖了zookeeper、Redis等一些框架来做的,这些并不是专业的注册中心,Redis是用来做缓存的,zookeeper是用来做集群管理的,所以它也并不具备完善的注册中心的功能,远程调用才是Dubbo的核心。当时Dubbo基于ppp协议专门定义了一套标准:Dubbo协议,所以遵循这种协议的服务必须使用基于这种协议的接口,二Dubbo协议要求接口必须要用Java实现等等要求。
  • 2015-2017是微服务技术的井喷期,但是市面上并没有一种统一的微服务技术,直到SpringCloud出现。它把全球各个公司的微服务技术整合起来,而后形成了一个完整的微服务技术体系,是一个集大成者。它的注册中心包含了Eureka、Consuls是专业的注册中心,服务的调用并没有使用全新的协议和标准,因为这样会带来学习成本,它使用的就是基于HTTP协议的标准,也就是说我们编写的任何基于HTTP请求的接口都能进行调用。
  • SpringCloudAlibaba 兼容了SpringCloud和Dubbo这两种结构,它实现了SpringCloud中的接口,也保留了一些自己的东西,比如Nacos这种注册中心既可以支持Dubbo调用又可以支持Feign调用。


五、企业需求

企业中可能会碰到这四种情况:

  • SpringCloud + Feign
  • SpringCloudAlibaba + Feign
  • SpringCloudAlibaba + Dubbo
  • Dubbo原始模式