微服务
因为之前写的Springboot学习指南过长,这次就边写边发了,
本章节首先介绍微服务的一些内容,大概会分五到六篇的样子,写完就发不拖拉,
虽然很多人写过但是没关系万一你没看过呢,恰好你又看到了我写的内容.
这节可能有点干,但是还是请大家多喝水!内容稍微枯燥,我自己写的时候都是狂喝水,😁😁😁
1.微服务理论(个人理解)
微服务架构是一种软件架构设计方法,其中应用程序被拆分成一组小型、自治的服务单元,每个服务单元都专注于执行特定的业务功能,并且可以独立部署、扩展和管理。这些服务单元通过轻量级的通信机制(通常是HTTP/REST或消息队列)相互通信,以实现应用程序的整体功能。
以下是微服务架构的一些关键特点和优势:
- 模块化: 微服务将应用程序拆分成小的、松耦合的服务单元,每个单元都有明确定义的边界和功能。这使得开发、测试、部署和维护变得更加简单和灵活。
- 独立部署: 每个微服务都可以独立部署,这意味着你可以对系统的特定部分进行更新或修改,而不会影响到整个系统的运行。这降低了部署的风险,并且使得系统更容易扩展和维护。
- 技术多样性: 由于每个微服务都是独立的,因此可以使用不同的技术栈和编程语言来开发不同的服务单元,以满足特定的需求。这使得团队可以选择最适合他们需求的技术,并且可以灵活地进行技术升级或切换。
- 弹性和可伸缩性: 微服务架构可以根据需求对每个服务单元进行水平扩展,从而实现系统的弹性和可伸缩性。你可以根据流量的增减动态地增加或减少服务的实例数量,以确保系统始终具有所需的性能和可用性。
- 独立团队和快速交付: 每个微服务都由独立的团队负责开发和维护,这使得团队可以专注于特定的业务功能,并且可以快速地交付新功能或更新。此外,微服务架构还鼓励采用持续集成和持续交付(CI/CD)的实践,以实现快速迭代和反馈循环。
- 容错性和故障隔离: 微服务架构通过使用独立的服务单元来实现容错性和故障隔离。如果一个服务单元发生故障,只会影响到该服务单元的功能,而不会影响到整个系统的稳定性。
当谈到微服务时,我们可以将其比喻为一种建筑设计方法,其中软件应用程序被拆分成小的、独立的服务单元,每个服务单元都专注于执行特定的任务或功能。让我们用一个通俗易懂的比喻来解释微服务的理论:
想象你正在建造一座大型城市,而这个城市是你的软件应用程序。传统的单体应用程序就像是整个城市都建在一个大型建筑物里,所有的功能和服务都集中在一个地方。这可能会导致一些问题,比如如果需要对城市进行维护或扩展,会非常困难,而且一旦发生故障,整个城市就会瘫痪。
现在,想象你决定用微服务的方式来建造你的城市。相比于一个巨大的建筑物,你把城市拆分成了许多小区域,每个小区域都有自己的功能和服务,比如一栋建筑是一个服务单元,专门负责提供住宅服务,另一栋建筑是另一个服务单元,负责提供商业服务,而交通、娱乐等功能也都有各自的建筑。每个小区域(或服务 单元)都可以独立运行,而且可以根据需要灵活地扩展或更新,而不会影响到其他区域。这就是微服务的概念:将复杂的应用程序拆分成小的、可独立部署的服务单元,以提高灵活性、可维护性和可扩展性。
通过这种方式,当你需要修改或更新城市的某个部分时,你只需要关注到这个特定的区域,而不需要影响到整个城市的运行。这使得开发、测试和部署变得更加简单和高效,同时也减少了单点故障的风险。
总的来说,微服务就像是把一个大城市拆分成许多小社区,每个社区都有自己的功能和服务,使得整个系统更加灵活、可维护和可扩展。
2.分布式概念及基本思想
[图片上传失败...(image-7d97f0-1709663256835)]
分布式是指将一个系统或应用程序的各个部分分散在多台计算机上,这些计算机通过网络进行通信和协作,以完成共同的目标。
集群是指将多台计算机组合在一起,作为一个整体对外提供服务。集群中的计算机通常具有相同的硬件和软件配置,并通过网络进行连接。
分布式和集群的区别在于:
- 分布式强调的是系统的各个部分之间的分工和协作,而集群强调的是多台计算机的组合和统一管理。
- 分布式中的每个节点都可以做集群,而集群不一定就是分布式的。例如,一个 Web 服务器集群可以看作是分布式系统中的一个节点。
分布式中的每个节点都可以做集群,因为每个节点都可以提供特定的功能或服务。例如,一个分布式文件系统中的每个节点都可以存储一部分文件数据。
集群不一定就是分布式的,因为集群中的所有节点可以提供相同的功能或服务。例如,一个 Web 服务器集群中的所有节点都提供 Web 服务器服务。
在实际应用中,分布式和集群经常被混淆使用。例如,我们可以将其比喻为一群工人,他们分散在不同的地方,但通过协作和通信完成共同的任务。每个工人都有自己的特长和职责,他们需要相互协作,以完成整个任务。
而集群则像是一家工厂,里面有许多相同的机器和设备,它们一起协作来生产产品。这些机器可能会被集中放置在一起,也可能分布在不同的地方,但它们都是为了共同的目标而服务。
在这个比喻中,分布式系统强调的是分散在不同地方的工人之间的分工和协作,而集群则强调的是机器之间的组合和统一管理。每个分布式系统中的节点都可以看作是一个工人,而集群中的每台机器则相当于一个工厂中的一台设备。
总结
分布式和集群是两种不同的技术,它们可以相互结合使用。分布式强调的是系统的各个部分之间的分工和协作,而集群强调的是多台计算机的组合和统一管理。分布式中的每个节点都可以做集群,而集群不一定就是分布式的。
2.1分布式系统架构的演变
分布式系统的架构演变是一个历史悠久的过程,经历了多个阶段和发展趋势。以下是分布式系统架构演变的主要阶段和特点:
-
早期阶段:基于RPC和消息传递的分布式系统
- 在分布式系统的早期阶段,通信主要是通过远程过程调用(RPC)和消息传递来实现的。这些系统通常由多个节点组成,节点之间通过网络进行通信。
- 这种架构简单直接,但也存在一些问题,比如容错性差、扩展性有限等。
-
中期阶段:基于消息队列和中间件的分布式系统
- 随着业务需求的增加和技术的发展,分布式系统逐渐采用消息队列和中间件来实现异步通信和解耦。
- 消息队列提供了可靠的消息传递机制,可以解决网络延迟和节点故障等问题,同时中间件(如消息代理)可以提供一些额外的功能,比如负载均衡、消息路由等。
-
近期阶段:基于微服务和容器的分布式系统
- 随着云计算和容器技术的兴起,微服务架构逐渐成为主流。微服务将应用程序拆分成小的、自治的服务单元,每个服务单元都可以独立部署和扩展。
- 容器技术(如Docker、Kubernetes等)为微服务的部署和管理提供了更加灵活和高效的解决方案,使得分布式系统更加容易构建、部署和维护。
-
未来趋势:基于Serverless和边缘计算的分布式系统
- 未来,随着边缘计算和Serverless架构的发展,分布式系统可能会进一步演变。
- Serverless架构将应用程序的部署和管理交给云服务提供商,开发人员只需关注业务逻辑,而边缘计算则将计算资源推向网络边缘,使得数据处理更加快速和实时。(个人不建议大家现阶段去研究)
总的来说,分布式系统的架构演变是一个不断发展的过程,始终围绕着提高系统的可靠性、可扩展性和灵活性这一核心目标。随着技术的不断进步和业务需求的变化,我们可以预见分布式系统架构会继续朝着更加简单、高效和智能的方向发展。
2.2RPC的设计原理
RPC(Remote Procedure Call,远程过程调用) 是一种分布式系统中的通信模式,它允许一个进程调用另一个进程(通常是在不同的机器上)上的函数或方法,就像调用本地函数一样。以下是RPC的设计原理:
[图片上传失败...(image-585a15-1709663256835)]
客户端-服务器模型: RPC基于客户端-服务器模型,其中客户端向服务器发送请求,服务器执行请求并返回结果。客户端和服务器可以位于不同的机器上,并通过网络进行通信。
通信协议: RPC系统通常使用一种网络协议来进行通信,比如TCP/IP或HTTP。通信协议负责在客户端和服务器之间传输请求和响应数据,并提供可靠性和安全性保障。
Stub和Skeleton: 在RPC系统中,客户端和服务器都有一些本地代理,分别称为Stub和Skeleton。Stub负责将本地调用转换为网络消息,并将响应消息转换为本地调用;而Skeleton负责接收网络消息,解析请求并调用本地的服务实现。
序列化和反序列化: 在RPC系统中,客户端和服务器之间需要传输的数据通常以对象或结构体的形式存在。因此,需要进行序列化(将对象转换为字节流)和反序列化(将字节流转换为对象)操作,以在网络上传输数据。
服务注册与发现: 在RPC系统中,客户端需要知道服务器的位置和服务接口信息,而这些信息通常是通过服务注册中心或服务发现机制来获取的。服务注册中心负责维护服务的元数据信息,包括服务名称、地址、端口号等,并将这些信息提供给客户端。
远程调用: 当客户端调用远程方法时,客户端的Stub将调用转换为网络消息,并将消息发送到服务器。服务器的Skeleton接收到消息后,解析请求并调用本地的服务实现。服务执行完成后,服务器将结果返回给客户端,客户端的Stub将结果解析为本地调用的返回值。
总的来说,RPC的设计原理是通过远程调用的方式实现客户端和服务器之间的通信和协作,使得分布式系统中的不同部分可以像调用本地函数一样进行交互,从而简化了分布式系统的开发和维护。
2.3分布式常规知识点(面试题?⚠️⚠️⚠️
)
2.3.1 高并发
1)通过设计保证系统可以并行处理很多请求,应对大量流量与请求。
- Tomcat最多支持并发多少用户?
Tomcat 默认配置的最大请求数是 150,也就是说同时支持 150 个并发,当然了也可以将其重新配置,当某个应用拥有250个以上的并发的时候,应考虑用服务器集群。具体能承载多少并发需要看硬件配置cpu越多性能越高,分配给jvm的内存越多,性能也就越高。但是也会增加GC的负担。
- 操作系统对于进程中的线程数有一定的限制。
Windows每个进程中的线程数不允许超过2000。(基本不用作生产)
Linux每个进程中的线程数不允许超过1000。
另外,在 Java 中,每开启一个线程需要耗用 1MB 的 JVM 内存空间用作于线程栈之用。
Tomcat 默认的 HTTP 实现是采用阻塞式的 Socket 通讯,每个请求都需要创建一个线程处理。这种模式下的并发量受到线程数的限制,但对于Tomcat来说几乎没有bug存在。
Tomcat 还可以配置 NIO 方式的 Socket 通讯,在性能上高于阻塞式的。 每个请求也不需要创建一个线程进行处理,并发能力比前者高,但是没有阻塞式的成熟。
这个并发能力还与应用的逻辑密切相关:
如果逻辑很复杂,需要大量的计算,那么并发能力势必会下降,如果每个请求都含有很多的数据库操作,那么对于数据库的性能也非常高。对于单台数据库服务器来说,允许客户端的连接数量是有限的,并发能力涉及整个架构系统。和业务逻辑。
并发能力涉及整个架构系统和业务逻辑。
系统环境不同,Tomcat 版本不同,JDK 版本不同以及修改的设定参数不同,并发量的差异还是很大的
maxThreads="1000" 最大并发数设置,默认值为200
minSpareThreads=“100” 初始化时创建的线程数,默认值为10
acceptCount=“700” 指定当所以可以使用的处理请求和线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,默认值为100
配置参考地址:https://tomcat.apache.org/tomcat-8.0-doc/config/http.html
2 )高并发衡量指标。
高并发衡量指标是指用来衡量系统在高并发情况下的性能指标。这些指标可以帮助我们了解系统的负载能力、响应速度和稳定性。
常见的高并发衡量指标包括:
- QPS (Queries Per Second) :每秒查询数,指的是系统每秒能够处理的请求数量。
- TPS (Transactions Per Second) :每秒事务数,指的是系统每秒能够处理的事务数量。
- RT (Response Time) :响应时间,指的是系统处理请求的平均时间。
- 并发数:同时处理的请求数量,指的是系统能够同时处理的请求数量。
- 吞吐量:单位时间内处理的请求数量,指的是系统单位时间内能够处理的请求数量。
QPS 和 TPS 是衡量系统处理能力的重要指标。QPS 和 TPS 越大,说明系统处理请求的能力越强。
RT 是衡量系统响应速度的重要指标。RT 越小,说明系统响应速度越快。
并发数 是衡量系统负载能力的重要指标。并发数越高,说明系统能够同时处理的请求越多。
吞吐量 是衡量系统整体性能的重要指标。吞吐量越高,说明系统的整体性能越好。
除了以上指标之外,还可以根据具体的应用场景来定义其他指标。例如:
- 错误率:请求失败的比例,指的是请求失败的比例。
- 资源利用率:CPU、内存、网络等资源的使用情况,指的是 CPU、内存、网络等资源的使用情况。
在实际应用中,需要根据系统的具体情况来选择合适的衡量指标。
以下是一些使用高并发衡量指标的建议:
设定合理的阈值:对于每个指标,都需要设定合理的阈值。当指标超过阈值时,需要采取措施来解决问题。
定期监控指标:需要定期监控指标,以了解系统的运行状况。
分析指标趋势:需要分析指标趋势,以发现潜在的问题。
-
常见的高并发测试工具包括:
- JMeter:一款开源的 Java 应用性能测试工具,可以用于模拟各种类型的负载,包括 HTTP、HTTPS、FTP、JDBC、SOAP 等。
- LoadRunner:一款商业的负载测试工具,可以用于测试各种类型的应用程序,包括 Web 应用程序、移动应用程序、API 等。
- ApacheBench:一款开源的 HTTP 负载测试工具,可以用于测试 Web 服务器的性能。
- Gatling:一款开源的 Scala 负载测试工具,可以用于模拟大量用户的并发请求。
- WebLOAD:一款商业的负载测试工具,可以用于测试 Web 应用程序和 API。
通过使用高并发衡量指标,可以帮助我们了解系统的性能,并找到改进的方向。
2.3.2 高可用
高可用(High Availability,HA) 是指系统能够在面对硬件、软件或者其他异常情况时,仍然能够保持稳定运行并提供服务的能力。在Java应用程序中实现高可用性需要综合考虑多个方面,包括架构设计、技术选型、容错机制等。以下是高可用性的一些常见技术解决方案:
- 主备模式(Active-Passive): 在主备模式中,系统中的主节点负责处理所有的请求,而备节点则处于待命状态。当主节点发生故障时,备节点会自动接管服务,成为新的主节点,从而实现故障切换和持续的服务可用性。
- 多活模式(Active-Active): 在多活模式中,系统中的多个节点都处于活动状态,并且都在处理请求。每个节点都具有相同的功能和数据,可以独立地处理请求。当一个节点发生故障时,流量会自动转移到其他健康的节点上,从而实现故障切换和服务的持续性。
- 冗余备份模式(Redundancy): 冗余备份模式通过在系统中添加冗余的组件或节点来实现高可用。当一个组件或节点发生故障时,系统可以自动切换到备用组件或节点上,从而保障服务的持续性。
更多的考虑如下:
- 容器化和编排: 使用容器化技术(如Docker)将应用程序打包成容器,并使用容器编排工具(如Kubernetes)来管理和调度容器实例,实现快速部署、自动伸缩和故障恢复。
- 数据库主从复制: 使用数据库主从复制技术来实现数据的备份和容灾,确保系统在主数据库故障时能够自动切换到备用数据库,保证数据的可用性和一致性。
- 分布式存储: 使用分布式存储系统(如HDFS、GlusterFS等)来存储数据,实现数据的备份和容灾,避免单点故障和数据丢失。
- 消息队列: 使用消息队列(如RabbitMQ、Kafka等)来实现异步消息传递和解耦,减少系统间的直接依赖关系,提高系统的稳定性和可用性。
- 健康检查和自动恢复: 实现健康检查和自动恢复机制,定期检测系统的健康状态,当发现异常时自动进行故障转移或恢复,减少人工干预和减轻系统负担。
- 灾备和容灾: 配置灾备和容灾方案,将系统部署在不同的地理位置或数据中心,确保在灾难发生时能够快速切换到备用系统,保障业务的持续运行。
- 持续监控和报警: 配置监控系统来实时监测系统的运行状态和性能指标,当发现异常时及时发出报警并采取相应的应对措施,避免问题扩大化。
2.3.3 注册中心
注册中心概述
注册中心 是微服务架构中的一个核心组件,用于管理和维护微服务实例的信息,包括服务的名称、地址、端口等信息。注册中心充当着服务发现和服务注册的中心化管理者,使得微服务之间可以动态地发现和调用彼此,从而实现了微服务架构的核心特性之一:服务治理。
注册中心的主要功能包括:
- 服务注册:服务提供者将自己的信息注册到注册中心
- 服务发现:服务消费者从注册中心获取服务提供者的信息
- 健康检查:注册中心定期检查服务提供者的健康状况
- 负载均衡:注册中心可以根据一定的策略为服务消费者选择服务提供者
那么带着你的思考我们来看看以下的问答内容:
什么是注册中心?(easy)
注册中心是微服务架构中的一个核心组件,用于管理和维护微服务实例的信息,包括服务的名称、地址、端口等信息。它充当着服务发现和服务注册的中心化管理者,使得微服务之间可以动态地发现和调用彼此。
注册中心的作用是什么?(easy)
注册中心的作用主要包括两个方面:
- 服务注册:微服务启动时向注册中心注册自己的信息,包括服务名称、地址、端口等。
- 服务发现:微服务在需要调用其他服务时,向注册中心查询目标服务的信息,获取到服务地址后再进行调用。
常见的注册中心有哪些?(easy)
常见的注册中心包括:
- Netflix Eureka
- Apache ZooKeeper
- Consul
- etcd 等
注册中心和负载均衡有什么关系?
注册中心通常和负载均衡配合使用。注册中心负责管理和维护微服务实例的信息,而负载均衡器则负责将请求分发到多个微服务实例上,以实现负载均衡和高可用性。
注册中心的实现原理是什么?
注册中心的实现原理通常涉及到网络通信、数据存储和服务发现等方面。具体来说,注册中心通过接收微服务实例的注册请求,并将注册信息存储在自身的存储介质中(如内存、数据库等)。当其他微服务需要调用某个服务时,它们向注册中心发送查询请求,注册中心根据查询条件返回相应的服务实例信息。
如何保证注册中心的高可用性?
为了保证注册中心的高可用性,可以采用以下策略:
- 集群部署:使用多个注册中心实例组成集群,避免单点故障。
- 数据备份:定期对注册中心的数据进行备份,以防止数据丢失。
- 心跳检测:注册中心定期向微服务发送心跳检测请求,以确保服务实例的可用性。
- 自动故障转移:当注册中心的某个实例发生故障时,自动切换到其他可用的实例上。
2.3.4 负载均衡
[图片上传失败...(image-b8c289-1709663256835)]
负载均衡(Load Balancing) 是一种将网络请求分发到多个服务器或者服务器集群上的技术,以实现资源的合理利用、提高系统的性能和可用性。常见的负载均衡策略包括:
- 轮询(Round Robin): 轮询是一种最简单的负载均衡策略,将请求依次分配给每个服务器,按照顺序循环进行。当有新的请求到达时,负载均衡器会将其分配给下一个服务器,直到所有的服务器都被轮询过一遍,然后重新开始。轮询策略适用于所有服务器的性能相近且负载相对均衡的情况。
- 加权轮询(Weighted Round Robin): 加权轮询是对轮询策略的一种扩展,通过为每个服务器分配一个权重值来调节服务器的负载比例。权重值越高的服务器,被分配到请求的概率越大。加权轮询策略可以根据服务器的性能和配置情况,灵活地调整负载均衡的效果。
- 最少连接(Least Connections): 最少连接策略会将新的请求分配给当前连接数最少的服务器,以实现请求的均衡分配。这种策略适用于服务器的性能差异较大或者每个连接的处理时间不同的情况下,可以有效地减少响应时间和提高系统的吞吐量。
- IP哈希(IP Hash): IP哈希策略根据客户端的IP地址计算哈希值,并将哈希值映射到固定范围内的服务器上。这样相同IP的请求会被分配到同一台服务器上,可以确保同一用户的请求都被发送到同一个服务器上,有利于保持会话的一致性。
- 最少响应时间(Least Response Time): 最少响应时间策略会将新的请求分配给响应时间最短的服务器,以减少用户等待时间和提高用户体验。这种策略通常需要负载均衡器实时监测服务器的响应时间,并动态调整请求的分发策略。
- 随机(Random)负载均衡。在随机策略中,负载均衡器会随机选择一个服务器来处理每个请求,而不考虑服务器的负载情况或其他因素。随机策略简单直接,适用于服务器之间的负载相对均衡或者请求的到达频率较低的情况。然而,由于随机分配无法保证每个服务器的负载均衡,因此在一些场景下可能会导致某些服务器负载过高,而其他服务器负载过低的情况。
以下是一些负载均衡策略的优缺点:
轮询
- 优点:简单易行,实现成本低。
- 缺点:不能根据服务器的负载情况进行调整。
加权轮询
- 优点:可以根据服务器的性能和负载情况进行调整,提高系统的负载均衡。
- 缺点:实现成本较高。
最少连接
- 优点:可以将请求分发到负载最小的服务器上,提高系统的负载均衡。
- 缺点:可能会导致服务器连接数过多,影响服务器性能。
哈希
- 优点:可以将请求分发到指定的服务器上,提高缓存命中率。
- 缺点:如果服务器发生故障,可能会导致请求集中到其他服务器上,影响系统性能。
最少响应时间
- 优点:可以提高系统的响应速度,提升用户体验。可以将请求分发到负载最小的服务器上,提高系统的负载均衡。
- 缺点: 可能会导致服务器负载不均衡,影响系统的稳定性。对服务器的性能要求较高。
随机
- 优点:简单易行,实现成本低。
- 缺点:不能保证每个服务器的负载均衡。
总结
负载均衡 是提高系统性能和可用性的重要技术。选择合适的负载均衡策略可以根据系统的具体情况进行。
2.3.5 服务雪崩
服务雪崩是指在分布式系统中,由于某个服务节点的故障或异常引发了连锁反应,导致系统中大量的服务节点都出现故障或异常,最终导致整个系统崩溃的现象。服务雪崩通常是由于系统中的多个服务之间存在依赖关系,当某个服务节点出现故障时,会导致其依赖的其他服务节点也无法正常工作,进而引发更多的故障,最终形成雪崩效应。
以下是服务雪崩的一些常见原因和预防措施:
单点故障: 如果系统中存在单点故障,当这个单点故障发生时,会导致该节点的所有依赖服务都不可用,进而引发整个系统的雪崩效应。预防措施包括通过集群和负载均衡来消除单点故障。
依赖服务的超时或阻塞: 如果某个服务依赖的其他服务出现了超时或者阻塞,会导致该服务的请求得不到及时响应,从而引发整个系统的雪崩效应。预防措施包括设置适当的超时时间、实现服务的异步调用以及采用熔断机制。
扩容不及时: 如果系统在高负载时没有及时扩容,会导致服务节点过载,进而引发雪崩效应。预防措施包括实时监控系统负载,并根据负载情况进行动态扩容。
数据库连接池耗尽: 如果系统中的数据库连接池被耗尽,会导致所有的数据库请求都无法得到响应,从而引发雪崩效应。预防措施包括优化数据库查询、合理配置连接池参数以及实现数据库的读写分离。
缓存击穿: 如果系统中的缓存服务发生击穿,会导致大量的请求直接击中数据库,从而引发雪崩效应。预防措施包括设置合理的缓存过期时间、使用互斥锁避免同时加载数据以及实现熔断机制。
6.服务雪崩是指在分布式系统中,由于某个服务节点的故障或异常引发了连锁反应,导致系统中大量的服务节点都出现故障或异常,最终导致整个系统崩溃的现象。服务雪崩通常是由于系统中的多个服务之间存在依赖关系,当某个服务节点出现故障时,会导致其依赖的其他服务节点也无法正常工作,进而引发更多的故障,最终形成雪崩效应。
以下是服务雪崩的一些常见原因和预防措施:
单点故障: 如果系统中存在单点故障,当这个单点故障发生时,会导致该节点的所有依赖服务都不可用,进而引发整个系统的雪崩效应。预防措施包括通过集群和负载均衡来消除单点故障。
依赖服务的超时或阻塞: 如果某个服务依赖的其他服务出现了超时或者阻塞,会导致该服务的请求得不到及时响应,从而引发整个系统的雪崩效应。预防措施包括设置适当的超时时间、实现服务的异步调用以及采用熔断机制。
扩容不及时: 如果系统在高负载时没有及时扩容,会导致服务节点过载,进而引发雪崩效应。预防措施包括实时监控系统负载,并根据负载情况进行动态扩容。
数据库连接池耗尽: 如果系统中的数据库连接池被耗尽,会导致所有的数据库请求都无法得到响应,从而引发雪崩效应。预防措施包括优化数据库查询、合理配置连接池参数以及实现数据库的读写分离。
缓存击穿: 如果系统中的缓存服务发生击穿,会导致大量的请求直接击中数据库,从而引发雪崩效应。预防措施包括设置合理的缓存过期时间、使用互斥锁避免同时加载数据以及实现熔断机制。
-
示例如图 首先,由于
Service A
的流量突然增加,可能由于某些原因如突然的用户访问量增加或者系统内部其他因素引发了流量波动。Service A
虽然可以扛住请求,但是它的突发流量可能导致其他服务如
Service B和
Service C`无法承受,导致它们发生了阻塞或者线程资源耗尽的情况。当
Service C
不可用时,它可能会导致Service B
的请求被阻塞,而Service B
的线程资源被耗尽。最终,整个服务链路都因为服务雪崩而变得不可用,导致整个系统瘫痪。
措施
这种情况下,服务雪崩的发生是由于系统中的一个服务的故障或者异常引发了连锁反应,导致整个服务链路都崩溃。因此,对于构建分布式系统来说,需要采取一系列的预防措施,包括优化系统架构、合理设计服务之间的依赖关系、实现服务的熔断和降级机制等,以减少服务雪崩的风险。
[图片上传失败...(image-321701-1709663256835)]
2.3.6 熔断
熔断(Circuit Breaker) 是一种用于构建可靠的分布式系统的设计模式,主要用于防止因服务故障或延迟而导致整个系统的雪崩效应。熔断器类似于电路中的保险丝,在系统中监控对特定服务的请求,当请求失败率达到设定的阈值时,熔断器会打开,停止对该服务的请求,而不是一直等待服务恢复正常。
以下是熔断器的一些重要特性和工作原理:
- 状态管理: 熔断器有三种状态:关闭(Closed)、半开(Half-Open)和打开(Open)。在正常情况下,熔断器处于关闭状态,允许请求通过。当请求失败率超过设定阈值时,熔断器会转换为打开状态,拒绝所有请求。在打开状态下,熔断器会定期尝试将一部分请求发送给目标服务,以检查服务是否已经恢复正常,如果检测到服务恢复,则将熔断器转换为半开状态,允许部分请求通过,否则继续保持打开状态。
- 故障检测: 熔断器会监控对目标服务的请求,并根据请求的成功或失败来计算失败率。当失败率超过设定的阈值时,熔断器会打开,停止向目标服务发送请求。
- 熔断器打开时的处理: 当熔断器打开时,系统可以执行一些预设的操作,如返回默认值、执行降级逻辑或者返回错误信息等。这样可以避免系统因为等待失败的请求而导致的资源浪费和响应延迟。
- 熔断器的自我恢复: 一旦熔断器打开,它会定期尝试将一部分请求发送给目标服务,以检查服务是否已经恢复。如果检测到服务恢复,熔断器会转换为半开状态,允许一部分请求通过,否则继续保持打开状态。
- 示例:当熔断器打开时,系统可以返回一些预先定义的兜底数据,以确保用户获得某种反馈,而不是完全失去响应。这些兜底数据通常是一些默认值、静态内容或者先前缓存的数据,能够帮助用户继续执行某些操作,而不受服务不可用的影响。
[图片上传失败...(image-8a4580-1709663256835)]
-
常用的熔断技术:
- Hystrix: Hystrix 是 Netflix 开源的一款熔断器框架,提供了线程隔离、超时控制、降级处理等功能。通过使用 Hystrix,可以在调用外部服务时设置超时时间和降级策略,并监控服务的健康状态,及时触发熔断操作。Hystrix 提供了丰富的配置选项和监控功能,可以方便地集成到 Spring Cloud、Dropwizard 等常见的 Java 微服务框架中。(用的比较多)
- Resilience4j: Resilience4j 是另一个流行的 Java 容错库,提供了熔断、重试、限流等功能。与 Hystrix 不同,Resilience4j 更轻量级,易于使用,并且对函数式编程有良好的支持。Resilience4j 提供了类似于 Hystrix 的熔断器模式,并且可以与 Spring Boot、Micronaut 等框架无缝集成。
- Sentinel: Sentinel 是阿里巴巴开源的一款流量控制和熔断降级框架,提供了实时的流量监控、规则配置和熔断降级等功能。Sentinel 可以用于保护微服务架构中的服务免受流量突发或异常的影响,具有较高的灵活性和性能。
- Akka: Akka 是一款基于 Actor 模型的并发编程框架,在分布式系统中也提供了熔断和容错的支持。通过 Akka 的 Fault Tolerance(容错)机制,可以实现监控和处理外部服务的故障,确保系统的稳定性和可用性。
熔断小结
通过引入熔断器机制,系统可以在面临服务故障或延迟时,及时停止对该服务的请求,避免了因等待失败的请求而导致整个系统的雪崩效应。这有助于提高系统的稳定性和可靠性,保障用户的体验和服务的持续可用性。
2.3.7限流
限流概述
限流是一种用于控制系统流量的策略,通过限制系统的请求量或者并发数,以保护系统免受过载的影响。限流操作通常在系统的边界处(如网关、负载均衡器或者应用程序内部)进行,可以保障系统安全,防止恶意攻击。可以有效地保护系统免受突发流量的影响,提高系统的稳定性和可用性。
以下是一些常见的限流操作和原因:
- 平滑流量: 限流操作可以平滑系统的流量,防止突发流量对系统造成冲击。通过限制每个时间段内的请求数或者并发数,可以有效地控制系统的负载,避免系统被瞬时高并发请求拖垮。
- 保护系统资源: 限流操作可以保护系统的资源不被耗尽。在高并发的情况下,如果系统没有限制请求量或者并发数,可能会导致系统资源(如线程、内存、数据库连接等)被耗尽,进而导致系统崩溃。
- 防止雪崩效应: 限流操作可以防止由于某个服务故障或者延迟而导致的雪崩效应。通过限制请求量或者并发数,可以减轻系统的负载,降低因单点故障而引发的连锁反应。
- 保护下游服务: 限流操作可以保护下游服务免受突发流量的影响。当系统中的某个服务产生大量请求时,可能会对下游服务造成压力,通过限制请求量或者并发数,可以有效地控制流量,避免对下游服务造成影响。
- 提高系统稳定性: 通过限流操作,可以保证系统在各种负载情况下都能够稳定运行,提高系统的可靠性和稳定性,保障用户的体验。
[限流器] | ↓ [请求] --> [限流判断] --> [允许通过] --> [目标服务] | | ↓ ↓ [拒绝请求] [等待/重试] ↑ | [DDoS攻击]
在这个示意中:
请求首先经过限流器,限流器会对请求进行判断。
如果请求被限流器判断为允许通过,则直接发送到目标服务。
如果请求被限流器判断为拒绝,则拒绝请求,返回相应的错误或提示信息给客户端。
在一些情况下,如果请求被限流器判断为等待或者需要重试,则可能会等待一段时间后再次尝试发送请求。
-
同时,如果系统受到恶意的DDoS攻击,攻击者可能会发送大量的无效请求,导致系统负载过高。在这种情况下,限流器可能会将这些恶意请求识别为拒绝,以保护系统免受攻击。 扩展内容:识别恶意的DDoS攻击通常需要使用一些特定的技术和策略,以下是一些常见的方法:
- 流量分析: 监控系统的流量模式,如果检测到突然出现大量的请求流量,而且这些请求流量来源具有相似的特征(如来源IP地址、请求路径等),很可能是DDoS攻击。通过分析流量的特征可以识别和过滤恶意请求。
- IP黑名单: 维护一个IP黑名单,将一些已知的恶意IP地址或者IP地址段添加到黑名单中,从而阻止这些IP地址的请求。可以使用防火墙、反向代理等工具来配置IP黑名单,对来自黑名单中的IP地址的请求进行拦截。
- 基于规则的过滤: 配置一些规则来过滤恶意请求,例如限制某个IP地址或者IP地址段的请求频率、设置白名单和黑名单等。这些规则可以根据请求的特征、行为模式或者来源进行定义。
- 行为分析: 对请求的行为进行分析,如果检测到某些请求具有异常的行为模式(如大量的重复请求、异常的请求路径、异常的请求参数等),很可能是DDoS攻击。可以使用行为分析技术来检测和识别这些异常行为。
- 机器学习: 使用机器学习算法对请求进行分析和分类,训练模型来识别恶意请求。通过监督学习或者无监督学习的方法,可以识别出与正常请求不同的恶意请求模式,并及时做出响应。
综合利用以上方法,可以有效地识别和应对恶意的DDoS攻击,保护系统免受攻击的影响。通常,采用多种技术和策略相结合的方式,可以提高系统对DDoS攻击的识别和应对能力。
常用的限流技术:
- 令牌桶算法(Token Bucket): 令牌桶算法是一种基于令牌的限流算法,它通过维护一个令牌桶来控制请求的流量。每当有请求到达时,算法会检查令牌桶中是否有足够的令牌,如果有,则允许请求通过,并从令牌桶中消耗一个令牌;如果没有,则拒绝请求或者将请求放入队列等待。令牌桶算法可以灵活地调整令牌产生的速率和令牌桶的容量,从而实现不同程度的限流。
- 漏桶算法(Leaky Bucket): 漏桶算法是一种基于漏桶的限流算法,它通过维护一个固定容量的漏桶来控制请求的流量。每当有请求到达时,算法会向漏桶中加入一个请求,如果漏桶已满,则拒绝请求;同时,漏桶以固定的速率漏水,每当漏桶中有请求时,就会以固定的速率处理请求。漏桶算法可以平滑地限制请求的流量,防止突发流量对系统造成影响。
- 计数器算法(Counting): 计数器算法是一种基于计数器的限流算法,它通过统计一定时间内的请求数量来控制请求的流量。当请求到达时,算法会将请求计数加一,同时检查当前计数是否超过设定的阈值,如果超过则拒绝请求。计数器算法可以简单地控制请求的总量或者每个时间窗口内的请求数量。
- 基于漏斗模型的限流: 基于漏斗模型的限流算法是一种将请求看作流水流入漏斗的模型,漏斗具有固定的容量和固定的漏水速率,当请求流入漏斗时,如果漏斗未满,则允许请求通过;否则拒绝请求。基于漏斗模型的限流算法可以平滑地控制请求的流量,避免突发流量对系统的影响。
限流小结
总的来说,限流操作是一种有效的保护机制,能够帮助系统应对各种不可预测的情况,保证系统的稳定性和可用性。在设计系统时,合理设置限流策略是非常重要的一环。
2.3.8API网关
[图片上传失败...(image-9c4626-1709663256835)]
API网关概述
API网关是现代化微服务架构中的核心组件之一,负责管理和控制所有进出系统的API请求。其核心内容包括以下几个方面:
- API路由管理: API网关负责接收所有来自客户端的API请求,并将其路由到相应的后端服务或微服务。通过路由管理,API网关可以根据请求的路径、方法、版本等信息,将请求转发到正确的目标服务。
- 请求转发和负载均衡: API网关可以将接收到的API请求转发到后端多个微服务实例,实现负载均衡和高可用性。通过请求转发和负载均衡,API网关可以提高系统的性能和可靠性,并有效地处理大量的请求流量。
- 安全认证和授权: API网关负责对所有进入系统的API请求进行安全认证和授权,验证请求的身份和权限。通过集中管理安全策略和访问控制,API网关可以保护系统免受恶意攻击和非法访问。
- API监控和分析: API网关可以收集、监控和分析所有进出系统的API请求,包括请求的性能指标、流量统计、错误日志等信息。通过API监控和分析,可以实时了解系统的运行状态和性能状况,及时发现和解决问题。
- 请求转换和消息转换: API网关可以对请求和响应进行转换和处理,包括参数校验、格式转换、消息编解码等操作。通过请求转换和消息转换,可以实现请求的标准化和规范化,提高系统的互操作性和灵活性。
- 缓存和数据缓存: API网关可以对请求和响应进行缓存,减少对后端服务的请求次数,提高系统的性能和响应速度。通过缓存和数据缓存,可以有效地减轻后端服务的压力,并提供更好的用户体验。
综上所述,API网关作为现代化微服务架构的核心组件,承担着路由管理、请求转发、安全认证、监控分析等多种功能,是实现微服务架构中服务治理和API管理的重要工具。
国内常用的API gateway的技术:
-
Spring Cloud Gateway
- Spring Cloud Gateway 是基于Spring框架的API Gateway解决方案,提供了路由转发、过滤器链、断路器、限流等功能,适用于构建微服务架构中的API网关层。由于其深度整合Spring Boot和Spring Cloud生态,深受国内开发者喜爱。
-
Apache APISIX
- Apache APISIX 是一个动态、实时、高性能的API网关,采用LuaJIT编写,同时也提供了Java SDK支持。它具有热更新、丰富的插件机制以及与众多云原生基础设施的良好集成能力,被越来越多的企业采纳用于微服务场景下的API管理。
-
Netflix Zuul
- Netflix Zuul 在早期微服务流行时期被广泛使用,尽管现在Netflix已经停止维护 Zuul 1.x,但Zuul 2.x(Zuul Proxy)仍在持续开发中,它是一个基于Java的API Gateway,适合构建在Spring Cloud体系之外的微服务环境。
-
Kong
- Kong 是一个云原生、高速、可扩展的开源API Gateway,支持包括Java在内的多种语言的插件开发,虽然它本身不是用Java编写的,但由于其易用性、灵活性和强大的插件市场,在国内也有一定的应用基础。
-
Alibaba Dubbo Sentinel
- 阿里巴巴Dubbo项目中的Sentinel模块也可以用来做API流量控制、熔断降级等,虽然它并不是严格意义上的API Gateway,但在实际的微服务治理中,常与API Gateway配合使用,作为微服务防护的一部分。
-
Apache ShenYu (incubating)
- Apache ShenYu 是一个国产的开源API Gateway项目,目前处于孵化阶段,由Java编写,它提供了丰富的流量控制、熔断降级、认证授权等功能,并且兼容Spring Cloud生态。
以上技术在国内都有一定数量的用户群体,根据项目需求和技术栈的不同,开发者可以根据功能完备性、性能表现、社区活跃度等因素选择合适的API Gateway解决方案。
网关小结
一句话概括:
API网关是一个位于系统边缘的中间层,用于统一管理、保护和控制系统内外的所有API请求和流量,通常我们会将安全,限流,缓存,日志,监控,重试,熔断等放到API网关来做
2.3.9服务跟踪
[图片上传失败...(image-337984-1709663256835)]
服务跟踪概述
服务跟踪是指在分布式系统中追踪请求的路径和执行时间,以便识别性能瓶颈和解决问题。
服务跟踪的主要功能包括:
- 追踪请求路径:记录请求从客户端到后端的完整路径,包括所有中间服务和调用链。
- 收集性能指标:收集每个服务的执行时间、响应时间、错误率等性能指标。
- 分析和诊断问题:通过分析性能指标和调用链,可以识别性能瓶颈和解决问题。
服务跟踪常用的技术包括:
- 分布式追踪:使用分布式追踪系统,例如 OpenTelemetry、Jaeger、Zipkin 等,可以追踪请求在分布式系统中的完整路径。
- 日志记录:在每个服务中记录请求的日志,可以帮助分析请求的执行过程。
- 监控:使用监控系统,例如 Prometheus、Grafana 等,可以收集和分析服务的性能指标。
服务跟踪的主要优点包括:
- 提高系统性能:通过识别性能瓶颈,可以优化系统性能。
- 提高系统可靠性:通过分析请求的执行过程,可以发现潜在的问题,提高系统可靠性。
- 简化故障排除:通过服务跟踪,可以快速定位问题的根源,简化故障排除过程。
服务跟踪小结: 服务跟踪是追踪分布式系统中请求路径和执行时间,可以帮助开发人员更好地管理和维护分布式系统。
2.3.10弹性云服务
[图片上传失败...(image-7d2433-1709663256835)]
弹性云服务概述
弹性云服务是指一种按需付费的云计算服务,用户可以根据业务需求弹性扩展或缩减计算资源。弹性云服务具有以下特点:
- 弹性: 用户可以根据业务需求弹性扩展或缩减计算资源,无需预先投资购买硬件设备。
- 可扩展: 弹性云服务可以提供海量的计算资源,满足不同规模的业务需求。
- 高可用: 弹性云服务提供高可用性保障,确保业务持续运行。
- 低成本: 弹性云服务采用按需付费模式,用户只需为使用的资源付费,可以节省成本。
弹性云服务主要包括以下几种类型:
- 弹性计算服务: 提供虚拟机、容器等计算资源,用户可以根据业务需求弹性扩展或缩减计算资源。
- 弹性存储服务: 提供对象存储、块存储等存储资源,用户可以根据业务需求弹性扩展或缩减存储空间。
- 弹性网络服务: 提供虚拟私有云、负载均衡等网络资源,用户可以根据业务需求构建安全可靠的网络环境。
弹性云服务广泛应用于各种行业,例如互联网、金融、制造、零售等。
弹性云服务的优势
弹性云服务具有以下优势:
- 降低成本: 用户只需为使用的资源付费,可以节省成本。
- 提高效率: 用户可以根据业务需求弹性扩展或缩减资源,提高资源利用率。
- 简化运维: 弹性云服务提供自动化运维工具,简化运维工作。
- 提高可靠性: 弹性云服务提供高可用性保障,确保业务持续运行。
弹性云服务的应用场景
弹性云服务广泛应用于各种行业,例如互联网、金融、制造、零售等。
以下是一些弹性云服务的应用场景:
- 网站应用: 使用弹性云服务可以快速搭建网站,并根据业务需求弹性扩展或缩减资源。
- 移动应用: 使用弹性云服务可以快速开发和部署移动应用,并根据用户数量弹性扩展或缩减资源。
- 大数据分析: 使用弹性云服务可以快速构建大数据分析平台,并根据数据量弹性扩展或缩减资源。
- 人工智能: 使用弹性云服务可以快速开发和部署人工智能应用,并根据模型训练需求弹性扩展或缩减资源。
弹性云服务提供商
目前,全球主要的弹性云服务提供商包括亚马逊云科技(AWS)、微软 Azure 和阿里云。
- 亚马逊云科技(AWS) :AWS 是全球领先的弹性云服务提供商,提供丰富的计算、存储、网络、数据库、分析、人工智能等服务。
- 微软 Azure:Azure 是微软提供的弹性云服务平台,提供丰富的计算、存储、网络、数据库、分析、人工智能等服务。
- 阿里云:阿里云是中国领先的弹性云服务提供商,提供丰富的计算、存储、网络、数据库、分析、人工智能等服务。(国内的云服务霸主)
弹性云服务小结:
一句话概括:弹性云服务是一种按需付费的云计算服务,用户可以根据业务需求弹性扩展或缩减计算资源。弹性云服务具有降低成本、提高效率、简化运维、提高可靠性等优势,广泛应用于各种行业。