微服务介绍及spring cloud微服务架构概述

2022-09-06 10:39:31

1 单体应用架构

1.1 单体架构概述

针对web应用而言,一个应用程序中包含了应用程序的所有功能。所有的程序、配置文件、页面、静态资源等都打包成了一个程序(通常打包成jar包或war包),部署到Tomcat上运行。

单体应用架构图如下所示:
单体应用架构图

1.2 单体架构优缺点

优点:

  • 易于部署:只需要将应用打包成jar包或war包即可,直接部署单个jar包或war包到Tomcat即可。
  • 易于横向扩展:当应用负载压力大时,将这个应用复制几份,分别部署在不同的服务器上,再通过负载均衡即可提高应用的并发能力。

缺点:

  • 复杂度高:由于是单个应用,所以整个项目文件包含的模块非常多,导致模块的边界模糊、依赖关系不清晰、代码的质量参差不齐,混乱的堆在一起,使得整个项目非常复杂。以致每次修改代码,都非常小心,可能添加一个简单的功能,或者修改一个Bug都会带来隐藏的缺陷。
  • 技术债务:技术的变更、开发人员的更替都会形成技术债务,项目到后面会越来越难维护。
  • 阻碍技术创新:由于是单体应用,团队开发人员必须使用统一的开发框架、统一的IDE、统一的中间件等,阻碍了开发人员的技术创新。
  • 协作难度大:一个项目往往是由团队多人共同完成,多个人维护一套代码,代码合并难度较大。
  • 横向扩展造成的资源浪费:单体应用只能横向扩展,造成服务器资源的浪费。

2 微服务架构

2.1 微服务架构概述

针对微服务的概述,引用James Lewis 和 Martin Fowler两位大神在2014年写的博客里的一段话:

In short, the microservice architectural style [1] is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies.

翻译成中文是:

微服务是一种架构风格,是以开发一组小型服务的方式来作为一个独立的应用系统,每个服务都运行在自已的进程中,服务之间采用轻量级的HTTP通信机制 ( 通常是采用HTTP的RESTful API)进行通信。这些服务都是围绕具体业务进行构建的,并且可以独立部署到生产环境上。这些服务可以用不同的编程语言编写,并且可以使用不同的数据存储技术。对这些微服务我们只需要使用一个非常轻量级的集中式管理来进行协调。

以上这段话可以概述为两点:

  • 单个服务是围绕具体业务进行构建的,一个服务是围绕单个具体业务展开,一个服务解决的是一个业务问题。
  • 将自己的业务能力进行封装,并对外提供接口,各个微服务之间可以相互调用。

单体应用架构与微服务架构比较图:
在这里插入图片描述

2.2 微服务架构优缺点

优点:

  • 易于开发维护:一个微服务只关心一个业务,代码量较少,维护起来较为容易。
  • 易于修改:在对外提供的接口不变的情况下,修改单个服务的内部代码逻辑不会对整体业务造成影响。
  • 开发灵活:不同服务之间可以使用不同的开发语言,不同的框架,不同的数据库。
  • 按需伸缩:根据需求,实现细粒度的扩展。针对业务的并发访问量大小,可以单独扩展或伸缩。
  • 单个服务启动快速。

缺点:

  • 维护成本变高:需要维护多个服务。
  • 分布式系统固有的问题:系统容错、网络延迟、分布式事务所带来的问题。
  • 接口调整成本高:微服务对外提供接口,如果接口改动了,调用这个接口的所有服务可能都需要改动。

3 微服务技术栈

接下来,我们以spring cloud为例进行微服务技术栈的介绍。

3.1 服务相互调用

服务相互调用有两种常见方式,一种是调用RESTful接口,一种是RPC。spring cloud使用的是RESTful接口,Dubbo使用的是RPC方式。

3.2 注册中心

前面我们提到了,一个微服务只关心某一个业务。这也就说在一个系统中往往有多个微服务通过相互调用的方式分工协作。那这些微服务该怎么去管理呢?一个微服务该如何去发现其他服务呢?最容易想到的方式是在一个服务里人为的去配置其他服务的访问地址,那一旦服务多了怎么办呢?这样做显然不合理。于是,注册中心应运而生。所有的服务都可以将自己注册到注册中心,并可以从注册中心获取其他服务清单。

在这里插入图片描述

spring cloud使用的注册中心为Eureka。注册中心的出现,解决了服务的注册与发现问题。

3.3 负载均衡

在微服务架构中,一个微服务负责一项业务。假设业务A并发访问量变大,大到单台机器在短时间内处理不过来时。就需要针对业务A进行一个扩展,扩展方式是在多台主机上都部署该业务。那么问题来了,客户端如何才能均衡的去调用部署在不同主机上的业务A呢?会不会出现“累的累死,闲的闲死”的情况呢?那这样的话就没有扩展的必要了。负载均衡的提出解决了这个问题。负载均衡既可以在客户端来做,也可以在服务端来做(Nginx)。使用Ribbon、Feign(集成了Ribbon)可以做到客户端负载均衡,其负载均衡的实现机制是利用服务名通过注册中心获取服务A的所有地址列表,然后再采用轮训的策略(默认策略)去调用不同主机上的服务A。

在这里插入图片描述
为了实现高可用性,往往在一个项目中也需要部署多台注册中心服务器,以防止单台注册中心服务器挂掉导致整个系统不可用的问题。
在这里插入图片描述

3.4 熔断器

各个微服务之间相互关联紧密,处理一个客户端请求,可能需要调用多个微服务才能完成。这就会带来一个问题:假设在调用某个微服务的过程中因为网络、服务器内部错误或其他原因导致服务调用失败,那这个服务可能就会因此出现线程阻塞,将会导致响应时间过长,或不能得到响应。此时若有大量请求涌入,将可能导致容器线程资源被消耗完,导致整个服务崩溃。服务与服务之间的依赖性很可能导致故障的传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。
为了解决这个问题,熔断器应运而生。spring cloud 对Hystrix熔断器提供了良好的支持。
在这里插入图片描述

3.5 路由网关

整个微服务系统中有那么多的微服务,其中可能需要对外暴漏多个微服务,供外部访问。这些对外暴漏的微服务可能运行在不同主机上。

在这里插入图片描述

如果将这些微服务直接暴漏给外界将会带来两个问题:

  • 这些微服务的访问地址不统一,外部客户端调用起来不方便。
  • 暴漏了真实地址,存在安全问题。

Zuul路由网关的出现,解决了这个问题。Zuul路由网关具有以下两个作用:

  • 路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础。
  • 过滤功能则负责对请求的处理过程进行干预,是实现请求校验等功能的基础。

Zuul路由网关的引入:

在这里插入图片描述

3.6 配置中心

当我们的微服务多了之后,服务的部署又带来了问题。假设服务A部署在了100台服务器上,服务器A需要去改变配置文件(application.yml/application.properties),如果让运维人员一个一个的去改这100台服务器上的配置文件,那估计运维人员都要哭了。如果有一个统一的位置,管理了所有服务的配置文件,当修改配置时,只需要在此修改便可以同步到所有服务上那该多好啊。在Spring Cloud中,有分布式配置中心组件Spring Cloud Config来解决这个问题。

配置中心

在这里插入图片描述

4 Spring Cloud

Spring Cloud,基于 Spring Boot 提供了一套微服务解决方案,包括服务注册与发现,配置中心,全链路监
控,服务网关,负载均衡,熔断器等组件,除了基于NetFlix的开源组件做高度抽象封装之外,还有一些选型
中立的开源组件。

spring cloud官网提供的架构图

在这里插入图片描述
spring cloud官网提供的这张架构图比3.6节的架构图看起来简单了许多,两者所表达的含义是完全一致的。在第三节提出的所有的技术栈,都可以在spring cloud中找到。spring cloud为开发人员提供了一套完整的、便捷开发的微服务解决方案。

  • 作者:danxiao898
  • 原文链接:https://blog.csdn.net/qq_14945437/article/details/106468678
    更新时间:2022-09-06 10:39:31