1 ribbon 负载均衡组件
实现原理
拦截器
拦截了 openfeign,篡改了请求的访问地址,获取了被访问服务集群下面的所有节点的实例信息,执行一个加载轮询策略的方法,通过这个轮询策略从所有获取的实例信息当中,选择一个实例。
IRule
接口
客户端负载均衡和服务端负载均衡的区别
客户端负载均衡 访问由请求发起者决定
服务端负载均衡 访问由 gateway、nginx 决定
如何配置不同的轮询策略
在 application.yml 中进行轮询规则的配置,而且可以给不同的服务指定不同的策略。
常见的负载均衡算法
-
随机算法,顾名思义就是从可用的服务节点中,随机挑选一个节点来访问。
-
轮询算法,顾名思义就是按照固定的顺序,把可用的服务节点,挨个访问一次。
-
轮询算法能够保证所有节点被访问的概率相同,而加权轮询算法是在此基础上,给每个节点赋予一个权重,从而使每个节点被访问到的概率不同,权重大的节点被访问的概率就高,权重小的节点被访问的概率就小。
-
最少活跃连接算法,顾名思义就是每一次访问都选择连接数最少的节点。因为不同节点处理请求的速度不同,使得同一个服务消费者同每一个节点的连接数都不相同。连接数大的节点,可以认为是处理请求慢,而连接数小的节点,可以认为是处理请求快。所以在挑选节点时,可以以连接数为依据,选择连接数最少的节点访问。
2 hystrix
基本介绍
豪猪
断路器:在分布式体系下起到一个服务保护的作用。
服务降级
当 A 服务调用 B 服务时,B 服务发生 500 服务器异常,A 服务的断路器检测到 500 之后,会给出一个正确的响应结果(商品查询失败来代替不友好的 500 服务器错误信息)。
服务质量的降级,并不是说 B 服务不可用了。
代码实现
openfeign 已经集成了 hystrix 断路器功能
- feign 客户端注解里面增加 fallback 属性
- 在同级包下实现一个 feignFallBack 类,作为服务降级的处理类,并实现 feign 的接口,不要忘记加 component 注解进行实例化。
- 在 application.xml 中开启服务降级的配置
熔断机制
在一定时间范围内,请求错误的次数占总请求数的百分比,超过了一定的阈值(85%),开启熔断开关,开关一旦开启以后,后面所有的请求都发不过去了,会在一定时间内熔断开关处于一个半开状态,让一部分请求可以发送过去,如果失败的请求数比例依然很高,就从半开变为全开,所有的请求都过不去。如果请求失败比例恢复正常,就从半开变为关闭。
工作流程
请求 -> 是否使用缓存 -> 是否启用断路器 -> 信号量/线程池限流 -> 运行服务
缓存 之后的 流程 可能会出现 服务降级。
缓存机制
相同的请求直接返回缓存中的数据
限流
信号量限流
有 10 个信号量,一个请求发送需要消耗一个信号量,直到信号量变为 0,后面的请求拿不到信号量,就直接返回降级消息,请求执行完毕以后,信号量加 1。
线程池限流
hystrix 会创建一个工作线程池,初始有 10 个线程可以使用,一个请求需要占用一个线程,请求完毕之后会释放这个线程,如果线程池没有空闲线程了,就返回降级消息。
应用场景
请求错误,抛出异常,异常过多对服务器的压力开销比较大。
防止出现服务雪崩,导致整个服务的调用链路全部瘫痪.
3 gateway
基本介绍
第一代网关 zuul,性能较差,同步调用的方式
第二代网关 gateway,性能不错,异步调用的方式
支持动态路由
动态路由配置:lower-case-service-id
服务名大小写配置:locator.enabled
开启网关日志:loggin.level.springframework.cloud.gateway=debug
自定义全局过滤器
实现网关同一鉴权
网关限流(需要配合 redis 一起使用)
服务集群级别
接口级别
用户级别
ip级别