• SpringCloud2.0 Hystrix Ribbon 基于Ribbon实现断路器


    原文:https://www.cnblogs.com/songlu/p/9949203.html

    1、启动【服务中心】集群,工程名:springcloud-eureka-server

    2、启动【服务提供者】集群,工程名:springcloud-eureka-client

    3、启动【服务消费者】,工程名:springcloud-eureka-ribbon

    4、未加入熔断机制,【服务提供者】出现问题,对【服务消费者】的影响

    4.1、停掉【服务提供者】集群中的其中一个服务。本例:停掉端口为 52602 这个服务。

    4.2、开浏览器窗口,访问 http://localhost:52610/ribbonInfo,多次刷新该地址

    调用 52601、52603 服务是正常的,但是调用52602服务的时候,出现了阻塞等待,并最终返回了红框内的错误信息。

    假如这是正式的生产环境,访问量很大的情况下,那么就会有很多请求阻塞。这会造成【服务消费者】服务器内存消耗陡增,导致应用崩溃。如果有其他应用需要【服务消费者】返回资源信息,那么调用【服务消费者】的应用也会出现阻塞。这就导致了连锁反应,也就是所谓的雪崩。

    所以,为了避免这种悲剧发生。顺应而生的出现了熔断保护机制。即:访问不通时,要及时作出响应,而不是等待至超时。

    5、修改【服务消费者】,加入熔断机制

    5.1、打开工程:springcloud-eureka-ribbon

    5.2、工程pom.xml文件添加如下依赖:

    1
    2
    3
    4
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    </dependency>

    5.3、修改工程启动类中,添加注解 @EnableHystrix

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    package com.miniooc.eurekaribbon;
     
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.netflix.hystrix.EnableHystrix;
     
    /**
     * EurekaRibbonApplication
     * 应用程序启动类,程序入口
     *
     * @author 宋陆
     * @version 1.0.0
     */
    @EnableHystrix // 启用 hystrix 熔断机制相关配置
    @EnableDiscoveryClient // 启用 Eureka 服务发现 相关配置
    @SpringBootApplication
    public class EurekaRibbonApplication {
     
        public static void main(String[] args) {
            SpringApplication.run(EurekaRibbonApplication.class, args);
        }
     
    }

    5.4、修改服务消费者 Service 类, EurekaRibbonService

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    package com.miniooc.eurekaribbon.service;
     
    import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.web.client.RestTemplate;
     
    /**
     * EurekaRibbonService
     * 服务消费者服务类,调用服务提供者提供的服务,实现业务
     *
     * @author 宋陆
     * @version 1.0.0
     */
    @Service
    public class EurekaRibbonService {
     
        @Autowired
        RestTemplate restTemplate;
     
        /**
         *  加入了@HystrixCommand注解,并设置了服务调用失败的回调方法 fallbackMethod = "getInfoFailure"
         * @return
         */
        @HystrixCommand(fallbackMethod = "getInfoFailure")
        public String getInfo() {
            String message;
            try {
                System.out.println("调用 服务 EUREKA-CLIENT/info");
                message = restTemplate.getForObject("http://EUREKA-CLIENT/info", String.class);
                System.out.println("服务 EUREKA-CLIENT/info 返回信息 : " + message);
                System.out.println("调用 服务 EUREKA-CLIENT/info 成功!");
            } catch (Exception ex) {
                message = ex.getMessage();
            }
            return message;
        }
     
        /**
         * 服务 EUREKA-PROVIDER/hello 调用失败的回调方法
         *
         * @return
         */
        public String getInfoFailure() {
            String message = "网络繁忙,请稍后再试-_-。PS:服务消费者自己提供的信息";
            return message;
        }
     
    }

    6、加入熔断机制后,【服务提供者】出现问题,对【服务消费者】的影响

    6.1、重启【服务提供者】集群,重启【服务消费者】

    6.2、停掉【服务提供者】集群中的其中一个服务。本例:停掉端口为 52602 这个服务。

    6.3、开浏览器窗口,访问 http://localhost:52610/ribbonInfo,多次刷新该地址

    调用 52601、52603 服务是正常的,调用52602服务的时候,没有出现阻塞等待,而是返回了【服务消费者】自己提供的返回信息

    【服务消费者】加入熔断机制结束

  • 相关阅读:
    【Leetcode】【Easy】Remove Duplicates from Sorted List
    【Leetcode】【Easy】Pascal's Triangle II
    【Leetcode】【Easy】Pascal's Triangle
    【Leetcode】【Easy】Binary Tree Level Order Traversal II
    【Leetcode】【Easy】Binary Tree Level Order Traversal
    【Leetcode】【Easy】Maximum Depth of Binary Tree
    【Leetcode】【Easy】Minimum Depth of Binary Tree
    【Leetcode】【Easy】Balanced Binary Tree
    【Leetcode】【Easy】Symmetric Tree
    如何使用Action.Invoke()触发一个Storyboard
  • 原文地址:https://www.cnblogs.com/shihaiming/p/11351510.html
Copyright © 2020-2023  润新知