看了解释事后,能够理解为他是一种 客户端 配置实现的策略,它实现 服务间调用(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>
二、修改配置文件 (这里没有涉及到 负载均衡的策略, 采起默认轮训配置 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
三、配置FeignClient,集成了Ribbon及Hystrixweb
四、启动类添加注解 spring
@EnableEurekaClient
@EnableFeignClientsapache
这个示例中为了简单没有启用 配置客户端, 提供服务方无需提供任何配置,只须要服务调用端(客户端)作好相关配置便可。网络
此时已经有了 服务间服务调用、自动负载均衡调用服务、服务熔断/容错 的功能 app
**** 扩展一下:若是一个应用Feign想要调用外部服务,而且启用Hystrix 熔断回调了怎么办呢? 不需其它的配置,只须要配置一个 @FeignClient 的 url 便可,以下负载均衡