赞
踩
本文开场
先了解下微服务架构https://www.cnblogs.com/imyalost/p/6792724.html
总结:微服务就是将一个大型的单个应用程序和服务拆分为数个甚至数十个的支持微服务,从而降低系统的耦合性。
1.一个后端应用程序根据业务拆分为多个服务。举例:商品-订单-库存-营销-用户
2.前后端调用,一个前端同时调用N个后端服务。引入API Gateway
3.每个服务之间的通信,引入springboot原生https协议、dubbo、kafka/meteQ
4.单个服务的负载,引入zookeeper
https://blog.csdn.net/qq_44891295/article/details/108894864
https://blog.csdn.net/qq_44891295/article/details/108894864
对整个分布式应用系统而言,一共分为两种调用,一种是同步调用,一种是异步调用。同步调用就是基于RPC,异步调用下单场景使用RocketMQ
服务挂了,如何解决
前面提到,Monolithic方式开发一个很大的风险是,把所有鸡蛋放在一个篮子里,一荣俱荣,一损俱损。而分布式最大的特性就是网络是不可靠的。通过微服务拆分能降低这个风险,
不过如果没有特别的保障,结局肯定是噩梦。所以当我们的系统是由一系列的服务调用链组成的时候,我们必须确保任一环节出问题都不至于影响整体链路。相应的手段有很多:
超时:
在微服务中,平常网络请求,或者与第三方系统进行交互都需要设置超时时间
设置超时的两个理由:
1. 系统自我保护: 快速失败,在业务最大允许等待时间内未收到返回数据,主动放弃等待,释放占用资源,避免请求不断累积带来的客户端雪崩效应
2. 成功率:服务处理超时原因有很多,但常见的超时都是短暂的,主要是GC,或者有网络抖动等。这些短时间影响服务端状态的情况而造成请求成功率下降,需要补救措施。简单的补救有超时重试操作:当前请求超时后,将会重试到非当前服务器,降低重试超时的机率
重试模式: 因某个服务实例短暂状态不佳而造成的超时,使用重试处理可以让请求转向其他服务实例的做法可以很好改善非集中式问题的成功率。
对于重试是有场景限制的,不是什么场景都适合重试,比如参数校验不合法、写操作等(要考虑写是否幂等)都不适合重试。
远程调用超时、网络突然中断可以重试。在微服务治理框架中,通常都有自己的重试与超时配置,比如dubbo可以设置retries=1,timeout=500调用失败只重试1次,超过500ms调用仍未返回则调用失败。
比如外部 RPC 调用,或者数据入库等操作,如果一次操作失败,可以进行多次重试,提高调用成功的可能性。
1)服务的入口的限流,在流量激增的情况下对流量进行控制;(上面提到过的网关层做处理)
使用限流例子:
2)当然还有一个情况就是,服务A在调用B,下游服务B只能抗住100的qps,在B服务不可用的情况下,需要限流,并进行熔断和降级(A调用B的出口返回默认的值);(服务通信做处理)
场景的限流算法可以关注下:计数器算法、漏桶算法和令牌桶算法。
设置服务的超时,当被调用的服务经常失败,到达某个阈值,我们可以开启断路保护机制,后来的请求不再去调用这个服务。本地直接返回默认的数据。
在微服务架构中,微服务之间是通过网络进行通信,存在相互依赖,当其中一个服务不可用时,就可能造成雪崩效应。要防止这样的情况,必须有容错机制来保护服务。
举个例子:在一个商品的系统中,有三个服务相互独立,并且存在三台不同的主机之上,分别为订单服务(A),商品服务(B),库存服务(C ) 。当A接到一个下单的请求时,需要调B,而B此刻需要调C。然而C此时突然宕机了,引起了B的等待,B的等待同时引起了A的等待。如果此时等待的时间过长,在等待期间又会来其他的请求,这时候就会导致整个服务器的资源耗尽,进而导致雪崩。
当整个微服务架构整体的负载超出了预设的上限阈值或即将到来的流量预计将会超过预设的阈值时,为了保证重要或基本的服务能正常运行,我们可以将一些 不重要 或 不紧急 的服务或任务进行服务的 延迟使用 或 暂停使用。
参考地址:https://blog.csdn.net/ityouknow/article/details/81230412
举个例子:假如目前有很多人想要给我付钱,但我的服务器除了正在运行支付的服务之外,还有一些其它的服务在运行,比如搜索、定时任务和详情等等。然而这些不重要的服务就占用了JVM的不少内存与CPU资源,为了能把钱都收下来(钱才是目标),我设计了一个动态开关,把这些不重要的服务直接在最外层拒掉,这样处理后的后端处理收钱的服务就有更多的资源来收钱了(收钱速度更快了),这就是一个简单的服务降级的使用场景。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。