zoukankan      html  css  js  c++  java
  • springCloud学习-断路器(Hystrix)

    1、问题分析

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

      应对服务雪崩的方案,一种是服务降级,一种是Hystrix熔断器

    2、在ribbon中使用断路器

      2.1、改造serice-ribbon 工程,在pom.xml文件中加入依赖

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

       2.2、在程序的启动类ServiceRibbonApplication 加@EnableHystrix注解开启Hystrix:

    @EnableHystrix
    @EnableEurekaClient
    @SpringBootApplication
    public class ServiceRibbonApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ServiceRibbonApplication.class, args);
        }
    
        @Bean
        @LoadBalanced
        RestTemplate restTemplate() {
            return new RestTemplate();
        }
    }

      2.3、改造HelloService类,在hiService方法上加上@HystrixCommand注解。该注解对该方法创建了熔断器的功能,并指定了fallbackMethod熔断方法,熔断方法直接返回了一个字符串,字符串为”hi,”+name+”,sorry,error!”,代码如下:

    @Service
    public class HelloService {
    
        @Autowired
        RestTemplate restTemplate;
    
        @HystrixCommand(fallbackMethod = "hiError")
        public String hiService(String name) {
            return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class);
        }
    
        public String hiError(String name) {
            return "hi,"+name+",sorry,error!";
        }
    }

      2.4、启动eureka-server 工程 启动eureka-client工程,它的端口为8762 ,启动service-ribbon 工程

        此时,我们访问 http://localhost:8764/hi?name=lis 页面显示

    hi lis,i am from port:8762

      停止eureka-client工程。再刷新页面,显示如下

    hi,lis,sorry,error!

    3、在feign中使用断路器

      3.1、Feign是自带断路器的,在配置文件加以下代码:

    feign:
      hystrix:
          enabled: true

      3.2、基于service-feign工程进行改造,只需要在FeignClient的SchedualServiceHi接口的注解中加上fallback的指定类就行了:

    @FeignClient(value = "service-hi",fallback = SchedualServiceHiHystric.class)
    public interface SchedualServiceHi {
        @RequestMapping(value = "/hi",method = RequestMethod.GET)
        String sayHiFromClientOne(@RequestParam(value = "name") String name);
    }

      3.3、SchedualServiceHiHystric需要实现SchedualServiceHi 接口,并注入到Ioc容器中,代码如下:

    @Component
    public class SchedualServiceHiHystric implements SchedualServiceHi {
        @Override
        public String sayHiFromClientOne(String name) {
            return "sorry "+name;
        }
    }

      3.4、启动eureka-server 工程 启动eureka-client工程,它的端口为8762 ,启动service-feign 工程

        此时,我们访问 http://localhost:8764/hi?name=lis 页面显示

    hi lis,i am from port:8762

        停止eureka-client工程。再刷新页面,显示如下

    hi,lis,sorry,error!

      

     

  • 相关阅读:
    fullCalendar改造计划之带农历节气节假日的万年历(转)
    Linked List Cycle
    Remove Nth Node From End of List
    Binary Tree Inorder Traversal
    Unique Binary Search Trees
    Binary Tree Level Order Traversal
    Binary Tree Level Order Traversal II
    Plus One
    Remove Duplicates from Sorted List
    Merge Two Sorted Lists
  • 原文地址:https://www.cnblogs.com/shun-gege/p/9350828.html
Copyright © 2011-2022 走看看