结合Feign 使用
1.A服务通过B服务的唯—标识,从Nacos获取到可调用列表。
2.使用feigh中的Http发起远程请求。
3.超过默认配置的时限,抛出异常,结束该线程。
调用方
依赖
<!-- 熔断降级的依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
//开启断路器的界面(调用方)
对Feign 中的clients文件的ProducerController进行改造
package com.james.clients; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping; /** * name: 被调方的唯一标识 * path: 被调方的controller层的路径 */ @FeignClient(name = "dashan-first",path = "/user",fallback = ConsumerClientFallback.class) public interface ConsumerClient { /** * feignClient中的方法与被调方要保持完全一致 * 返回值,注解,路径,参数,方法名 一致 * @return */ @RequestMapping("/first") public String first(); }
import org.springframework.stereotype.Component; @Component public class ConsumerClientFallback implements ConsumerClient { @Override public String first() { return "被调方不可以用了,请稍后再次尝试"; } }
ribbon:
#设置超时时间为5秒
ConnectTimeout: 5000
ReadTimeout: 5000
#feign开启熔断 默认是 false
feign:
hystrix:
enabled: true
#配置hystrix的默认超时时长.默认为1秒,当1秒钟被调方没有返回结果内容,则直接进行熔断处理
hystrix:
command:
default: #default全局有效,service id指定应用有效
execution:
timeout:
enabled: true
isolation:
thread:
# 被调方最大超时的时间
timeoutInMilliseconds: 5000
1、针对于被调方的服务已经出现了问题,例如调用了10词,8都出现了问题。那么我们认为被调方的接口是不稳定的,后续请求我们应该直接降级掉,不在尝试继续请求真正的接口。注这个时候我们就可以开启断路器,后续的请求不再真正的访问:口,而是直接降级。注意断路器开启后,是可以进行自动状态变换。断路器有三种状态:
1.close.
2.open。
3.halfopen(半开)
1.添加依赖
<!-- 熔断降级的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<!-- 断路器的管理界面--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> </dependency>
#允许dashboard访问的内容 注意 hystrix 2.0版本以上进行开放
hystrix:
dashboard:
proxy-stream-allow-list: "*"
#配置允许访问所有的接口路径内容
management:
endpoints:
web:
exposure:
include: "*"
@RequestMapping("/first")
//1.当该接口出现异常,走的降级方法 注意:降级方法要与本方法的返回值以及参数保持一致
//2. 当该接口的处理速度过慢,也需要走预定好的退路方法。使用的是tomcat的信号量来进行管理每个线程的超时时间
@HystrixCommand(fallbackMethod = "firstFallback",
commandProperties = {
//开启tomcat的线程
@HystrixProperty(name = "execution.isolation.strategy",value = "THREAD"),
//设置每个线程的最大的超时时间
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000"),
//配置开启断路器
@HystrixProperty(name = "circuitBreaker.enabled",value = "true"),
//代表该接口如果出现异常的次数达到10次,则开启断路器
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "4"),
//代表总请求数达到50%的请求出现异常,则开启断路器
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "50"),
//代表断路器多少秒后更改我们的断路器的状态,由 open状态改为halfopen状态
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "5000")
})
public String first() throws InterruptedException {
//休眠时间
// Thread.sleep(2990);
return "成功" + name +":"+port;
}
public String firstFallback(){
return name +":"+port+"接口异常!";
}
import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet; import javax.servlet.annotation.WebServlet; @WebServlet("/hystrix.stream") public class HystrixServlet extends HystrixMetricsStreamServlet { }
@SpringBootApplication @EnableDiscoveryClient //被调方的降级处理 @EnableHystrix //开启断路器的界面 @EnableHystrixDashboard //扫描我们自己配置的servlet路径 @ServletComponentScan("com.qf.config") public class SpringCloudConsumerApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudConsumerApplication.class); } }
浙公网安备 33010602011771号