zoukankan      html  css  js  c++  java
  • Spring Cloud (7) 服务容错保护-Hystrix服务降级

      在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以互相调用,在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常会集群部署。由于网络 原因或者自身原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,servlet容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务造成灾难性的严重后果,这就是服务故障的雪崩效应。

      在Spring Cloud Hystrix中实现了线程隔离、断路器等一系列的服务保护功能。它是基于Netflix的开源框架Hystrix实现的,该框架目标在于通过控制那些访问远程系统、服务和第三方的节点。从而对延迟和故障提供更强大的容错能力。Hystrix具备了服务降级、服务熔断、线程隔离、请求缓存、请求合并以及服务监控等强大的功能。

    在之前的david-ribbon中pom.xml增加hystrix依赖:

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

    在启动类中使用@EnableCircuitBreaker或@EnableHystrix注解开启Hystrix

    @EnableHystrix
    @EnableDiscoveryClient
    @SpringBootApplication
    public class RibbonApplication {
    
        @Bean
        @LoadBalanced //开启负载均衡
        RestTemplate restTemplate(){
            return new RestTemplate();
        }
    
        public static void main(String[] args) {
            SpringApplication.run(RibbonApplication.class, args);
        }
    }

    也可以使用@SpringCloudApplication注解 一个相当于上面三个

    //@EnableCircuitBreaker
    //@EnableDiscoveryClient
    //@SpringBootApplication
    @SpringCloudApplication
    public class RibbonApplication {
    
        @Bean
        @LoadBalanced //开启负载均衡
        RestTemplate restTemplate(){
            return new RestTemplate();
        }
    
        public static void main(String[] args) {
            SpringApplication.run(RibbonApplication.class, args);
        }
    }

    新增TestService

    @Service
    public class TestService {
    
        @Autowired
        RestTemplate restTemplate;
    
        @HystrixCommand(fallbackMethod = "fallback")
        public String consumer(){
            return restTemplate.getForObject("http://david-eureka-client/test",String.class);
        }
    
        public String fallback(){
            return "fallback";
        }
    
    }

    修改TestController

    @RestController
    public class TestController {
    
        @Autowired
        TestService testService;
    
        @GetMapping("/consumer")
        public String test(){
            return testService.consumer();
        }
    
    }

    然后启动eureka、eureka-client、david-ribbon项目。 http://localhost:8764/consumer

    test;port:8762

    此时关闭client项目,再次访问则返回

    fallback

  • 相关阅读:
    Docker运行nginx文件服务器详细配置
    containerd 使用
    【转】Oracle将以特定分隔的字符串转成表格的方法(用于类似游标的遍历)
    我的博客园的定制化配置v20201229
    李叫兽-文案创意模板
    小程序海报最佳实现思路,可视化编辑直接生成代码使用
    X型文案和Y型文案,李叫兽教你如何减少文案中的“自嗨现象”
    【运营手册2020年12月】
    软件研发的原则
    《营销的16个关键词》笔记
  • 原文地址:https://www.cnblogs.com/baidawei/p/9145002.html
Copyright © 2011-2022 走看看