• Ribbon使用Hystrix


    1、导入依赖spring-cloud-starter-hystrix

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-hystrix</artifactId>
    </dependency>

     

    2、消费启动类开启@EnableCircuitBreaker

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.cloud.netflix.ribbon.RibbonClient;
    import org.springframework.context.annotation.Bean;
    import org.springframework.web.client.RestTemplate;
    
    @SpringBootApplication
    @EnableDiscoveryClient
    //开启Ribbon
    @RibbonClient(name="cloud-producer")
    //启动断路器支持(Hystrix)
    @EnableCircuitBreaker
    public class RibbonConsumerApplication {
    
        @Bean
        @LoadBalanced //负载均衡
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    
        public static void main(String[] args) {
            SpringApplication.run(RibbonConsumerApplication.class, args);
        }
        
    }

     

    3、TestService——设置断路器核心类

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Repository;
    import org.springframework.web.client.RestTemplate;
    
    import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
    
    @Repository
    public class TestService {
        
        @Autowired
        private RestTemplate restTemplate;
        
        //设置断路器,当此方法无法应答时(把mima-cloud-producer服务停掉),调用getError方法
        @HystrixCommand(fallbackMethod="getError")
        public String get(String id) {
            System.out.println(Thread.currentThread().getName()+".get before...");
            String result = restTemplate.getForObject("http://cloud-producer/get/"+id, String.class);
            System.out.println(Thread.currentThread().getName()+".get end...result="+result);
            return result;
        }
        
        public String getError(String id) {
            System.out.println(Thread.currentThread().getName()+"断路器启动");
            return "断路器fallback返回error";
        }
    }

     

    4、TestController——测试类

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.mimaxueyuan.consumer.robbin.service.TestService;
    
    @RestController
    public class TestController {
    
        @Autowired
        private TestService testService;
    
        @GetMapping("/ribbon/get/{id}")
        public String get(@PathVariable String id) {
            return testService.get(id);
        }
    }

     

    以上代码在cloud-consumer-ribbon-hystrix服务中,模拟远程调用cloud-producer服务。

    5、模拟测试
    5.1、启动服务
    启动cloud-consumer-ribbon-hystrix、cloud-producer服务,保证服务正常。

    5.2、正常请求

    5.3、服务挂掉请求,触发断路器
    把cloud-producer服务关闭,这时http://localhost:8807/ribbon/get/123456请求无法应答,会调用getError方法,触发断路器

    5.4、多次请求控制台会打印如下信息:

  • 相关阅读:
    css世界六
    电子书
    es 浏览器支持情况地址
    mac 下载文件的一些地址
    NODE_ENV production / development
    css世界五
    css世界四
    css世界三
    css世界二
    关于递归算法
  • 原文地址:https://www.cnblogs.com/linjiqin/p/10195329.html
Copyright © 2020-2023  润新知