轻松构建微服务之服务治理

微信公众号:内核小王子
关注可了解更多关于数据库,JVM内核相关的知识;
若是你有任何疑问也能够加我pigpdong[^1]算法

API网关

依据系统的运行状况,自动的进行流量调度,在无需人工干预的状况下,提高整个系统的稳定性,,让系统应对爆品等突发事件的时候,在依赖弹性计算进行扩容的时间窗口内避免底层资源被耗尽.数据库

流量调度通常放在API网关里面作,因此API网关须要有如下特色,业务逻辑简单,可以支持在管理后台动态修改服务配置,性能要高能够抗住高流量.api

因此服务治理最好也能够在api网关里作,服务熔断,以及负载均衡,流量控制等,固然API网关还应该把协议转换,请求安全校验的工做作掉.缓存

上图为一个API网关架构图,一个总的gateway接入全部流量,而后分发给二级gateway,下面咱们具体看下一个gateway应该作哪些事情安全

  • 请求路由 调用端不在须要知道服务的具体地址,只须要将请求发给网关,由网关层进行转发微信

  • 服务注册 因为服务调用统一交给网关进行转发,那么网关就须要知道全部服务提供方的实例地址,全部服务提供方,须要将信息注册给网关,或者网关从注册中心获取后进行缓存.架构

  • 负载均衡 网关层能够实如今多个服务实例之间进行负载均衡,例如round robin或者设置权重负载均衡

  • 安全管理 用户的鉴权统一防治gateway作,以及对用户恶意攻击的防范.异步

  • 流量控制 在监控到某个服务可能过载后能够对该服务进行熔断设计,避免该服务拖垮其余服务,也包括一些重试,限流等分布式

  • 灰度发布 因为网关层能够作服务的管理功能,那么就能够在网关层实现灰度发布,对不一样版本的服务导入不一样的流量

  • API聚合 能够在网关层将多个单一的微服务进行简单的聚合,将各个微服务的返回结果进行聚合,这样就能够避免用户端和服务端频繁的业务调用,若是有复杂的业务逻辑建议仍是放在底层服务实现.

  • 应用监控 网关层因为是全部微服务调用链路的起点,能够展现分布式链路追踪的分析统计结果,提供每一个服务的吞吐量,响应时间,返回码的性能统计报表

  • 弹力设计 网关层由于要接入大量流量,因此自身应该高可用,因此自身可以进行熔断和自动扩容等机制

降级

降级咱们通常有如下方案

  • 中止次要服务 当系统监控到某个服务不可用,或者即将突破可以抗住的压力,能够将该服务停掉,不在请求该服务,或者直接返回一个通用的code

  • 下降一致性要求 当大量流量进入的时候,咱们能够经过异步的方式处理请求,异步可能没法保证业务的强一致性,可是若是咱们能够接受最终一致性能够采用这种方案,另外就是使用缓存,缓存可能和底层数据不一致,可是底层须要可以处理或规避这种风险

  • 简化功能 正常状况下一个页面可能须要返回大量的信息,那么在降级后能够只返回必要的信息,那么其余没必要要信息对应的服务就能够不用调用了

熔断

当某个服务不可用后,而调用方的请求还在不停的重试,致使浪费CPU而且等待超时,下降系统的QPS,而熔断器模式能够检测到系统不可用后不在调用该服务,继续执行其余流程,熔断器须要可以记录服务单位时间或者最近服务调用失败的次数,而且能够支持配置当到达某一个量化的阈值后就进行熔断,同时支持当服务恢复后能够自动解除熔断限制.
目前Netfix的Hystrix已经中止维护,开源实现咱们能够借鉴阿里的sentinel

限流

当某个服务在达到能够支持的请求阈值后,而服务调用方还在不停的发起,咱们能够对该服务进行限流,例如拒绝新来的请求,或者返回一个通用的返回码,也能够对服务进行降级,减小返回的信息,只返回核心数据等.也有一些业务在监控到某些服务达到阈值后,将优先给有白名单的用户分配资源,而对其余的用户进行限流策略.或者延时处理.

限流目前有两种流行的算法

队列算法

按先进先出,将请求进行排队缓存,若是要支持VIP用户,也能够用优先级队列,这样白名单用户将会比普通用户早一点获取资源

漏桶算法

如图漏桶算法,将流入表明用户请求,而流出表明处理请求,漏桶须要设置一个桶的大小,就是容量,能够是一个队列,用来存放尚未处理的请求,而底下的桶洞控制请求处理的速度,当新的请求达到桶的容量后,就执行拒绝策略.因此在针对突发流量的状况下缺少效率.

令牌桶算法

以必定的速率往桶里放入令牌,而后每一个请求都须要从桶里拿出一个令牌,一个桶能保存的最大令牌数有限制,当请求速度太快就会致使桶里没有多余的令牌,那么就会将请求进行拒绝策略,若是请求太少就会致使桶里令牌装满溢出,因此令牌桶有必定的在突发流量状况下能够支持继续处理请求.

相关文章
相关标签/搜索