• 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
    
            
            
    
    
    
    
        
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
        
                
  • 相关阅读:
    文件上传之断点续传方案
    WEB项目(B/S系统)打包安装(总结篇)
    FLEX4.0开发流媒体视频播放器(总结篇)
    mysql 从库出现system lock延迟
    mysql与oracle 不同
    操作系统运维查询命令
    centos ifconfig 命令找不到
    bit 与 byte的区别
    mysql 登录socket与TCP
    xhost +
  • 原文地址:https://www.cnblogs.com/lyle-liu/p/12629330.html
Copyright © 2020-2023  润新知