微服务 云原生:微服务相关技术简要概述

news2024/11/24 19:49:48

后端架构演进

单体架构

在这里插入图片描述
所谓单体架构,就是只有一台服务器,所有的系统、程序、服务、应用都安装在这一台服务器上。比如一个 bbs 系统,它用到的数据库,它需要存储的图片和文件等,统统都部署在同一台服务器上。

单体架构的好处就是简单,相对便宜。一般在互联网早期、或创业型团队,都有经历过单体架构。通过配置升级来应对并发量过高的情况,比如把 CPU/内存升配成 64 核、128G内存。

应用和数据库分离-垂直架构

当服务器负载过高时,拆分和单独部署应用服务器和数据库服务器。
在这里插入图片描述

当网站积累的内容多了,另外用户和访问量也越来越大了。每天的 UV 过万,PV 过十万时,服务器的负载会在单体架构下变得越来越高。

当网站的访问量越来越大,顶配服务器能支撑的并发量也是有极限的。这时候,就要对架构进行升级了,最简单的方式,就是从单体架构升级为垂直架构:把应用和数据库分开来部署。

数据库主从架构

网站有源源不断的访问,数据库的压力越来越大,经常出现拥堵和慢查询。此时可以考虑增加数据库的服务器数量。
在这里插入图片描述
比较常见的是使用数据库主从模式,可以是一主一从或者一主多从。一主一从就是一个主库加上一个从库,使用两台服务器。
主库负责全部的数据写入请求,从库只能用来查询,分散主库的查询压力。类似的一主多从,就是增加多个从库,这样通过增加从库的服务器资源,来提高查询的性能。

注意:

  • 数据库主从模式调整后,要实现数据的读写分离,还需要程序做一些修改。
  • 把以前单一的数据库实例改成读写两个数据库实例,数据库的配置信息也要增加主从的数据配置。
  • 程序中把大部分的读请求改成从库数据库实例。

存在的问题:数据库主从同步会有延时:一条数据成功写入了主库,但是马上读取从库,因为同步延时,这条数据还没有从主库同步到从库,于是查询无结果。

这时便需要对从库延时进行监控,以 MySQL 为例,在从库上执行 show slave status; 语句查看从库的状态,Slave_IO_RunningSlave_SQL_Running 都需要是 Yes。Seconds_Behind_Master 的延迟程度,数值越大说明延时越长。除了时刻关注从库的延时情况,在程序方面,也需要有一些策略性的调整。比如不要把全部查询都改为读从库,优先把对时间更新不敏感的数据改为读从库。

分布式应用架构

系统的并发量也同时增加,单台应用服务器的负载太高,考虑对服务器进行扩容,从一台服务器水平扩容成多个应用服务器。
在这里插入图片描述
把应用系统在每台服务器上都部署一套,然后再部署一个负载均衡服务器,比如 Nginx 来作为统一的接入层。

在分布式系统中,依赖于本地的文件存在一个问题:上传的图片和文件只保存在本地的文件系统上,其他的服务器上并没有这些文件,所以就会出现 404。比较简单的方法,就是在每一台应用服务器上都挂载同一个 nfs,并且配置一样的目录。这种方式,文件还是集中式的读写,只是通过网络来进行读写,不再是本地的IO了。另外也可搭建额外的 OSS 集群,同时引入 CDN 优化等。

在分布式架构下,正常网站的支撑基本达到 20-30万的 PV。

分布式缓存架构

数据库的压力依然很大,慢查询越来越多,到达瓶颈了,此时便引入分布式缓存服务,解放数据库。
在这里插入图片描述

在这个阶段,数据库面对庞大并发压力,再对数据库服务器通过水平、垂直扩容的收益已经不大了。可引入分布式缓存服务。比如:使用Redis集群。

一般认为,MySQL 服务单机可以支持 1000 的并发,Redis 服务单机可以支持10万的并发。利用缓存,可以把一些耗时几百毫秒的慢查询的结果缓存起来,缓存查询耗时只有1-2ms,性能提升了上百倍。

这便有新存在一些问题,比如:数据库与缓存的数据一致性问题(内容较多,此处省略2万字)。终于,在这种系统架构下,已经完全可以应对百万用户,每天几百万的 PV 的情况了。

数据库分表分库

当数据规模越来越大,数据量飞速增长,超过千万规模,只要涉及到数据库的查询、批量更新等操作时,又会变得很慢,再次成为整个系统的瓶颈。针对数据规模的不断增长,需要再一次升级数据库架构,考虑对数据库及数据表做水平拆分和垂直拆分。

单表的数据量太大,考虑对数据表进行分表,比如让单张表的数据规模控制在百万的规模。

  • 水平拆分。子表的结构都一模一样,但是每个子表里面都只保存总数据的一部分。
  • 垂直拆分。子表的字段都是大表的一部分。

数据库的分库方法跟分表的方法类似,同样是考虑用水平拆分或者垂直拆分。

微服务架构

当应用越来越多,越来越复杂时,考虑将应用拆分为多个子服务,需要注意垂直拆分的服务边界。
在这里插入图片描述
对一个大的应用系统进行垂直拆分,而服务拆分的依据就是各个服务的数据尽量独立。比如:在博客系统中,可以考虑把文章系统、评论系统、图片文件系统、等进行拆分。

早期的 SOA架构,即面向服务架构,也是把一个大的系统进行很多的独立的服务化拆分。微服务架构其实和 SOA 架构类似,是在 SOA 上做的升华。微服务架构重点强调的一个是"业务需要彻底的组件化和服务化",原有的单个业务系统会拆分为多个可以独立开发、设计、运行的小应用。这样的小应用和其他各个应用之间,相互去协作通信,来完成一个交互和集成。

K8S 容器化、云原生架构

微服务太多,管理难度太大。通过 K8S 等技术,可以轻松管理成千上万的微服务,管理上百万核的服务器资源。同时可以让开发、测试、发布的周期变得更短。

云原生将进一步帮助我们提高开发、运维效率和灵活性,提高系统和产品的可用性。不再受到资源和地域的限制,可以快速在全球几十个地区把服务部署、运行起来。

系统中用到的 MySQL 集群、Redis集群、分布式存储、消息队列、Elasticsearch、Prometheus、分布式日志系统、实时计算服务等。
要管理和维护这么多的大型分布式系统,既要优化提高服务的性能,又要保证系统的高可靠可用性,这里需要投入的人力资源和服务器资源,都会是非常巨大的。如果对于云原生的资源管控不好,成本方面控制不好,可以选择混合云的方式。

微服务技术

  • 微服务架构是一个分布式系统,是一个分散式系统。
  • 服务部署可能会跨主机、网段、机房甚至是地区,各个服务之间通过 http 接口或者 RPC 进行调用。

服务发现

服务发现是微服务架构的灵魂,就是把服务的信息注册到一个配置中心,而且从配置中心,可以找到服务的更多信息。这里的配置中心,也叫做注册中心,管理着所有的服务信息。注册中心是所有微服务创建、启动、运行、销毁、互相调用都绕不过去的中心服务。

  • 管理所有服务信息的注册中心;
  • 功能:注册、查询、健康检查;
  • 数据量大,包含多种服务,多个实例。

注册中心的功能

  1. 服务注册。服务启动的时候,把服务名称和服务的访问方法等信息注册到注册中心。
    • 服务名称是一个关键字。
    • 服务的访问方法需要有调用协议,是 http 还是 gRPC 等。同时还会有一个访问地址,可能是一个域名,也可能是一个IP:端口的集合。
  2. 服务查询。通过服务名称查找到调用服务的访问方式。
  3. 健康检查。让注册中心随时掌握服务的运行状况。当服务的实例出现异常时,进行告警、服务自动重启等。

注册中心本身还是一个分布式的存储系统,作为一个配置中心,除了要保存服务信息,可能还会有各个微服务的自定义配置信息。对于注册中心来说,最大的挑战是系统的可靠性和数据的一致性。所以,所有的注册中心都是部署在多台服务器上。而且,每台机器上都会保存一份完整的配置信息。并且,多台服务器之间的数据同步,为了保证数据的强一致性,需要实现一些复杂的一致性协议。

服务发现过程:

  1. 服务提供者向注册中心注册服务信息。
  2. 服务消费者向服务提供者发起请求之前,从注册中心获取服务信息。这里,因为获取服务信息的时机不一样,存在两种服务发现的模式:
    • 客户端发现模式,在服务消费者这一侧来获取服务信息。拿到服务信息之后,自己来实现负载均衡策略,直接请求到服务提供者。
    • 服务端发现模式,引入一个服务端网关,服务消费者只需要请求服务端网关就可以了。然后在服务端网关这里,统一的去获取服务信息,再实现负载均衡策略。最终请求到服务提供者。

一些服务发现的实现方案:Apache Zookeeper、Etcd、Consul。

服务调用的限频、限流、降级和熔断

为应对线上突发情况,如某个目标服务出现 Bug,性能和并发能力急速下降,需要采取各种措施来保证系统的可用性。

超时

调用方主动中断请求的连接。在调用 API 的时候,一般会根据目标服务预估的接口延时来配置这个 TCP 超时时间。如 API 大部分情况都是100ms 以内就可以返回,那么,就可以把 TCP 请求超时设置为 500ms 或者1s。如果不设置超时,那么当目标服务出现异常,无法正常的快速响应时,那源服务与目标服务的所有请求就会无限的等待,TCP 连接数也就会越来越多,对于系统的资源开销也就越来
越大。

限流

限制请求的最大并发数。如目标服务最大可以支持 100QPS,那就不能让源服务超过这个并发请求进入。

常用算法:

  1. 计数器固定窗口算法。全局唯一的一个计数器,请求进来计数器 +1,请求结束计数器 -1,当计数器的数量超过限制的最大值,计数器不再 +1,也会拒绝超出的全部请求。计数器的增减通过原子操作进行。缺点就是不能处理同时涌入的大量请求。
  2. 计数器滑动窗口算法。假设单位时间是1秒,限流阀值为 3。在单位时间1秒内,每来一个请求,计数器就加1,如果计数器累加的次数超过限流阀值 3,后续的请求全部拒绝。等到1s结束后,计数器清0,重新开始计数。缺点:
    • 一段时间内(不超过时间窗口)系统服务不可用。比如窗口大小为1s,限流大小为100,然后恰好在某个窗口的第1ms来了100个请求,然后第2ms-999ms的请求就都会被拒绝,这段时间用户会感觉系统服务不可用。
    • 窗口切换时可能会产生两倍于阈值流量的请求。假设限流阀值为5个请求,单位时间窗口是1s,如果我们在单位时间内的前0.8-1s和1-1.2s,分别并发5个请求。虽然都没有超过阀值,但是如果算0.8-1.2s,则并发数高达10,已经超过单位时间1s不超过5阀值的定义啦,通过的请求达到了阈值的两倍。
  3. 滑动窗口限流。滑动窗口限流解决固定窗口临界值的问题,可以保证在任意时间窗口内都不会超过阈值。滑动窗口除了需要引入计数器之外还需要记录时间窗口内每个请求到达的时间点,因此对内存的占用会比较多。
  4. 漏桶算法。类似消息队列思想,往漏桶中以任意速率流入水,以固定的速率流出水。当水超过桶的容量时,会被溢出,也就是被丢弃。达到削峰填谷,平滑请求。
  5. 令牌桶算法。
    • 令牌管理员根据限流大小,定速往令牌桶里放令牌。
    • 如果令牌数量满了,超过令牌桶容量的限制,那就丢弃。
    • 系统在接受到一个用户请求时,都会先去令牌桶要一个令牌。如果拿到令牌,那么就处理这个请求的业务逻辑;如果拿不到令牌,就直接拒绝这个请求。

熔断

暂时把调用目标服务的请求快速返回,不允许再重复调用目标服务。因为当目标服务在某段时间内出现大量的异常情况,这时候如果继续请求目标服务,大概率也还是返回异常结果。

熔断只是暂时停止调用,过一段时间后又会放一部分请求进来,看看后端服务是否恢复正常了。如一分钟内,服务的超时请求、500、503 等响应超过 100 次时,触发降级或者熔断。降级或者熔断 3 分钟后,尝试连续 10 次请求到后端服务,如果都正常返回了,则恢复。如果没有全部正常返回,则继续保持降级或者熔断状态,下一个 3 分钟后再来尝试恢复。

降级

类似熔断的场景。目标服务出现大量异常,这时候的响应不要像熔断那么简单粗暴,而是要有更加友好的响应。主要时为了当服务异常时,又想让服务看上去是正常的,有正常的返回。

降级常用的方法:

  1. 读旧数据,如果有备份数据、缓存数据,这时候也就可以利用起来了。
  2. 如果服务实现了多个解决方案,那么在方案1异常时,就可以切换到其他的方案来执行。
  3. 默认值,设置降级时返回默认值。
  4. 放弃部分请求,可以减少对后端服务的并发量。
  5. 降低质量,把耗时长、计算量大的逻辑直接跳过,不要求实时计算出所有结果。
  6. 反向过滤,如果需要过滤一个结果集太费劲,可以考虑不过滤,直接返回全部内容。
  7. 补偿,服务异常时记录下日志,事后再进行补偿性操作。

隔离

按种类隔离/用户隔离等方式隔离不同的依赖调用,避免服务之间相互影响。如源服务 A/B 都直接调用目标服务 C。源服务 A 出现突发的高并发来请求目标服务 C。导致目标服务 C 出现拥堵,那么,这时候也就会影响源服务 B 的请求。

服务治理

对服务进行管理、监控和控制,以确保其满足业务需求和合规要求。

服务治理包括以下方面:

  • 服务设计:确保服务的设计符合业务需求,并且遵循最佳实践和标准。
  • 服务开发:确保服务的开发质量和可靠性,遵循编码标准和规范。
  • 服务测试:确保服务在各种场景下都能正常工作,包括功能测试、性能测试和安全测试。
  • 服务部署:确保服务能够成功部署到目标环境中,并且可以与其他服务集成。
  • 服务监控:监控服务的运行状况,及时发现和解决问题,保证服务的稳定性和可靠性。
  • 服务升级:在必要的时候,对服务进行升级和更新,以满足业务需求和技术要求。
  • 服务管理:管理服务的整个生命周期,包括版本控制、文档管理、安全管理等。
  • 服务治理对于现代企业架构中的服务化架构非常重要,可以帮助企业实现服务的复用、提高服务质量、降低服务开发成本、提高服务可靠性和安全性。

负载均衡

简单来讲,负载均衡的作用就是把所有请求合理的分配到每一个服务实例上,避免某个服务实例一直处于负载过高的情况。

负载均衡常见算法

  1. 轮询法 & 加权轮询法
    • 轮询法:现在有三个服务实例,那么第1个请求就会调用实例1,第2个请求调用实例2,第3个请求调用实例3,第4个请求再调用实例1,第5个请求在调用实例2,这样循环下去。首先是设计一个递增的计数器,每个请求都会给计数器递增,然后用这个计数器对实例数量3进行取模操作,得到了余数即为要调用的实例。
    • 加权轮询法:实例1的权重是3,那么可以给它分配1、2、3这3个数字作为调用它的余数。实例2的权重是2,那么可以分配4、5这2个数字作为调用它的余数。实例1的权重是1,那么可以分配6这1个数字作为调用它的余数。请求进来,计数器还是一样的递增,只是不对实例数量3进行取模,而是对权重总和 3+2+1=6 进行取模,得到的余数也就知道要调用哪个实例了。
  2. 随机法 & 加权随机法:把计数器换成了随机数。每个请求进来,不再是给计数器递增,而是给请求分配一个随机数字,然后用这个随机数字进行取模操作,得到的余数就可以确定要调用的实例。
    • 随机法:对实例数量取模。
    • 加权随机法:对权重总和进行取模。
  3. 最小连接算法:优先调用连接数最少的服务实例。
  4. 源地址哈希法:通过哈希函数计算得到的一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。当想要一个用户的所有请求都调用到同一个实例,可以选择IP,或者用户 ID 等来进行哈希计算。

另外还有应用一致性哈希算法的负载均衡策略等。

负载均衡的实现方案,常见的一般在客户端、DNS、网关,另外也有在各种中间件组件处,如数据库代理,缓存代理等。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu20.04配置vscode

下载: https://az764295.vo.msecnd.net/stable/660393deaaa6d1996740ff4880f1bad43768c814/code_1.80.0-1688479026_amd64.debhttps://az764295.vo.msecnd.net/stable/660393deaaa6d1996740ff4880f1bad43768c814/code_1.80.0-1688479026_amd64.deb 安装&#xff1a…

MySQL基础篇第9章(子查询)

文章目录 1、需求分析与问题解决1.1 实际问题1.2 子查询的基本使用1.3 子查询的分类 2、单行子查询2.1 单行比较操作符2.2 代码示例2.3 HAVING中的子查询2.4 CASE中的子查询2.5 子查询中的空值问题2.6 非法使用子查询 3、多行子查询3.1 多行比较操作符3.2 代码示例3.3 空值问题…

vuepress - - - 首页底部版权信息加a标签超链接跳转或备案信息跳转链接

修改前 默认的底部版权信息只能填写纯文本,加不了超链接跳转等。 对应\docs\README.md内容: 修改后 修改后,点击Zichen跳转会打开新的网页。 看官网例子 底部添加了备案号跳转链接。 找到官网的github部署的文件。点导航栏中的“指…

flutter开发实战-实现webview与Javascript通信JSBridge

flutter开发实战-实现webview与H5中Javascript通信JSBridge 在开发中,使用到webview,flutter实现webview是使用原生的插件实现,常用的有webview_flutter与flutter_inappwebview 这里使用的是webview_flutter,在iOS上,…

【IMX6ULL驱动开发学习】20. input子系统(按键实现ls命令)

一、input子系统相关结构体 二、input子系统实例实现: static struct input_dev *key_input;...... ....../* 1.申请空间 */ key_input input_allocate_device(); if(key_input NULL){printk("input alloc failed\n");return -ENOMEM; } /* 2.设置事件类…

Go实现WebSocket

Go语言标准包里面没有提供对WebSocket的支持,但是在由官方维护的go.net子包中有对这个的支持,你可以通过如下的命令获取该包: go get golang.org/x/net/websocket WebSocket分为客户端和服务端,接下来我们将实现一个简单的例子:…

云进销存是什么意思,云进销存系统该如何选?

云进销存是指基于云计算技术的一种进销存管理系统,云进销存系统可以帮助企业或中小商户实时监控库存情况、优化采购和销售流程、提高物流效率,以及生成各类报表和统计分析,从而提升企业或商户的运营效率和管理水平。 一、云进销存对中小商户有…

C#,数值计算——不完全 Beta 函数(incomplete beta function)的源代码

Incomplete Beta Function The incomplete beta function (also called the Euler Integral) is a generalized β-function; An independent integral (with integral bounds from 0 to x) replaces the definite integral. The formula is: Where: 0 ≤ x ≤ 1, a, b > 0…

Pro白嫖esri数据

最近用Pro比较多,想跟大家谈谈一些关于Pro的 技巧。在谈之前,我想问大家一个问题,你真的了解ArcGIS Pro吗? 我想大多数刚刚接触Pro的用户应该是把Pro当做像Map一样的数据处理分析工具,只是简单的从其他地方下载数据来加入工程进行处理和分析 或许在你眼里的Pro和Map仅有…

在Orangepi上使用raspberry的dashboard

树莓派实验室整了一个比较酷的dashboard,可以用来显示树莓派状态,主要内容是基于js和php来实现,因为orangepi的用户名和密码都是一个套路,首先想到能不能移植。 https://www.rstk.cn/news/860562.html?actiononClick 首先需要做…

Docker把公共镜像推送到harbor私服的流程(企业级)

如果构建项目时,使用了k8s docker Jenkins的模式。 那么我们在docker构建镜像时,如果需要使用了Nodejs,那么我们必须得从某个资源库中拉取需要的Nodejs。 在企业里,正常都会把自己项目涉及的库都放在harbor私服里。 下面讲一下&…

数据分类分级

数据分类是数据管理的第一步,是数据治理的先行条件。当前,数据应用方兴未艾。“数据”作为新的生产要素资源,支撑供给侧结构性改革、驱动制造业转型升级的作用日益显现,正成为推动质量变革、效率变革、动力变革的新引擎。但与此同…

python3+requests+unittest实战系列【二】

前言:上篇文章python3requestsunittest:接口自动化测试(一)已经介绍了基于unittest框架的实现接口自动化,但是也存在一些问题,比如最明显的测试数据和业务没有区分开,接口用例不便于管理等&…

ROS中bag的录制、播放和使用

文章目录 前言一、bag录制二、bag信息查看三、bag播放四、bag的使用(以A-LOAM为例) 前言 传感器获取到的信息,有时我们可能需要实时处理,有时可能只是采集数据,事后分析,比如: 机器人导航实现中&#xff0…

Tomcat 基础

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、概述 二、安装 三、 目录结构 四、启停 五、配置文件 1. server.xml (1) Server (2) Listener (3) GlobalNamingResources (4) Service 01.Connector (1) port…

硬件故障恢复出文件之后数据库故障处理---惜分飞

客户那边硬件故障(raid损坏磁盘超过了极限,导致raid offline),通过硬件恢复出来数据文件,然后尝试自行恢复,我接手的时候大量数据文件resetlogs scn异常. 重建控制文件报错 WARNING: Default Temporary Tablespace not specified in CREATE DATABASE command Default Tempora…

Git安装详解(写吐了,看完不后悔)

Git 是一个非常流行的分布式版本控制系统,它帮助开发者管理和跟踪项目中的代码变化。通俗地说,可以认为 Git 就像是一个代码的时间机器,它记录了项目从开始到结束的每一次代码变动。 无论你是个人开发者还是团队成员,掌握 Git 都能…

三防平板在工业生产中的物料追溯与供应链管理

科技的不断发展和技术的不断进步,越来越多的企业开始关注物料追溯和供应链管理的重要性。特别是在工业生产中,确保物料的安全性和可追溯性对于提高生产效率和产品质量至关重要。10.1寸三防平板采用新一代英特尔Jasper Lake平台处理器赛扬RN5100&#xff…

SpringBoot2+Vue2实战(十七)vue集成markdown实现多级评论功能

新建数据库表 Article Data TableName("sys_article") public class Article implements Serializable {private static final long serialVersionUID 1L;TableId(value "id", type IdType.AUTO)private Integer id;/*** 标题*/private String name;/…

FreerRTOS(二值信号量和计数型信号量)

什么是信号量? 信号量(Semaphore),是在多任务环境下使用的一种机制,是可以用来保证两个或多个关键代 码段不被并发调用。 信号量这个名字,我们可以把它拆分来看,信号可以起到通知信号的作用&…