SpringCloud初體驗:3、Feign 服務間調用(FeignClient)、負載均衡(Ribbon)、容錯/降級處理(Hystrix)

 

Feign
OpenFeign Feign是一種聲明式、模板化的HTTP客戶端。

看了解釋事後,能夠理解爲他是一種 客戶端 配置實現的策略,它實現 服務間調用(FeignClient)、負載均衡(Ribbon)、容錯/降級處理(Hystrix)  也很簡單java

一、引入依賴git

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zjj7</groupId>
    <artifactId>publish</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>

    <name>publish</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <!--配置倉庫-->
    <repositories>
        <repository>
            <id>aliRepository</id>
            <name>aliRepository</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

    <!-- cloud -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <!--<dependency>-->
            <!--<groupId>org.springframework.boot</groupId>-->
            <!--<artifactId>spring-boot-starter-data-jpa</artifactId>-->
        <!--</dependency>-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <!--lombok依賴-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.10</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>
View Code

 

 

二、修改配置文件 (這裏沒有涉及到 負載均衡的策略, 採起默認輪訓配置 openfeign ,自帶了 Ribbon 負載均衡(@LoadBalanced))github

spring:
  application:
    name: publish

#feign 配置
feign:
  hystrix:
    enabled: true
  client:
    config:
      default:
        connectTimeout: 5000
        readTimeout: 5000
        loggerLevel: full

#hystrix 熔斷機制
hystrix:
  shareSecurityContext: true
  command:
    default:
      circuitBreaker:
        # 熔斷後的重試時間窗口,且在該時間窗口內只容許一次重試。即在熔斷開關打開後,在該時間窗口容許有一次重試,若是重試成功,則將重置Health採樣統計並閉合熔斷開關實現快速恢復,不然熔斷開關仍是打開狀態,執行快速失敗, 默認爲爲5s。
        sleepWindowInMilliseconds: 10000
        # 若是在一個採樣時間窗口內,失敗率超過該配置,則自動打開熔斷開關實現降級處理,即快速失敗。默認配置下采樣週期爲10s,失敗率爲50%。
        errorThresholdPercentage: 50
        # 在熔斷開關閉合狀況下,在進行失敗率判斷以前,一個採樣週期內必須進行至少N個請求才能進行採樣統計,目的是有足夠的採樣使得失敗率計算正確,默認爲20。
        requestVolumeThreshold: 20
        # 是否強制關閉熔斷開關,若是強制關閉了熔斷開關,則請求不會被降級,一些特殊場景能夠動態配置該開關,默認爲false。
        forceClosed: false
        # 是否強制打開熔斷開關,若是強制打開可熔斷開關,則請求強制降級調用getFallback處理,能夠經過動態配置來打開該開關實現一些特殊需求,默認爲false。
        forceOpen: false
      execution:
        isolation:
          thread:
            # 是否啓用執行超時機制,默認爲true
            timeoutEnabled: true
            # 執行超時時間,默認爲1000毫秒,若是命令是線程隔離,且配置了executionIsolationThreadInterruptOnTimeout=true,則執行線程將執行中斷處理。若是命令是信號量隔離,則進行終止操做,由於信號量隔離與主線程是在一個線程中執行,其不會中斷線程處理,因此要根據實際狀況來決定是否採用信號量隔離,尤爲涉及網絡訪問的狀況。
            timeoutInMilliseconds: 1000
            # 當隔離策略爲THREAD時,當執行線程執行超時時,是否進行中斷處理,即Future#cancel(true)處理,默認爲false。
            interruptOnFutureCancel: true
            # 當隔離策略爲THREAD時,當執行線程執行超時時,是否進行中斷處理,默認爲true。
            interruptOnTimeout: true

#服務註冊中心端口號
server:
  port: 6121

#服務註冊中心實例的主機名、端口
#是否向服務註冊中心註冊本身
#是否檢索服務
#服務註冊中心的配置內容,指定服務註冊中心的位置
eureka:
  port:
    6110
  instance:
    hostname: localhost
  client:
    register-with-eureka: true
    fetch-registry: true
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${eureka.port}/eureka/

logging:
  level:
    com.zjj7.publish.feignClien: DEBUG
View Code

 

 

三、配置FeignClient,集成了Ribbon及Hystrixweb

 

 

四、啓動類添加註解 spring

  @EnableEurekaClient
  @EnableFeignClientsapache

 

這個示例中爲了簡單沒有啓用 配置客戶端, 提供服務方無需提供任何配置,只須要服務調用端(客戶端)作好相關配置便可。網絡

 

此時已經有了 服務間服務調用、自動負載均衡調用服務、服務熔斷/容錯 的功能 app

 

**** 擴展一下:若是一個應用Feign想要調用外部服務,而且啓用Hystrix 熔斷回調了怎麼辦呢? 不需其它的配置,只須要配置一個 @FeignClient 的 url 便可,以下負載均衡

相關文章
相關標籤/搜索