一、系统架构演变
系统架构大体经历了几个过程:单体应用架构—>垂直应用架构—>分布式架构—>SOA架构—>微服务架构,以及正在默默无闻兴起的Service Mesh(服务网格化)
1、单体应用架构
早期的互联网,一般的网站应用流量都比较小,不需要太多应用,所以只用一个应用就将所有的功能代码都部署到一起,这样不仅可以减少开发、部署,而且能节省维护的成本。
优点:项目架构简单,适合小型项目,开发成本低;项目部署在一个节点上,维护方便。
缺点:系统功能都集中在一个工程猴子那个,对于中大型项目不易开发和维护;系统模块之间的耦合高,单点容错率低;无法针对不同的模块进行优化和水平的扩展。
2、垂直应用架构
将原来的一个应用拆成互不相干的几个应用,以提升效率。
优点:系统拆分实现了流量分担,解决并发问,而且可以针对不同模块进行优化和水平扩展;一个系统的问题不会影响到其他系统,提高容错率。
缺点:系统之间相互独立,无法进行相互调用,会有重复的开发任务。
3、分布式架构
将把工程拆分成表现层和服务层两个部分,服务层中包含业务逻辑,表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现。
优点:抽取公共的功能为服务层,提高代码复用性。
缺点:系统间耦合度变高,调用关系错综复杂,难以维护。
4、SOA架构
一个调用中心对集群进行实时管理,用于资源调度和治理中心(面向服务的架构)是关键 。
优点:使用注册中心解决了服务间调用关系的自动调节。
缺点:服务间有依赖关系,一旦某个环节出错会影响较大(服务雪崩);服务关系复杂,运维、测试部署困难。
5、微服务框架
在某种程度上是面向服务的架构SOA继续发展的下一步,它更加强调服务的“彻底拆分”。
优点:服务原子化拆分,独立打包、部署和升级,保证每个微服务清晰的任务划分,利于扩展;微服务之间采用restful等轻量级http协议相互调用。
缺点:分布式系统开发的技术成本高(容错、分布式事务等)。
二、微服务架构
1、微服务架构的常用
服务治理、注册中心进行管理。
restful、rpc进行调用。
网关的方式控制客户端访问。
容错在出现问题后,进行自处理。
链路追踪在出现问题后,可以进行排错。
2、微服务架构的概念
2.1、服务治理就是进行服务的自动化管理,其核心的是服务的自动注册与发现。
服务注册:服务实例将自身服务信息注册到注册中心。
服务发现:服务实例通过注册中心,获取到注册到其中的服务实例的信息,通过这些信息去请求它们提供的服务。
服务剔除:服务注册中心将出问题的服务自动剔除到可用列表之外,使其不会被调用到。
2.2、服务调用,基于HTTP的RESTful接口以及基于TCP的RPC协议
REST:这是一种HTTP调用的格式,更标准,更通用,无论哪种语言都支持http协议。
RPC:一种进程间通信方式,允许像调用本地服务一样调用远程服务。RPC框架的主要目标就是让远程服务调用更简单、透明。RPC框架负责屏蔽底层的传输方式、序列化方式和通信细节。
2.3、服务网关,API网关是将所有API调用统一接入到API网关层,由网关层统一接入和输出。
网关的基本功能有统一接入、安全防护、协议适配、流量管控、长短链接支持、容错能力。
2.4、服务容错,在微服务当中,一个请求经常会涉及到调用几个服务,如果其中某个服务不可用,没有做服务容 错的话,极有可能会造成一连串的服务不可用,这就是雪崩效应。
服务容错的三个核心思想:
不被外界环境影响
不被上游请求压垮
不被下游响应拖垮
2.5、链路追踪,随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务,因 此,就需要对一次请求的多个服务链路进行日志记录、性能监控即链路追踪。
2.6、微服务架构的解决方案
2.6.1、ServiceComb,提供了一站式的微服务开源解决方案,致力于帮助企业、用户和开发者将企业应用轻松微服务化上云,并实现对微服务应用的高效运维管理。
2.6.2、SpringCloud是一系列框架的集合,它利用SpringBoot的开发便利性巧妙地简化了分布式基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用SpringBoot的开发风格做到一键启动和部署。
2.6.3、SPringCloud Alibaba提供微服务开发的一站式解决方案,包含开发分布式应用微服务的必需组件
3、SpringCloud Alibaba3.1、主要功能服务限流降级:默认支持WebServlet、WebFlux、OpenFeign、RestTemplate、Spring Cloud Gateway、Zuul、Dubbo和RocketMQ限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级Metrics监控。服务注册与发现:适配Spring Cloud服务注册与发现标准,默认集成了Ribbon的支持。分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。消息驱动能力:基于Spring CLoud Stream为微服务应用构建消息驱动能力。分布式事务:使用@GlobalTransactional注解,高效并且对业务零侵入地解决分布式事务问题。阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务,支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于Cron表达式)任务调度服务。同时提供分布式的任务执行模型。阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联网通信能力,帮助企业迅速搭建客户通道。3.2、组件Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。Dubbo:Apache Dubbo是一款高性能Java RPC框架。Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。Alibaba Cloud ACM:一款在分布式架构环境中应用配置进行集中管理和推送的应用配置中心产品。Alibaba Cloud OSS:阿里云对象存储对象,是阿里云提供的海量、安全、低成本、高可靠的云存储服务。Alibaba Cloud SchedulerX:一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时任务调度服务。Alibaba Cloud SMS:覆盖全球的短信服务,友好、高效、智能的互联网通讯能力,帮组企业迅速搭建客户通道
三、Nacos Discovery–服务治理
1、服务治理是微服务架构中最核心最基本的模块,用于实现各个微服务的自动化注册与发现
服务注册:在服务治理框架中,都会构建一个注册中心,每个服务单元向注册中心登记自己提供服务的详细详细,并在注册中心形成一张服务的清单,服务注册中心需要以心跳的方式去监测清单中的服务是否可用,如果不可用,需要在服务清单中剔除不可用的服务。
服务发现:服务调用方向服务注册中心咨询服务,并获取所有服务的实例清单,实现对具体服务实例的访问。
常用的注册中心
Zookeeper是一个分布式服务框架,是ApacheHadoop的一个子项目,主要是用来解决分布式应用中经常遇到的一些数据管理问题。
Eureka是SpringCloud Netflix中的重要组件,主要作用就是服务注册和发现。
Consul是基于GO语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现和配置管理的功能。Consul的功能都很实用,包括:服务注册/发现、健康检查、key/value存储,多数据中心和分布式一致性保证等特性
Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台,是SpringCloud Alibaba组件之一,负责服务注册发现和服务配置
2、nacos提供了一组简单易用的特性集,快递实现动态服务发现、服务配置、服务元数据及流量管理
3、实现服务调用的负载均衡,就是将负载(工作任务、访问请求)进行分摊到多个操作单元(服务器、组件)上进行执行;分为服务器负载均衡、客户端负载均衡。
4、基于Ribbon实现负载均衡Ribbon是SpringCloud的一个组件,使用一个注解就能轻松的搞定负载均衡;在RestTemplate的生成方法上添加@LoadBalanced注解;Ribbon内置了多种负载均衡策略,顶级接口为com.netfix.loadbalancer.IRule
5、基于Feign实现服务调用Feign是Spring Cloud提供的一个声明式的伪http客户端,它使得调用远程服务就像调用本地服务一样简单,只需要创建一个接口并添加一个注解即可。Nacos很好的兼容了Feign,Feign默认集成了Ribbon,所以在Nacos下使用Feign默认就实现了负载均衡的效果
四、Sentinel–服务容错
1、服务雪崩效应
在分布式系统中,由于网络原因或自身的原因,服务一般无法保证100%可用,如果一个服务出现了问题,调用这个服务就会出现线程阻塞的情况,此时若有大量的请求涌入,就会出现多条线程阻塞等待,进而导致服务瘫痪。
由于服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的雪崩效应。
2、常见容错方案
1)、隔离,是指系统按照一定的原则划分为若干个服务模块,各个模块之间相对独立,无强依赖,当有故障发生时,能将问题和影响隔离在某个模块内部,而不扩散风险,不波及其他模块,不影响整体的系统服务,而常见的隔离方式有线程池隔离和信号量隔离 。
2)、超时,在上游服务调用下游服务的时候,设置一个最大响应时间,如果超过这个时间,下游未作出反应,就断开请求,释放掉线程。
3)、限流,是限制系统的输入量和输出流量已达到保护系统的目的,为了保证系统的稳固运行,一旦达到的需要限制的阈值,就需要限制流量并采取少量措施以完成限制流量的目的。
4)、熔断,当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用,这种牺牲局部,保全整体的措施叫做熔断。
服务熔断一般有三种状态
熔断关闭状态:服务没有故障时,熔断器所处的状态,对调用方的调用不做任何限制。
熔断开启状态:后续对该服务接口的调用不再经过网络,直接执行本地的fallback方法
半熔断状态:尝试恢复服务调用,允许有限的流量调用该服务,并监控调用成功率,如果成功率达到预期值,则说明服务已恢复,进入熔断关闭状态,如果成功率仍旧很低,则重新进入熔断关闭状态
5)、降级,是为服务提供一个托底方案,一旦服务无法正常调用,就是用托底方案。
常见的容错组件
Hystrix是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方库,防止级联失败,从而提升系统的可用性与容错性。
Resilience4J是非常轻量、简单,并且文档非常清晰、丰富的熔断工具。
Sentinel是阿里巴巴开源的一款断路器实现,非常稳定。
3、Sentinel入门
1)、Sentinel(分布式系统的流量防卫兵)是用于服务容错的综合性解决方案,它以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。
Sentinel具有以下特征:
丰富的应用场景,如秒杀、消息削峰填谷、集群流量控制、实时熔断下游不可用应用
完备的实时监控,通过控制台可以看到接入应用的单台集群秒级数据
广泛的开源生态,提供开箱即用的与其它开源框架/库的整合模块
完善的SPI扩展点,提供简单易用,完善的SPI扩展接口,可以通过实现扩展接口来快速定制逻辑
2)、Sentinel分为两个部分
核心库不依赖任何框架/库,能够运行于所有java运行时环境,同时对Dubbo/SpringCLoud等框架有较好的支持
控制台基于SpringBoot开发,打包后可以直接运行,不需要额外的Tomcat等应用容器
4、微服务集成Sentinel
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.6.jar
在pom.xml中加入依赖
com.alibaba.cloud
spring-cloud-starter-alibaba-sentinel
Sentinel提供一个轻量级的控制台,它提供机器发现、单机资源实时监控以及规则管理等功能。
5、Sentinel的概念和功能
1)、基本概念:
资源就是Sentinel要保护的东西,是Java应用程序中的任何内容,可以是一个服务,也可以是一个方法,甚至是一段代码。
规则就是用来定义如何进行保护资源的,主要包括流量控制规则、熔断降级规则以及系统保护规则。
2)、重要功能:
流量控制,用于调整网络包的数据,任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的,需要根据系统的处理能力对流量进行控制,Sentinel作为一个调配器,可以根据需要把随机的请求调整成合适的形状。
熔断降级,当检测到调用链路中某个资源出现不稳定的表现,会采取两种手段:
通过并发线程数进行限制,Sentinel通过限制资源并发线程的数量,来减少不稳定资源对其他资源的影响,当某个资源出现不稳定的情况下,如响应时间变长,对资源的直接影响就是会造成线程数的逐步堆积,当线程数在特定资源上堆积到一定的数量之后,对该资源的新请求就会被拒绝,堆积的线程完成任务后才开始继续接收请求。
通过响应时间对资源进行降级,可以通过响应时间来快速降级不稳定的资源,当依赖的资源出现响应时间过长后,所有对该资源的访问都会被直接拒绝,直到过了指定的时间窗口之后才重新恢复。
系统负载保护,提供系统维度的自适应保护能力,当系统负载较高的时候,如果还持续让请求接入可能会导致系统崩溃,无法响应,在集群环境下,会把本应这台机器承载的流量转发到其他的机器上去,如果这个时候其他的机器也处在一个边缘状态的时候,Sentinel提供了对象的保护机制,让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理最多的请求。
6、Sentinel规则
1)、流控规则,其流量控制,原理是监控应用流量的QPS或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
资源名:唯一名称,默认是请求路径,可自定义
针对来源:指定对哪个微服务进行限流,默认指default,不区分来源,全部限制
阈值类型/单机阈值:
QPS(每秒请求数据量):当调用该接口的QPS达到阈值的时候,进行限流
线程数:当调用该接口的线程数达到阈值的时候,进行限流
本文链接:https://my.lmcjl.com/post/3312.html
4 评论