• Spring Cloud(Dalston.SR5)--Feign 与 Hystrix 断路器整合


    • 创建项目

      要使 Feign 与 Hystrix 进行整合,我们需要增加 Feign 和 Hystrix 的依赖,修改 POM.xml 中增加以下依赖项如下:

      <?xmlversion="1.0"encoding="UTF-8"?>

      <projectxmlns="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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">

      <modelVersion>4.0.0</modelVersion>

         

      <groupId>org.lixue</groupId>

      <artifactId>spring-cloud-hystrix-client</artifactId>

      <version>0.0.1-SNAPSHOT</version>

      <packaging>jar</packaging>

         

      <name>spring-cloud-hystrix-client</name>

      <description>DemoprojectforSpringBoot</description>

         

      <parent>

      <groupId>org.springframework.boot</groupId>

      <artifactId>spring-boot-starter-parent</artifactId>

      <version>1.5.4.RELEASE</version>

      <relativePath/><!--lookupparentfromrepository-->

      </parent>

         

      <properties>

      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

      <java.version>1.8</java.version>

      <spring-cloud.version>Dalston.SR5</spring-cloud.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-eureka</artifactId>

      </dependency>

      <dependency>

      <groupId>org.springframework.cloud</groupId>

      <artifactId>spring-cloud-starter-feign</artifactId>

      </dependency>

      <dependency>

      <groupId>org.springframework.cloud</groupId>

      <artifactId>spring-cloud-starter-ribbon</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-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>

      </project>

       

    • 增加配置

      还需要在 src/main/resources/application.yml 中,开启 Feign 的配置,如下:

      #配置应用名称

      spring:

      application:

      name:spring-cloud-hystrix-client

      #服务端口

      server:

      port:8077

      #启用feign的hystrix支持

      feign:

      hystrix:

      enabled:true

      #设置eureka服务注册中心的地址,如果多个以逗号分割

      eureka:

      client:

      service-url:

      defaultZone:http://eurekaserver01:9000/eureka/,http://eurekaserver02:9000/eureka/

         

    • 创建 Feign 客户端

      创建 Feign 客户端接口,增加回退的类实现,在 @FeignClient 注解中,设置 fallback 属性,如下:

      package org.lixue;

         

      import org.springframework.cloud.netflix.feign.FeignClient;

      import org.springframework.stereotype.Component;

      import org.springframework.web.bind.annotation.RequestMapping;

      import org.springframework.web.bind.annotation.RequestMethod;

      import org.springframework.web.bind.annotation.RequestParam;

         

      @FeignClient(name="HELLOWORLD-PROVIDER",fallback=HelloWorldFeignClient.HelloWorldFallback.class)

      public interface HelloWorldFeignClient{

         

      @RequestMapping(path="/speaks",method=RequestMethod.GET)

      String speak(@RequestParam(name="names")Stringname);

         

      @Component

      class HelloWorldFallback implements HelloWorldFeignClient{

         

      @Override

      public String speak(String name){

      return"speakfallbackisname="+name;

      }

      }

      }

       

    • 创建调用类

      只需要使用 @Autowired 注解标注 HelloWorldFeignClient 实例进行自动注入,然后调用 HelloWorldFeignClient 实例的方法即完成调用,如下:

      package org.lixue;

         

      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.RequestParam;

      import org.springframework.web.bind.annotation.RestController;

         

      import java.util.List;

      import java.util.Map;

      import java.util.concurrent.ExecutionException;

      import java.util.concurrent.Future;

         

      @RestController

      public class InvokerController{

         

      @Autowired

      private HelloWorldFeignClient helloWorldFeignClient;

         

      @RequestMapping(method=RequestMethod.GET,path="/speakFeign")

      public String speakFeign(@RequestParam("name")String name){

      return helloWorldFeignClient.speak(name);

      }

      }

       

       

    • 启动类

      增加 @EnableCircuitBreaker 和 @EnableFeignClients 注解,启用 Feign 和 Hystrix 功能,如下:

      package org.lixue;

         

      import org.springframework.boot.SpringApplication;

      import org.springframework.boot.autoconfigure.SpringBootApplication;

      import org.springframework.boot.web.servlet.ServletComponentScan;

      import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;

      import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

      import org.springframework.cloud.netflix.feign.EnableFeignClients;

         

      @SpringBootApplication

      @EnableDiscoveryClient

      @EnableCircuitBreaker

      @EnableFeignClients

      @ServletComponentScan

      public class SpringCloudHystrixClientApplication{

         

      public static void main(String[]args){

      SpringApplication.run(SpringCloudHystrixClientApplication.class,args);

      }

      }

         

    • 测试验证

      由于我们使用了 Ribbon 因此首先启动 eureka-server 和 service-provider 服务,然后启动该项目,访问 http://localhost:8077/speak?name=abc 可以看到能正常返回信息,如下:

      Hello World abc Port=8080

      此时,关闭 service-provider 服务,然后在访问地址 http://localhost:8077/speak?name=abc 可以看到,由于服务已经不可用,因此执行了该方法的回退返回,返回如下:

      speak fallback is name=abc

         

    • 配置说明

      Feign 与 Hystrix 整合使用时,会自动帮我们生成 CommandKey,格式为:Feign 客户端接口名称#方法名() ,生成的 GroupKey 为 @FeignClient 注解的 name 属性,例如,上面示例生成的 CommandKey 为 HelloWorldFeignClient#speak() ,Groupkey 为 HELLOWORLD-PROVIDER,如果需要针对该 Feign 客户端设置 Hystrix 的配置属性,在 application.yml 中增加配置如下:

      #设置Hystrix的属性

      hystrix:

      command:

      HelloWorldFeignClient#speak():

      execution:

      isolation:

      thread:

      timeoutInMilliseconds:200

      如果需要设置默认全局属性,则修改 application.yml 配置如下:

      #设置Hystrix的属性

      hystrix:

      command:

      default:

      execution:

      isolation:

      thread:

      timeoutInMilliseconds:200

         

  • 相关阅读:
    TeamX 专为中小团队思考的...团队协作工具
    8 月直播课抢先看 | 代码质量实战 + 微服务项目实战课程报名中
    CODING DevOps 代码质量实战系列第一课,本周开讲!
    CODING 现已支持墨刀原型引入
    CODING 企业微信小程序上线了
    CODING DevOps + Nginx-ingress 实现自动化灰度发布
    第二届腾讯运维技术开放日来啦!
    前端智造,内容新生
    kafka的特性初探
    弄懂一致性哈希后我打通了redis分区集群的原理
  • 原文地址:https://www.cnblogs.com/li3807/p/8916830.html
Copyright © 2020-2023  润新知