springcloud--hystrix

一、hystrix

服务雪崩效应

当并发请求 去请求某一个服务时,超过tomcat的最大请求数,其他服务请求就会等待,造成服务雪崩,大量服务请求延迟等待

1、断路器

2、服务降级

在高并发情况下,防止用户一直等待,没有线程处理客户端请求时候,给客户端反馈

fallback

3、服务熔断

为了保护服务,在高并发情况下,如果请求达到一定的极限,请求数达到一定的极限,流量达到一定阀值,自动开启保护服务功能,使用服务降级方式返回一个友好的提示

4、服务隔离机制

线程池和信号量隔离,一般使用线程池隔离

每个服务接口都有自己独立的线程池,每个线程池互补影响,默认线程池隔离

缺点:CPU占用率高

5、服务雪崩效应

通过服务降级,服务隔离,服务熔断

二、两种实现方式,一种是接口,一种注解

zk-member 调用zk-user服务

zk-member

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR3</spring-cloud.version>
        <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        
         <!-- feign客户端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        
        <!-- hystrix -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-all</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.zookeeper</groupId>
                    <artifactId>zookeeper</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.6</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

@SpringBootApplication
//ribbon
@EnableDiscoveryClient
//feign
@EnableFeignClients
//Hystrix
@EnableHystrix
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
    
    /**
     * 将RestTemplate注入spring容器
     * @return
     */
    @Bean
    @LoadBalanced //加入ribbon 的负载均衡器   ,轮询调用
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

}
@RestController
public class MemberApi {
    
    
    @Autowired
    private UserService userService;
    
    
    /**
     * 
     * springcloud中接口制件调用有两种方式
     * 1.RestTemplate 
     * 2.fegin
     * 
     * 
     * **/
    
    @Autowired
    private RestTemplate restTemplate;
    
    @Autowired
    private DiscoveryClient discoveryClient;
    
    @RequestMapping(value="/addMember")
    public String addMember(String name) {
        //url = "http://localhost:8300/getUser"
        
        //通过discoveryClient 获取服务信息列表
        //List<ServiceInstance> services = discoveryClient.getInstances("zk-user");
        
        /**
         * restTemplate.getForObject("http://localhost:8300/getUser", String.class);
         * restTemplate  以别名的方式访问需要添加
         * 
         * 
         * **/
        String s = restTemplate.getForObject("http://zk-user/getUser", String.class);
        
        System.out.println(s);
        return "添加会员";
    }
    
    /**
     * feign客户单调用
     * @return
     */
    @RequestMapping(value="/getMember")
    public String getMember() {
        String s = userService.getUser();
        return "会员调用用户服务-----"+s;
    }
    
    /**
     * 开启Hystrix服务保护
     * @return
     */
    @RequestMapping(value="/memberHystrix")
    @HystrixCommand(fallbackMethod = "memberHystrixFallBack")
    public String memberHystrix() {
        //默认线程池隔离,服务降级memberHystrixFallBack
        
        //默认熔断10次请求
        System.out.println(Thread.currentThread().getName());
        String s = userService.getUser();
        return "会员调用用户服务-----"+s;
    }
    
    public String memberHystrixFallBack() {
        return "当前网络繁忙";
    }
    

}
@Component
public class MemberServiceFallBack implements UserService{

    /**
     * Hystrix 统一返回
     */
    public String getUser() {
        return "用户忙";
    }

}
/**
 * Hystrix 统一返回 不用以下
 * @HystrixCommand(fallbackMethod = "memberHystrixFallBack")
 * @author Administrator
 *
 */
@FeignClient(name = "zk-user",fallback = MemberServiceFallBack.class)  
public interface UserService {
    
    /**
     * 调用user服务中getUser
     * @return
     */
    @GetMapping(value = "/getUser")
    String getUser();


}
spring.application.name=zk-member
server.port=9200
#只能是本地才能这么写,如果连接远程需要加bootstrap.yml,zookeeper创建的是临时节点,服务关掉后节点也会被删除
#spring.cloud.zookeeper.connect-string=localhost:2181   

#设置ribbon 读取和超时时间  默认1秒   超过1秒调用失败
ribbon.ConnectTimeout=5000
# Read timeout used by Apache HttpClient
ribbon.ReadTimeout=5000

#开启hystrix
feign.hystrix.enabled: true

#禁止hystrix超时时间设置,默认开启,1秒,如果不设置,接口调用超过1秒   会执行fallbackMethod
hystrix.command.default.execution.timeout.enabled:false

zk-user

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR3</spring-cloud.version>
        <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-all</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.zookeeper</groupId>
                    <artifactId>zookeeper</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.6</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
@SpringBootApplication
/**
 * 使用zookeeper 或使用connsoul时@EnableDiscoveryClient注册到注册中心
 * @author Administrator
 *
 */
@EnableDiscoveryClient
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

}
@RestController
public class UserApi {
    
    
    
    
    @RequestMapping("/getUser")
    public String getUser() {
        try {
            Thread.currentThread().sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "获取用户";
    }

}
spring.application.name=zk-user
server.port=9100
#只能是本地才能这么写,如果连接远程需要加bootstrap.yml,zookeeper创建的是临时节点,服务关掉后节点也会被删除
#spring.cloud.zookeeper.connect-string=localhost:2181   
原文地址:https://www.cnblogs.com/jentary/p/12321153.html