Spring Cloud_21_整合Hystrix/整合Feign(三)

 2019-10-20 15:34  阅读(967)
文章分类:Spring Cloud

整合Hystrix/整合Feign(三)

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();
    }

《Spring Cloud\_21\_整合Hystrix/整合Feign(三)》

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);
        }
    }

《Spring Cloud\_21\_整合Hystrix/整合Feign(三)》

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);
        }
    
    }
    
  • 浏览器访问http://127.0.0.1:9000/hystrix.stream

  • 浏览器访问http://127.0.0.1:9000/ivHello

  • 浏览器访问http://127.0.0.1:8082/hystrix

《Spring Cloud\_21\_整合Hystrix/整合Feign(三)》

《Spring Cloud\_21\_整合Hystrix/整合Feign(三)》

《Spring Cloud\_21\_整合Hystrix/整合Feign(三)》

《Spring Cloud\_21\_整合Hystrix/整合Feign(三)》

《Spring Cloud\_21\_整合Hystrix/整合Feign(三)》

《Spring Cloud\_21\_整合Hystrix/整合Feign(三)》

  • 执行HttpClientMain

《Spring Cloud\_21\_整合Hystrix/整合Feign(三)》

点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> Spring Cloud_21_整合Hystrix/整合Feign(三)

相关推荐