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

文章目录

  • 一,微服务
  • 二,集群、分布式
  • 三,远程调用
  • 四,负载均衡
  • 五,服务注册、服务发现、注册中心
  • 六,配置中心
  • 七,服务熔断、服务降级
    • 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 管理难题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/772928.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring框架的学习前言

1.注意事项 1.在接下来的学习中我们会将jdk的版本升级到17。 2.引入maven仓库用来存储依赖 3.在后面的javaSpring框架中要第一个项目的创建要选javaweb和lombook这两个依赖 2.Maven的主要功能 (1)maven的主要功能是引入依赖和管理依赖,在…

基于SpringCloud的分布式架构网上商城

基于SpringCloud的分布式架构网上商城的主要使用者管理员功能:首页、个人中心、用户管理、商品信息管理、商品分类管理、系统管理、订单管理等功能。 💕💕作者:Weirdo 💕💕个人简介:擅长Java、C…

【SkiaSharp绘图15】SKPath属性详解:边界、填充、凹凸、类型判断、坐标、路径类型

文章目录 SKPath 构造函数SKPath 属性Bounds 边界(宽边界)TightBounds紧边界FillType填充方式IsConcave 是否凹/ IsConvex 是否凸IsEmpty是否为空IsLine是否为线段IsRect是否为矩形IsOval是否为椭圆或圆IsRoundRect是否为圆角矩形Item[] 获取路径的坐标LastPoint最后点的坐标Po…

基于香橙派AIpro搭建的车牌识别系统

引言 本人正有学习嵌入式的想法,正好碰到机会让我搞了块OrangePi AIpro(香橙派AIpro)开发板,正合我意,直接上手进行体验,顺便给大家分享下我的实践过程。 开发板介绍与初次启动 OrangePiAIPro开发板是香…

WPF UI InkCanvas 导师演示画板 演示 笔记 画笔 识别

<Grid><InkCanvas Name"inkCanvas"/><Button Content"识别" Click"Button_Click" VerticalAlignment"Bottom"/></Grid> 引用内库 Ink ink new Ink(); private void Button_Click(object sender, RoutedEvent…

基于STM32F103C8T6的同步电机驱动-CubeMX配置与IQmath调用

基于STM32F103C8T6的同步电机驱动-CubeMX配置与IQmath调用 一、功能描述: 上位机通过CAN总线实现对电机的运动控制,主要包含三种模式:位置模式、速度模式以及力矩模式。驱动器硬件核心为STM32F103C8T6,带相电压采集电路以及母线电压采集电路。其中供电电压12V。 PWM中心对…

Android-卷积神经网络(Convolutional Neural Network, CNN)

一个复杂且在Android开发中常见的算法是图像处理中的卷积神经网络(Convolutional Neural Network, CNN)。CNN被广泛用于图像识别、物体检测和图像分割等任务,其复杂性在于需要处理大量的图像数据、复杂的神经网络结构和高效的计算。 1. 卷积操作(Convolution) 数学原理:…

企业级监控系统Zabbix

文章目录 Zabbix介绍Zabbix架构Zabbix serverZabbix agentZabbix proxy Zabbix Server的安装Zabbix Agent的安装监控主机流程zabbix_get自定义模板和监控项实战用户登录数监控1.指定监控项命令2.重启Agent服务3.在Server上创建监控项4.测试监控项5.查看监控项图形 触发器定义触…

字符设备驱动程序

简单做个模板框架 字符设备开发流程 确定设备号dev_t&#xff0c;动态分配 alloc_chrdev_region() 或静态分配 register_chrdev_region()定义file_opeartion 结构体*fops *&#xff0c;在结构体成员中实现对应的 *open()、read()*等函数。cdev_init() 将 fops 与 cdev 绑定&…

STM32学习历程(day2)

GPIO解释 GPIO(General-purpose input/output) 可以配置为八种输入输出模式 引脚电平 0V-3.3V 部分引脚可容忍5v 输出模式可控制端口输出高低电平 用以驱动LED、控制蜂鸣器、模拟通信协议输出时序 输入模式可读取端口的高低电平或电压&#xff0c;用于读取按键输入、外界…

firefly rk3588 sdk安装问题记录

目录 一、python版本不对 1.1 下载python2.6 1.2 安装python2.6 1.3 安装遇到问题 二、安装hashlib 三、更新3588 SDK代码 一、python版本不对 我的环境的python版本是python3.7。初次安装的时候执行命令报错&#xff0c;说是版本不对导致 fuhdell:rk3588_sdk$ .repo/rep…

centos通过官网下载安装最新版mysql方案

官网下载步骤&#xff1a; 点击DOCUMENTATION mysql的yum仓库Using the MySQL Yum Repository 向下翻&#xff0c;查看安装命令 点击下载mysql安装包 下载对应的版本 不注册&#xff0c;直接下载社区版 下载好的安装包 安装步骤&#xff1a; 把rpm包导入到服务器…

AI 驱动的数据中心变革与前景

文章主要探讨了AI计算时代数据中心的转型&#xff0c;涉及计算技术的多样性、规格尺寸和加速器的发展、大型语言模型&#xff08;LLM&#xff09;的发展、功耗和冷却趋势、基准测试的重要性以及数据中心的发展等方面。为大家提供深入了解AI基础设施发展的视角。 计算技术的多样…

​浅谈 Linux 中的 core dump 分析方法

在 Linux 系统开发领域中&#xff0c;core dump&#xff08;核心转储&#xff09;是一个不可或缺的工具&#xff0c;它为我们提供了在程序崩溃时分析程序状态的重要线索。当程序因为某种原因&#xff08;如段错误、非法指令等&#xff09;异常终止时&#xff0c;Linux 系统会尝…

spring boot + vue3+element plus 项目搭建

一、vue 项目搭建 1、创建 vue 项目 vue create vue-element说明:创建过程中可以选择路由,也可也可以不选择,可以通过 npm install 安装 vue 项目目录结构 说明:api 为自己创建的文件夹,router 选择路由模块会自动创建 router下的index.js文件(配置路由的文件) im…

泰国内部安全行动司令部数据泄露

BreachForums 论坛的一名成员宣布发生一起重大数据泄露事件&#xff0c;涉及泰国内部安全行动司令部 (ISOC)&#xff0c;该机构被称为泰国皇家武装部队的政治部门。 目前&#xff0c;我们无法准确确认此次泄露的真实性&#xff0c;因为该组织尚未在其网站上发布有关该事件的任…

微信开发者工具报错 Error: module ‘xxx.js‘ is not defined, require args is ‘xxx.js‘

背景 报错如下 检查 代码逻辑和写法都是ok的重新打开项目又是可以的 解决方案 先确保微信开发者工具和uniapp的将js编译成es5都开着&#xff08;这个是默认开的&#xff09; 然后把微信开发者工具关了重开 一般做这一步就会好了&#xff0c;但是只是临时解决 &#xff08…

如何使用 3D 建模库在 C# 中将 3DS 转换为 USDZ?

USDZ/USD是一种 3D 文件格式&#xff0c;被广泛用于跨平台共享 3D 资产。另一方面&#xff0c;3DS是另一种以块形式存储数据的 3D 文件格式。在某些情况下&#xff0c;您需要将3DS 文件转换为 USDZ/USD文件格式。因此&#xff0c;本篇博文介绍了一个功能丰富的3D 建模库&#x…

记录一下简单导入导出excel二级表头

数据库导入导出表头 之前的工具类GenerateExcelToFile新增两个导出这种二级表头方法 package com.njry.utils;import cn.hutool.core.util.IdUtil; import com.njry.config.FileProperties; import com.njry.exception.BadRequestException; import org.apache.poi.hssf.user…

《Winodws API每日一练》8.2 static控件

在 Windows 编程中&#xff0c;"Static" 控件是一种常见的用户界面元素&#xff0c;用于显示静态文本或图像&#xff0c;而无法进行用户交互。它通常用于显示标签、标题、说明文本或静态图像等信息。Static 控件是一种静态的、只读的显示元素&#xff0c;不接受用户的…