谷粒商城笔记-03-分布式基础概念

news/2024/7/8 3:32:14 标签: 笔记, 分布式, 谷粒商城

文章目录

  • 一,微服务
  • 二,集群、分布式
  • 三,远程调用
  • 四,负载均衡
  • 五,服务注册、服务发现、注册中心
  • 六,配置中心
  • 七,服务熔断、服务降级
    • 1,服务熔断
    • 2,服务降级
    • 3,区别
  • 八,API 网关

这一节内容比较干,全部是概念性的内容,不需要实操。

一,微服务

对于谷粒商城的架构,无论是从理论上还是从实际开发角度,可以把所有功能在一个服务里实现,互联网早期很多项目都是这样落地的。

我们常常把这种架构称之为“大单体”。

当功能越来越多、系统越来越庞大、用户越来越多、研发团队越来越大,“大单体架构”会暴露有很多问题,比如性能问题、开发效率问题。

出现了这些问题之后,很自然的想到把大单体服务拆分为多个小的服务,微服务就在这个背景下诞生了。

微服务就像是把一个单独的应用程序开发为一套小服务,比方说每个小服务运行在自己的进程中,并使用轻量级机制通信,通常是 HTTP API。这些服务围绕业务能力来构建,并通过完全自动化部署机制来独立部署。

这些服务使用不同的编程语言书写,以及不同数据存储技术,并保持最低限度的集中式管理。

简而言之:拒绝大型单体应用,基于业务边界进行服务微化拆分,各个服务独立部署运行

拆分在计算机世界是一个非常重要的思想和手段,当我们开发过程中遇到难题时,拆分通常是非常有效的解决方案。比如大单体拆分为微服务、分库分表、冷热分类、读写分离、主从分离、主备分离,都是常见的架构技巧,也是遇到问题后的解决手段。

当然,微服务架构也会带来很多挑战,典型的问题是像下图一样,众多的微服务,再加上彼此之间相互调用,成为一团乱码,如何管理和治理就是我们必须面对的挑战,这套课程的第二阶段就是解决这个问题的。

在这里插入图片描述

二,集群、分布式

这里有点咬文嚼字,了解即可。

集群是个名词,分布式可以理解为副词,起修饰作用。

比如,我们通常说MySQL集群,不会说MySQL分布式;会说Redis集群,不会说Redis分布式

集群是个物理形态,分布式是个工作方式。

只要是一堆机器,就可以叫集群,机器之间有无协作,无关紧要。

分布式描述了这样一种工作方式:一个工作被拆分为多个任务,分发到多个集群上执行。

所以分布式系统的不同服务之间是有协作关系的。

分布式系统必然是集群式部署,但是集群上运行的软件不一定能称之为分布式系统。

比如用户在商城系统下单,涉及订单系统、库存系统、商品系统、结算系统,需要这些系统协作才能完成这个功能,商城系统就是一个分布式系统。

MySQL集群虽然是部署在多台集群上,但彼此并不需要协作,所以不能称之为分布式系统

三,远程调用

分布式系统中,各个服务可能处于不同主机,但是服务之间不可避免的需要互相调用,这种调用称为远程调用

SpringCloud 中使用 HTTP+JSON 的方式完成远程调用。

在这里插入图片描述

四,负载均衡

分布式系统中,A 服务需要调用B服务,B服务是集群部署,在多台机器中都存在,从需求实现的角度,A 调用任意一个即可。

在这里插入图片描述

这种情况下,可能出现的一种情况是,A发出的请求始终固定打到其中一台机器上(比如图中的B1),导致这台服务器压力非常大,而另外两台服务器又很空闲。

最好是让A的请求均匀的分发到B服务的三台服务器上,避免某台服务器很忙其他服务器很闲的情况,这种效果通过负载均衡来实现。

常见的负载均衡算法:

  • ①轮询。为第一个请求选择健康池中的第一个后端服务器,然后按顺序往后依次选择,直到最后一个,然后循环。
  • ②最小连接。优先选择连接数最少,也就是压力最小的后端服务器,在会话较长的情况下,可以考虑采取这种方式。
  • ③散列。根据请求源的 IP 的散列(hash)来选择要转发的服务器。这种方式可以一定程度上保证特定用户能连接到相同的服务器。如果你的应用需要处理状态而要求用户能连接到和之前相同的服务器,可以考虑采取这种方式。
  • ④随机。将请求随机转发到一台服务器上,在大样本下,不同服务器接收到的请求数大致均衡。

五,服务注册、服务发现、注册中心

A 服务调用 B 服务时,A 服务需要知道 B 服务所在服务器的IP。

我们当然可以考虑把B服务的IP写死在A服务的配置文件中,但是一旦B服务的IP发生变化,就要修改A服务的配置文件,低效且不安全。

更大的问题在于,如果服务非常多,比方说A服务除了调用B服务之外,还可能调用其他的几十个服务,如果全部都在A服务中写死IP,其运维难度之大、出错概率之高,是不能被容忍的。

我们还必须意识到,在现在K8S容器部署已经成为微服务部署的标准方案,服务的IP是动态分配的,不可预知且经常变化。

这就要求必须以一种更科学灵活的方式来保存每个服务的IP。

这就是注册中心的作用。

在这里插入图片描述

所有的服务在部署完成后,将服务名和IP注册到注册中心。

调用方根据要调用的服务的名称从注册中心获取IP,然后向这个IP发送请求。

注册中心还能动态感知服务是否可用,将不可用的服务剔除,避免出现无效的调用。

六,配置中心

在这里插入图片描述

每一个服务最终都有大量的配置,并且每个服务都可能部署在多台机器上。

变更配置是经常性的,在微服务架构下,有大量的服务器,如果每次变更都要去服务器上修改,是不可行的,不仅工作量大,效率低,风险也很大。

配置中心就可以完美解决这个问题,配置中心用来集中管理微服务的配置信息。每个服务启动后,自动从配置中心获取自己的配置。

七,服务熔断、服务降级

在微服务架构中,微服务之间通过网络进行通信,存在相互依赖,当其中一个服务不可用时,有可能会造成雪崩效应。

在这里插入图片描述
如图所示,假设库存服务不可用:

  • ①商品服务调用库存服务时,库存服务没有响应,商品服务就会一直等待
  • ②越来越多的请求到达商品服务,都等在商品服务,导致商品服务的资源被消耗殆尽,最终商品服务不可用
  • ③商品服务不可用后,订单服务请求商品服务,没有响应,一直等待
  • ④越来越多的请求到达订单服务,进入等待状态,导致订单服务的资源被耗尽,不能接收新的订单请求,订单服务也变成不可用的服务了

最终导致整个系统所有的服务都不可用了,这就是雪崩

要防止这样的情况,必须要有容错机制来保护服务。

1,服务熔断

服务熔断是指调用方发现服务不可用后,不再发出请求。

通常的策略是设置请求超时时间,当被调用的服务经常失败到达某个阈值,可以开启断路保护机制,后来的请求不再去调用这个服务。

2,服务降级

服务降级是指被调用方感知到系统资源紧张,无法处理更多的请求时,不再对请求做常规的处理,而是基于降级规则直接做出简单的响应,避免本机资源消耗和调用方的阻塞。

3,区别

服务熔断是调用方的手段,服务降级是被调用方的策略。

八,API 网关

在微服务架构中,API Gateway 作为整体架构的重要组件,它抽象了微服务中都需要的公共功能,同时提供了客户端负载均衡,服务自动熔断,灰度发布,统一认证,限流流控,日志统计等丰富的功能,帮助我们解决很多 API 管理难题。


http://www.niftyadmin.cn/n/5536355.html

相关文章

开始尝试从0写一个项目--后端(一)

创建文件的目录结构 利用这个界面创建 序号 名称 说明 1 SEMS maven父工程,统一管理依赖版本,聚合其他子模块 2 sems-common 子模块,存放公共类,例如:工具类、常量类、异常类等 3 sems-pojo 子模块&#x…

怎么用AI合成PPT?这5款风靡全球的AIPPT软件一定要知道!

当下我们已进入信息过载的时代,每天有无数的信息试图争夺我们的注意力,与此同时,我们也需要向别人展示和呈现信息,这就要求我们能够以最低的成本,在短时间内引起对方的注意,这其中最常用到的工具非PPT莫属。…

[前端架构]微前端原理了解

微前端原理简介 大致方案 Nginx路由转发iframe嵌套Web Components组合式应用路由分发 实际项目中,一般是Nginx路由转发搭配某个微前端框架实现,而微前端框架又是由上面几种技术一些补充混合实现的。 例如: qiankun: function proxy wi…

Pand函数详解进阶:案例解析(第26天)

系列文章目录 分组对象操作分组聚合分组转换分组过滤分箱合并操作变形操作 文章目录 系列文章目录前言1 分组对象操作2 分组聚合2.1 df分组对象直接调用聚合函数2.2 df分组对象指定聚合列2.3 df分组对象结合agg函数 3 分组转换4 分组过滤5 分箱6 合并操作6.1 纵向合并6.2 横向合…

学习python常用的英语单词,有音标,有音节划分,适合英语基础差的人来入门

if [ɪf] 如果 else [els] 否则 while [waɪl] 当...的时候 for [fɔ:r] “对于”或“遍历”,适合于 break [brek] 中断 continue [kəntɪnju:] 继续 con ti nue [kən tɪ nju:] pass [pɑ:s] 通过 height [haɪt] 高度 weight [weɪt] 重量 keyword [ki:w…

Is ChatGPT a Good Personality Recognizer? A Preliminary Study?

ChatGPT是一个很好的人格识别者吗?初步调研 摘要1 介绍2 背景和相关工作3 实验3.1 数据集3.2 提示策略3.3 基线3.4 评估指标3.5 实现细节3.6 Overall Performance (RQ1)3.7 ChatGPT在人格识别上的公平性 (RQ2)3.8 ChatGPT对下游任务的人格识别能力(RQ3&a…

白骑士的C语言教学进阶篇 2.2 指针与内存管理

系列目录 上一篇:白骑士的C语言教学进阶篇 2.1 数组与字符串 在本节中,我们将深入探讨C语言中的指针与内存管理,包括指针的基础知识、指针与数组的关系,以及动态内存分配。指针是C语言中强大而灵活的工具,正确理解和使…

Mac安装AndroidStudio连接手机 客户端测试

参考文档:https://www.cnblogs.com/andy0816/p/17097760.html 环境依赖 需要java 1.8 java安装 略 下载Android Studio 地址 下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 本机对应的包进行下载 安装过程 https://www.cnblogs.c…