zoukankan      html  css  js  c++  java
  • 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   
  • 相关阅读:
    (二)建筑物多边形化简系列——多边形点数化简
    (一)建筑物多边形化简系列——去除噪点环
    (三)建筑物多边形化简系列——去除冗余点
    (五)建筑物多边形化简系列——最小外接矩形的获取
    vue笔记
    学习react基础知识(五)
    学习react基础知识(四)
    学习react基础知识(三)
    学习react基础知识(二)
    学习react基础知识(一)
  • 原文地址:https://www.cnblogs.com/jentary/p/12321153.html
Copyright © 2011-2022 走看看