SpringCloud初体验:三、Feign 服务间调用(FeignClient)、负载均衡(Ribbon)、容错/降级处理(Hystrix)

 

Feign
OpenFeign Feign是一种声明式、模板化的HTTP客户端。

看了解释过后,可以理解为他是一种 客户端 配置实现的策略,它实现 服务间调用(FeignClient)、负载均衡(Ribbon)、容错/降级处理(Hystrix)  也很简单

1、引入依赖

<?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

 

 

2、修改配置文件 (这里没有涉及到 负载均衡的策略, 采取默认轮训配置 openfeign ,自带了 Ribbon 负载均衡(@LoadBalanced))

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

 

 

3、配置FeignClient,集成了Ribbon及Hystrix

 

 

4、启动类添加注解 

  @EnableEurekaClient
  @EnableFeignClients

 

这个示例中为了简单没有启用 配置客户端, 提供服务方无需提供任何配置,只需要服务调用端(客户端)做好相关配置即可。

 

此时已经有了 服务间服务调用、自动负载均衡调用服务、服务熔断/容错 的功能 

 

**** 扩展一下:如果一个应用Feign想要调用外部服务,并且启用Hystrix 熔断回调了怎么办呢? 不需其它的配置,只需要配置一个 @FeignClient 的 url 即可,如下

 

 

 


posted @ 2018-08-05 17:55  liugx  阅读(13919)  评论(0编辑  收藏  举报