负载均衡:
因为请求量特别大的情况下,必须有多台服务来进行处理,配置集群。
集群中的机器可能出现忙闲不均的情况,就需要有一套机制,实现平均分配请求量到每台机器上一一进行负载均衡
负载均衡分类:
硬件负载均衡
软件负载均衡
Ribbon的使用 以及 配置方法
1.引入依赖nefilx-ribbon eureka-client依赖中已经包含此依赖
2.配置RestTemplate的方法上加 @LoadBalanced 注解
配置方法:
全局配置 ribbon.NFLoadBalancerRuleClassName=策略名称
局部配置 服务名.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.策略名称类名
Ribbon实现的原理
ribbon实现的关键点是为ribbon定制的RestTemplate,ribbon利用了RestTemplate的拦截器机制,在拦截器中实现ribbon的负载均衡。负载均衡的基本实现就是利用applicationName从服务注册中心获取可用的服务地址列表,然后通过一定算法负载,决定使用哪一个服务地址来进行http调用。
Ribbon的负载均衡主要由拦截器实现:
服务的可用性
服务能一直在线提供服务的时间:
导致服务不可用的情况:
Availability Unavaliability Per Yeear 98% 7.3 days 99% 3.65days 99.8% 17 hrs 31 min 99.9% 8 hrs 45 min 99.99% 52.5 min 99.999% 5.25 ,min 99.9999% 31.5 sec
1.流量激增,导致服务器等待或者宕机
2.硬件问题,如:自然灾害、人为破坏
3.软件bug,异常、死循环、死锁...
4.缓存击穿,导致数据库宕机
5.程序响应超时
解决方法:
1.限流,限制到服务器上的流量
2.服务器集群、多机房容灾、异地多活
3.增强测试
4.缓存保护机制
5.熔断机制
服务的雪崩:
因为服务的调用是链式的,一个服务出现长时间阻塞,就会阻塞后面调用它的服务,导致整个服务链都不可用
解决方法:
熔断:被调用的服务一直没有响应,直接断开连接
降级:服务熔断后,服务由正常降级为缺省,返回兜底数据(缺省数据)
Hystrix的使用
Neflix提供的熔断器组件,当服务出现长时间等待或不可用情况,能实现熔断和降级处理
使用方法:
1.给服务引入依赖(依赖需要自行增加版本号)
spring-cloud-starter-netflix-hystrix
2.启动类加@EnableHystrix 或 @EnableCircuitBreaker
3.给被调用的方法加@HystrixCommand注解
4.在控制器类中添加方法,返回兜底数据
@HystrixCommand(fallbackMethod = "getDefaultProduct") @GetMapping("/product/{id}") public ResponseEntity<Product> findProductById(@PathVariable("id")Long id){ try { int millis = new Random().nextInt(3000); System.out.println("等待时间:" + millis); Thread.sleep(millis); } catch (InterruptedException e) { e.printStackTrace(); } //返回模拟数据 Product product = new Product(id,"测试商品" + port,99.98); return ResponseEntity.ok(product); } /** * 降级处理的方法 * @param id * @return */ public ResponseEntity<Product> getDefaultProduct(@PathVariable("id")Long id){ //返回模拟数据 Product product = new Product(id,"兜底数据---商品" ,0.0); return ResponseEntity.ok(product); }
# 设置熔断时间 hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=3000
Hystrix的隔离机制
Hystrix为每个调用的方法配置了单独隔离的资源
隔离机制有:
1.线程池隔离(为每个调用的方法单独分配线程池,每个方法的调用使用自己的线程池 )
2.信号量隔离(为每个调用的方法设置阈值,每次调用会记录次数(信号量),信号量超过阈值后,直接放弃 )
线程池隔离的优缺点:
优点:
1.可以控制并发量,起到削峰的作用
2.对任务实现异步处理,任务多了可以再线程池排队慢慢处理
缺点:
1.系统资源的消耗比较大
2.控制比较复杂
信号量隔离的优缺点:
优点:
1.系统资源的消耗较少
2.控制比较简单
缺点:
1.功能简单,但是一旦超过阀值会直接放弃
# 设置隔离策略 THREAD\SEMAPHORE hystrix.command.default.execution.isolation.strategy=THREAD