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

扫码关注公众号:Java 技术驿站

发送:vip
将链接复制到本浏览器,永久解锁本站全部文章

【公众号:Java 技术驿站】 【加作者微信交流技术,拉技术群】

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

    }

《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) 打赏
版权归原创作者所有,任何形式的转载请联系博主:daming_90:Java 技术驿站 » Spring Cloud_21_整合Hystrix/整合Feign(三)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏