SpringCloud组件---Hystrix

Hystrix的介绍:

    Hystrix,是spring cloud的一个组件,是一种保护机制,用于隔离访问远程服务,防止出现级联失败(雪崩效应)。
    
    Hystrix处理请求的策略:
        服务降级:Fallback,可以理解为备胎,从五星级降到四星级等;
        线程隔离:避仓模式,默认的一种策略;例如新冠肺炎在某个地区爆发,将这个地区隔离起来;
        信号量模式:设定一个阈值,达到这个阈值后采取相应的措施;
    
    Hystrix的使用:
        1. 添加依赖:
            在微服务user-consumer端添加依赖:
            <!--熔断器-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
            </dependency>
            
        2. 使用注解@EnableCircuitBreaker开启熔断机制:
            在user-consumer端的启动类中开启熔断机制:
            package com.it;

            import org.springframework.boot.SpringApplication;
            import org.springframework.boot.autoconfigure.SpringBootApplication;
            import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
            import org.springframework.cloud.client.loadbalancer.LoadBalanced;
            import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
            import org.springframework.context.annotation.Bean;
            import org.springframework.web.client.RestTemplate;

            /**
             * ToDo
             *
             * @author Lyle
             * @date 2020/4/3
             */
            @SpringBootApplication
            @EnableEurekaClient
            @EnableCircuitBreaker//开启熔断机制
            public class UserConsumerApplication {
                public static void main(String[] args) {
                    SpringApplication.run(UserConsumerApplication.class,args);
                }

                @Bean
                @LoadBalanced//Ribbon集成RestTemplate,实现了负载均衡
                public RestTemplate restTemplate(){
                    return new RestTemplate();
                }

            }
            
        3. 在user-consumer端的Controller类中的响应方法上使用注解@HystrixCommand(fallbackMethod = "myFallBackMethod"),
        myFallBackMethod为定义的熔断处理方法,方法名可以自定义,熔断开启,出现错误后,返回该方法定义的响应数据;
            
            package com.it.controller;

            import com.it.pojo.User;
            import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
            import org.springframework.beans.factory.annotation.Autowired;
            import org.springframework.cloud.client.ServiceInstance;
            import org.springframework.cloud.client.discovery.DiscoveryClient;
            import org.springframework.web.bind.annotation.PathVariable;
            import org.springframework.web.bind.annotation.RequestMapping;
            import org.springframework.web.bind.annotation.RestController;
            import org.springframework.web.client.RestTemplate;

            import java.util.List;

            /**
             * ToDo
             *
             * @author Lyle
             * @date 2020/4/3
             */
            @RestController
            @RequestMapping("/movie")
            public class MovieController {

                @Autowired
                private RestTemplate restTemplate;

                @Autowired
                private DiscoveryClient discoveryClient;

                @RequestMapping("/look/{username}")
                @HystrixCommand(fallbackMethod = "myFallBackMethod")
                public String look(@PathVariable(name = "username") String username){
                    //接收用户信息
                   
                    List<ServiceInstance> instances = discoveryClient.getInstances("user-provider");
                    ServiceInstance serviceInstance = instances.get(0);
            
                    User user = restTemplate.getForObject("http://user-provider/user/findByUser", User.class);
                    System.out.println(username+"===========>"+user.getName());
                    return "success";
                }

                //自定义的熔断处理方法,出现错误后,返回该方法定义的响应数据
                //注意该方法的参数一定要和使用注解@HystrixCommand的方法参数保持一致
                public String myFallBackMethod(String username){

                    return "数据是备用的。。。。"+":"+username;
                }
            }

        4. 在user-consumer端的Controller类上面使用注解@DefaultProperties(defaultFallback = "myDefaultFallback"),并自定义
        熔断处理方法,返回默认的数据,myDefaultFallback为自定义的熔断处理方法:
            1. 在方法使用注解:@HystrixCommand
            2. 自定义的熔断处理方法
            
            package com.it.controller;

            import com.it.pojo.User;
            import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
            import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
            import org.springframework.beans.factory.annotation.Autowired;
            import org.springframework.cloud.client.ServiceInstance;
            import org.springframework.cloud.client.discovery.DiscoveryClient;
            import org.springframework.web.bind.annotation.PathVariable;
            import org.springframework.web.bind.annotation.RequestMapping;
            import org.springframework.web.bind.annotation.RestController;
            import org.springframework.web.client.RestTemplate;

            import java.util.List;

            /**
             * ToDo
             *
             * @author Lyle
             * @date 2020/4/3
             */
            @RestController
            @RequestMapping("/movie")
            @DefaultProperties(defaultFallback = "myDefaultFallback")//定义默认的Fallback,所有的方法都可用
            public class MovieController {

                @Autowired
                private RestTemplate restTemplate;

                @Autowired
                private DiscoveryClient discoveryClient;

                @RequestMapping("/look/{username}")
                @HystrixCommand
                public String look(@PathVariable(name = "username") String username){
                    //接收用户信息
                   
                    List<ServiceInstance> instances = discoveryClient.getInstances("user-provider");
                    ServiceInstance serviceInstance = instances.get(0);
            
                    User user = restTemplate.getForObject("http://user-provider/user/findByUser", User.class);
                    System.out.println(username+"===========>"+user.getName());
                    return "success";
                }


                
                //定义默认的熔断处理方法,所有的方法都可用
                //注意该方法不需要给参数
                public String myDefaultFallback(){

                    return "默认的数据。。。。";
                }
            }
            
        5. 熔断策略的配置:
            在微服务user-consumer端的配置文件application.yml中进行配置:
                # 配置熔断策略:
                hystrix:
                  command:
                    default:
                      circuitBreaker:
                        # 强制打开熔断器 默认false关闭的。测试配置是否生效
                        forceOpen: false
                        # 触发熔断错误比例阈值,默认值50%
                        errorThresholdPercentage: 50
                        # 熔断后休眠时长,默认值5秒
                        sleepWindowInMilliseconds: 10000
                        # 熔断触发最小请求次数,默认值是20
                        requestVolumeThreshold: 10
                      execution:
                        isolation:
                          thread:
                            # 熔断超时设置,默认为1秒
                            timeoutInMilliseconds: 2000

        
        




    




















    
            

 

posted @ 2020-04-03 22:21  moonlighter  阅读(251)  评论(0编辑  收藏  举报