美文网首页
hystrix熔断和降级

hystrix熔断和降级

作者: 超人001 | 来源:发表于2021-04-30 18:10 被阅读0次

    注册服务
    pom 配置文件

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

    application.yml 配置文件

    spring:
      application: 
        name: eureka-server
    
    server:
      port: 8001
        
    eureka:
      instance:
        hostname: eureka1
        lease-renewal-interval-in-seconds: 10   ##客户端向服务器(注册中心发送心跳的时间间隔)
        lease-expiration-duration-in-seconds: 120 ##服务器(注册中心)租期到期的时间, 也就是说服务器在收到最后一次心跳的时间上线
      client:
        service-url:
          defaultZone: http://eureka1:8001/eureka/  
        
    

    启动类

    @EnableEurekaServer     //启用服务器的配置中心
    @SpringBootApplication
    public class EurekaApplication {
        
        
        public static void main(String[] args) {
            SpringApplication.run(EurekaApplication.class, args);
        }
        
    }
    

    pom 配置文件

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

    application.yml 配置文件

    spring:
      application: 
        name: client-service
    
    server:
      context-path: /
      port: 7001
      
    eureka:
      client:
        service-url:
          ##单点配置:
          defaultZone: http://eureka1:8001/eureka/
    

    启动类

    @EnableDiscoveryClient  //表示我是一个服务,注册到服务中心上
    @SpringBootApplication
    public class Application {
    
        
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
        
    }
    
    

    服务类

    
    @RestController
    public class HelloController {
    
    
        @RequestMapping(value = "/hello", method = {RequestMethod.GET})
        public String hello() throws InterruptedException{
            Thread.sleep(3000);
            System.err.println("hello hystrix ... ");
            return "hello hystrix!";
        }
        
        @RequestMapping(value = "/hi", method = {RequestMethod.GET})
        public String hi() throws InterruptedException{
            Thread.sleep(5000);
            System.err.println("hi hystrix ... ");
            return "hi hystrix!";
        }
        
        @RequestMapping(value = "/request", method = {RequestMethod.GET})
        public String request() throws InterruptedException{
            System.err.println("request ... ");
            return "request!";
        }
    
        
    }
    
    

    客户端调用方
    pom.xml

    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>        
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-ribbon</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-hystrix</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
    

    启动类

    @EnableCircuitBreaker //开启hystrix熔断器
    @EnableEurekaClient
    @SpringBootApplication
    public class HystrixApplicationClientApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(HystrixApplicationClientApplication.class, args);
        }
        
    }
    @Bean
        @ConfigurationProperties(prefix = "custom.rest")
        public HttpComponentsClientHttpRequestFactory httpComponentsClientHttpRequestFactory(){
            HttpComponentsClientHttpRequestFactory httpComponentsClientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
            return new HttpComponentsClientHttpRequestFactory();
        }
        
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate(){
            return new RestTemplate(httpComponentsClientHttpRequestFactory());
        }
        
    

    application.yml

    spring:
      application: 
        name: hystrix-request
        
    server: 
      context-path: /
      port: 6002
      
    eureka:
      client:
        service-url:
          ##单点配置:
          defaultZone: http://eureka1:8001/eureka/
    
    ##断路器超时时间: 
    hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 2000
    ## 后者采用 HttpURLConnection 的默认超时配置
    custom: 
      rest:
        ## 指客户端和服务器建立连接的timeout
        connect-timeout: 2000
        ##指从连接池获取连接的timeout超出预设时间
        connection-request-timeout: 2000
        ## 指的是建立连接后从服务器读取到可用资源所用的时间
        read-timeout: 30000 
    

    服务类

    @RestController
    public class HystrixController {
    
        
        @Autowired
        private HelloService helloService;
        
        @RequestMapping(value = "/hystrix-hello", method = {RequestMethod.GET})
        public String hello() {
            return helloService.callHello();
        }
        
        
        @RequestMapping(value = "/hystrix-handler", method = {RequestMethod.GET})
        public String handler() {
            return helloService.handler();
        }
        
        
        @RequestMapping(value = "/hystrix-hi", method = {RequestMethod.GET})
        public String hi() {
            return helloService.callhi();
        }
            
        
        @RequestMapping(value = "/hystrix-request", method = {RequestMethod.GET})
        public String request() {
            return helloService.callrequest();
        }
            
        
        
    

    hystrix熔断和降级实现类

    @Service
    public class HelloService {
    
        @Autowired
        private RestTemplate restTemplate;
        
        @HystrixCommand(fallbackMethod = "callHelloFailback")
        public String callHello() {
            return restTemplate.getForObject("http://client-service/hello", String.class);
        }
        
        public String callHelloFailback(){
            System.err.println("----------执行降级策略------------");
            return "----------执行降级策略------------";
        }
    
        @HystrixCommand(fallbackMethod = "handlerFailback",  ignoreExceptions = {BadRequestException.class})
        public String handler() {
            throw new RuntimeException("运行时异常...");
        }
    
        public String handlerFailback(Throwable e){
            System.err.println("异常信息: " + e.getMessage());
            return "获取异常信息并可以做具体的降级处理";
        }
        
        @HystrixCommand(
                commandKey = "hiKey",
                commandProperties = {@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds", /*KEY*/ value = "8000" /*VALUE*/)},
                fallbackMethod = "callHiFailback")
        public String callhi() {
            return restTemplate.getForObject("http://client-service/hi", String.class);
        }
        
        public String callHiFailback(){
            System.err.println("----------执行降级策略------------");
            return "----------执行降级策略------------";
        }
        
        
        
        @HystrixCommand(fallbackMethod = "callrequestFailback")
        public String callrequest() {
            return restTemplate.getForObject("http://client-service/request", String.class);
        }
        
        public String callrequestFailback(){
            System.err.println("----------执行降级策略------------");
            return "----------执行降级策略------------";
        }
        
        
    }
    

    相关文章

      网友评论

          本文标题:hystrix熔断和降级

          本文链接:https://www.haomeiwen.com/subject/qcwnrltx.html