zoukankan      html  css  js  c++  java
  • Feign Hystrix

    1、Feign整合Hystrix

    • 添加依赖
    • 编写接口与实现回退

    1.1、调用者引入依赖

    <!-- Feign -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-feign</artifactId>
    </dependency>

    1.2、启动类使用注解

    package com.atm.cloud;
    
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.web.servlet.ServletComponentScan;
    import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.cloud.netflix.feign.EnableFeignClients;
    import org.springframework.context.annotation.Bean;
    import org.springframework.web.client.RestTemplate;
    
    @SpringBootApplication
    @EnableEurekaClient
    @EnableCircuitBreaker//打开Hystrix断路器
    @ServletComponentScan//扫描缓存
    @EnableFeignClients//打开Feign注解
    public class HystrixInvokerApp {
    
        @Bean
        @LoadBalanced
        public RestTemplate getRestTemplate() {
            return new RestTemplate();
        }
    
        public static void main(String[] args) {
            new SpringApplicationBuilder(HystrixInvokerApp.class).web(true).run(
                    args);
        }
    }
    

    1.3、新建Feign接口(测试回退)

    1.3.1、回顾服务提供者MyRestController

    • 去调用服务提供者的接口,以下代码是服务提供者的接口代码
    package com.atm.cloud;
    
    import org.springframework.http.MediaType;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class MyRestController {
    
        @RequestMapping(value = "/person/{personId}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
        public Person findPerson(@PathVariable("personId") Integer personId) {
            Person person = new Person();
    
            person.setId(personId);
            person.setAge(18);
            person.setName("atm");
    
            return person;
        }
    
        @GetMapping("/hello")
        @ResponseBody
        public String sayHello(){
            return "Hello World!";
        }
    
    }
    

    1.3.2、回顾服务调用者HelloClient

    package com.atm.cloud.feignCtr;
    
    import org.springframework.cloud.netflix.feign.FeignClient;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    @FeignClient("atm-eureka-hystrix-provider")
    public interface HelloClient {
    
        @RequestMapping(method=RequestMethod.GET,value="/hello")
        String sayHello();
    }
    

    1.3.3、回顾服务调用者FeignController

    package com.atm.cloud.feignCtr;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class FeignController {
    
        @Autowired
        private HelloClient helloClient;
    
        @RequestMapping(value = "ivHello", method = RequestMethod.GET)
        public String ivHello() {
            return helloClient.sayHello();
        }
    }
    

    1.3.4、修改application.yml

    server:
     port: 9000
    spring:
     application:
      name: atm-eureka-hystrix-invoker
    ##开启feign开关
    feign:
      hystrix:
        enabled: true
    eureka:
     client:
      serviceUrl:
       defaultZone: http://localhost:8761/eureka/

    1.3.5、新增HelloClientFallBack

    package com.atm.cloud.feignCtr;
    
    import org.springframework.stereotype.Component;
    
    //HelloClient类去Spring容器中寻找HelloClientFallBack
    //所以添加注解Component
    @Component
    public class HelloClientFallBack implements HelloClient {
    
        public String sayHello() {
            return "fallBack Hello";
        }
    
    }
    

    1.3.6、修改HelloClient

    package com.atm.cloud.feignCtr;
    
    import org.springframework.cloud.netflix.feign.FeignClient;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    //当HellClien访问atm-eureka-hystrix-provider失败时,需要有一个后备服务
    //后备服务需要实现该接口
    @FeignClient(name = "atm-eureka-hystrix-provider", fallback = HelloClientFallBack.class)
    public interface HelloClient {
    
        @RequestMapping(method = RequestMethod.GET, value = "/hello")
        String sayHello();
    }
    

    1.4、测试断路器

    • 断路器打开的要求

      1. 10秒内连续20个同样的请求
      2. 失败率过50%
    • 断路器关闭

      1. 休眠期5分钟
      2. 5分钟后尝试请求,请求成功则关闭

    1.4.1、服务提供者MyRestController

    package com.atm.cloud;
    
    import org.springframework.http.MediaType;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class MyRestController {
    
        @GetMapping("/tmhello")
        @ResponseBody
        public String timeOutHello() throws InterruptedException {
            // 此方法处理最少需要1s
            Thread.sleep(1000);
            return "TimeOut Hello";
        }
    
    }
    

    1.4.2、服务调用者HelloClient

    package com.atm.cloud.feignCtr;
    
    import org.springframework.cloud.netflix.feign.FeignClient;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    //当HellClien访问atm-eureka-hystrix-provider失败时,需要有一个后备服务
    //后备服务需要实现该接口
    @FeignClient(name = "atm-eureka-hystrix-provider", fallback = HelloClientFallBack.class)
    public interface HelloClient {
    
        @RequestMapping(method = RequestMethod.GET, value = "/tmhello")
        String toHello();
    }
    
    package com.atm.cloud.feignCtr;
    
    import org.springframework.stereotype.Component;
    
    @Component
    public class HelloClientFallBack implements HelloClient {
    
        public String toHello() {
            return "fallBack timeOut Hello";
        }
    
    }
    

    1.4.3、服务调用者FeignController

    package com.atm.cloud.feignCtr;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.netflix.hystrix.HystrixCircuitBreaker;
    import com.netflix.hystrix.HystrixCommandKey;
    
    @RestController
    public class FeignController {
    
        @Autowired
        private HelloClient helloClient;
    
        @RequestMapping(value = "tmHello", method = RequestMethod.GET)
        public String tmHello() {
            String result = helloClient.toHello();
            HystrixCircuitBreaker breaker = HystrixCircuitBreaker.Factory
                    .getInstance(HystrixCommandKey.Factory
                            .asKey("HelloClient#toHello()"));
            System.out.println("断路器状态:" + breaker.isOpen());
            return result;
        }
    }
    

    1.4.4、服务调用者application.yml

    server:
     port: 9000
    spring:
     application:
      name: atm-eureka-hystrix-invoker
    feign:
      hystrix:
        enabled: true
    hystrix:
      command:
        ##全局方法使用default
        HelloClient#toHello():
          execution:
            isolation:
              thread: 
              ##超时时间
                timeoutInMilliseconds: 500
          circuitBreaker:
          ##每秒3次请求
            requestVolumeThreshold: 3
    eureka:
     client:
      serviceUrl:
       defaultZone: http://localhost:8761/eureka/

    1.4.5、服务调用者HttpClientMain

    package com.atm.cloud.feignCtr;
    
    import org.apache.http.HttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.util.EntityUtils;
    
    public class HttpClientMain {
    
        public static void main(String[] args) throws Exception{
            final CloseableHttpClient httpclient = HttpClients.createDefault();
            final String url = "http://localhost:9000/tmHello";
    
            for(int i = 0; i < 6; i++) {
                Thread t = new Thread() {
    
                    @Override
                    public void run() {
                        try {
                            HttpGet httpget = new HttpGet(url);
                            HttpResponse response = httpclient.execute(httpget);
                            System.out.println(EntityUtils.toString(response.getEntity()));
                        } catch (Exception e ) {
                            e.printStackTrace();
                        }
                    }               
                };
                t.start();
            }
            Thread.sleep(15000);
        }
    }
    

    1.5、Hystrix监控

    • 客户端被监控
    • 谁去监控客户端,一般由其他项目监控,这里新建一个maven项目进行监控

    1.5.1、服务提供者引入依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
        <version>1.5.3.RELEASE</version>
    </dependency>

    1.5.2、监控引入依赖

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.atm.cloud</groupId>
        <artifactId>atm_eureka_hystrix_visit</artifactId>
        <packaging>war</packaging>
        <version>0.0.1-SNAPSHOT</version>
        <name>atm_eureka_hystrix_visit Maven Webapp</name>
        <url>http://maven.apache.org</url>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Dalston.SR1</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-hystrix</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
                <version>1.5.3.RELEASE</version>
            </dependency>
        </dependencies>
        <build>
            <finalName>atm_eureka_hystrix_visit</finalName>
        </build>
    </project>
    

    1.5.3、监控启动

    • 监控服务调用者
    package com.atm.cloud;
    
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
    
    @SpringBootApplication
    @EnableHystrixDashboard
    public class HystrixVisitApp {
    
        public static void main(String[] args) {
            new SpringApplicationBuilder(HystrixVisitApp.class).properties(
                    "server.port=8082").run(args);
        }
    
    }

    • 执行HttpClientMain

  • 相关阅读:
    网页性能优化,缓存优化、加载时优化、动画优化--摘抄
    display的32种写法--摘抄
    transform与position:fixed的那些恩怨--摘抄
    float 常见用法与问题--摘抄
    10个JavaScript难点--摘抄
    CSS3 动画卡顿性能优化解决方案--摘抄
    CSS 盒模型、解决方案、BFC 原理讲解--摘抄
    web实时长图实践--摘抄
    移动端H5多平台分享实践--摘抄
    canvas绘制视频封面--摘抄
  • 原文地址:https://www.cnblogs.com/jtlgb/p/9358315.html
Copyright © 2011-2022 走看看