Ribbon与Hystrix

负载均衡:

  因为请求量特别大的情况下,必须有多台服务来进行处理,配置集群。

        集群中的机器可能出现忙闲不均的情况,就需要有一套机制,实现平均分配请求量到每台机器上一一进行负载均衡

负载均衡分类:

                硬件负载均衡        

                软件负载均衡

 

 Ribbon的使用 以及 配置方法

1.引入依赖nefilx-ribbon         eureka-client依赖中已经包含此依赖

2.配置RestTemplate的方法上加  @LoadBalanced 注解

配置方法:

  1. 全局配置                                                                        ribbon.NFLoadBalancerRuleClassName=策略名称

  2. 局部配置                                                                                                                          服务名.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.策略名称类名

Ribbon实现的原理

ribbon实现的关键点是为ribbon定制的RestTemplate,ribbon利用了RestTemplate的拦截器机制,在拦截器中实现ribbon的负载均衡。负载均衡的基本实现就是利用applicationName从服务注册中心获取可用的服务地址列表,然后通过一定算法负载,决定使用哪一个服务地址来进行http调用。

Ribbon的负载均衡主要由拦截器实现:

服务的可用性

        服务能一直在线提供服务的时间:

AvailabilityUnavaliability 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值