微服务保护是指在微服务架构中为了确保服务的稳定性和安全性而采取的一系列保护措施。这些保护措施包括:
以上措施可以提升微服务架构的可用性、稳定性和安全性,同时也能够减少应用程序出现故障的概率,保障业务的正常运行。
微服务雪崩问题是指在微服务架构中,由于某个服务出现故障或者超时,导致该服务所依赖的其他服务也无法正常工作,最终导致整个系统不可用的严重问题。
当一个微服务出现故障或者超时时,它向其他服务发送的请求会一直等待响应,如果其他服务也因为该请求而过载,无法及时响应请求,就会引发新的请求继续等待响应,最终导致所有服务都处于过载状态,整个系统崩溃。
微服务雪崩问题通常是由于服务之间的依赖关系过于复杂,或者某个服务设计不合理,导致一旦出现故障或者超时,就会引发连锁反应。
案例分析:在微服务医疗系统中,当医生给患者开立药品医嘱时,需要完成对药品库存的扣减、新医嘱信息的创建、医疗费用的预扣等多个业务活动。假设此时费用中心服务宕机,此时医嘱创建请求会持续等待下游服务的响应,在系统未做任何保护时,请求会在响应之前持续等待,随着更多的请求过来直至医嘱中心服务资源耗尽。费用中心不可用的现象转移到其上游医嘱中心,医嘱中心的不可用随着更多的请求继续向上转移到医生站,最终导致所有服务不可用。
微服务超时处理是指当一个微服务需要调用另一个微服务时,为了避免因为依赖微服务响应过慢而导致整个系统无法正常运行,对调用设定超时时间,如果在规定时间内未得到响应,就认为该请求超时,并进行相应的处理。
超时处理可以有效地避免微服务间出现雪崩的情况。如果一个微服务的依赖服务出现故障或响应缓慢,超时处理机制可以在规定时间内取消请求,保证系统的正常运行,同时也能减少对被调用微服务的资源占用,增加系统的稳定性和可靠性。
超时处理需要根据具体的业务场景和框架特性来选择合适的超时策略。例如可以使用微服务框架提供的超时配置,设置合理的熔断机制,使用限流器等方式来处理超时问题。同时,在设计微服务架构时应该充分考虑到依赖服务的可靠性和性能,尽可能避免出现超时问题。
微服务仓壁模式(Microservice Bounded Context Pattern)是一种架构模式,用于将微服务划分为不同的边界上下文。每个微服务仓壁表示一个特定的业务或功能领域,并与其他微服务仓壁实现松散耦合。
在微服务架构中,将整个应用程序拆分为小型微服务可以使应用程序更易于扩展和维护。但是,随着微服务数量的增加,管理它们之间的通信和交互可能会变得困难。这时,使用微服务仓壁模式可以帮助团队更好地管理和维护微服务。
通过将微服务分组为具有相同上下文的仓壁,开发人员可以更容易地理解和管理应用程序的不同部分。每个仓壁都具有清晰的职责和目标,可以独立开发、部署和扩展。同时,仓壁之间的通信只需通过明确定义的接口进行,可以避免不必要的耦合和依赖。
仓壁模式来源于船舱的设计:
船舱都会被隔板分离为多个独立空间,当船体破损时,只会导致部分空间进入,将故障控制在一定范围内,避免整个船体都被淹没。
我们可以限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离。
微服务断路器是一种设计模式,用于处理微服务应用程序中的故障和异常情况。它是一个在微服务之间的网络通信中拦截异常和错误的机制,可以帮助防止错误和异常从一个微服务扩散到整个应用程序。当微服务之间发生故障时,断路器会自动中断调用,并返回一个默认的响应,以避免应用程序的崩溃。此外,断路器还可以记录故障和异常情况,以便进行故障排除和监控。断路器的目的是提高应用程序的可靠性和稳定性,减少故障对应用程序的影响。常见的微服务断路器包括Hystrix、Resilience4j等。
当发现访问服务D的请求异常比例过高时,认为服务D有导致雪崩的风险,会拦截访问服务D的一切请求,形成熔断:
微服务限流是一种控制微服务的流量的方法,以避免系统过载和崩溃。通常,微服务在高峰期会导致系统流量过大,处理请求的能力无法跟上,这时就需要限制一定数量的请求,以保证系统的稳定性和可用性。微服务限流可以通过设置一些指标,例如每秒最大请求数、每个请求的最大处理时间、每个客户端的最大连接数等方式来限制系统的流量。同时,限流也可以提高系统的整体性能和资源利用率,避免系统资源浪费。
QPS指每秒查询率(Queries Per Second),是一个衡量系统处理请求能力的指标。例如,如果一个系统每秒可以处理100个请求,那么它的QPS就是100。
限流就是限制业务访问的QPS,避免服务因流量的突增而故障。
在SpringCloud当中支持多种服务保护技术:
早期比较流行的是Hystrix框架,但目前国内实用最广泛的还是阿里巴巴的Sentinel框架,这里我们做下对比:
Sentinel | Hystrix | |
---|---|---|
隔离策略 | 信号量隔离 | 线程池隔离/信号量隔离 |
熔断降级策略 | 基于慢调用比例或异常比例 | 基于失败比率 |
实时指标实现 | 滑动窗口 | 滑动窗口(基于 RxJava) |
规则配置 | 支持多种数据源 | 支持多种数据源 |
扩展性 | 多个扩展点 | 插件的形式 |
基于注解的支持 | 支持 | 支持 |
限流 | 基于 QPS,支持基于调用关系的限流 | 有限的支持 |
流量整形 | 支持慢启动、匀速排队模式 | 不支持 |
系统自适应保护 | 支持 | 不支持 |
控制台 | 开箱即用,可配置规则、查看秒级监控、机器发现等 | 不完善 |
常见框架的适配 | Servlet、Spring Cloud、Dubbo、gRPC 等 | Servlet、Spring Cloud Netflix |
Sentinel是一种分布式流量控制与实时监控系统,可以用来保护微服务架构的稳定性和可靠性。它可以实时地检测并阻止恶意流量,保护应用程序免受攻击。同时还提供了实时流量监控、服务容错、熔断、限流等功能,可以帮助开发者快速诊断和解决服务问题,提升服务的可靠性和性能。
Sentinel具有以下特点:
1)下载
sentinel官方提供了UI控制台,方便我们对系统做限流设置。大家可以在GitHub下载。
2)运行
将jar包放到任意非中文目录,执行命令:
java -jar sentinel-dashboard-1.8.4.jar
如果要修改Sentinel的默认端口、账户、密码,可以通过下列配置:
配置项 | 默认值 | 说明 |
---|---|---|
server.port | 8080 | 服务端口 |
sentinel.dashboard.auth.username | sentinel | 默认用户名 |
sentinel.dashboard.auth.password | sentinel | 默认密码 |
例如,修改端口:
java -Dserver.port=8090 -jar sentinel-dashboard-1.8.4.jar
3)访问
访问http://localhost:8080页面,就可以看到sentinel的控制台了:
需要输入账号和密码,默认都是:sentinel
我们在order-service中整合sentinel,并连接sentinel的控制台,步骤如下:
1)引入sentinel依赖
<!--sentinel-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2)配置控制台
修改application.yaml文件,添加下面内容:
server:
port: 8088
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080
3)访问order-service的任意端点
打开浏览器,访问http://localhost:8088/order/101,这样才能触发sentinel的监控。
然后再访问sentinel的控制台,查看效果:
亲爱的读者,
我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。
如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。
我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。