概述
先修课:#熔断器、断路器:Hystrix EnableDiscoveryClient EnableCircuitBreaker SpringCloudApplication @FDDLC
一、概念
1、服务熔断
假设A服务调用B服务,当B服务出现问题时,A服务也能兼容应对,就叫服务熔断。
2、服务降级
出现服务熔断时,A服务调用一个回退方法响应给用户,就叫服务降级。
二、超时熔断
Hystrix默认超时时间是1000毫秒。如果超时未响应,则触发熔断。
下面奉上一个超时的案例:
1、provider:
@RequestMapping("/hystrix")
public String hystrix() throws Exception{
Thread.sleep(10000);
return "I'm from the provider. If you can see me, it means the connection works well.";
}
2、consumer:
@RequestMapping("/hystrix")
//timeoutInMilliseconds:设置熔断超时的时间
@HystrixCommand(fallbackMethod = "fallbackMethod",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "8000")})
public String hystrix(){
return restTemplate.getForObject("http://provider/hystrix", String.class);
}
//注意:此方法不用加注解,返回值可以呈现给用户!
public String fallbackMethod(){
return "I'm the fallbackMethod in consumer";
}
3、请求:
三、provider自己异常触发的熔断
1、provider:
@RequestMapping("/hystrix")
public String hystrix() throws Exception{
//Thread.sleep(10000);
return "I'm from the provider. If you can see me, it means the connection works well.";
}
2、consumer:
@RequestMapping("/hystrix")
//timeoutInMilliseconds:设置熔断超时的时间
@HystrixCommand(fallbackMethod = "fallbackMethod",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "2000")})
public String hystrix(){
int i=1/0;
return restTemplate.getForObject("http://provider/hystrix", String.class);
}
/* //注意:此方法不用加注解,返回值可以呈现给用户!
public String fallbackMethod(){
return "I'm the fallbackMethod in consumer";
}*/
//注意:此方法不用加注解,返回值可以呈现给用户!
public String fallbackMethod(Throwable throwable){
return "I'm the fallbackMethod in consumer。"+throwable.getMessage();
}
3、请求:
四、provider异常触发的熔断
1、provider:
@RequestMapping("/hystrix")
public String hystrix() throws Exception{
//Thread.sleep(10000);
int i=1/0;
return "I'm from the provider. If you can see me, it means the connection works well.";
}
2、consumer:
@RequestMapping("/hystrix")
//timeoutInMilliseconds:设置熔断超时的时间
@HystrixCommand(fallbackMethod = "fallbackMethod",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "2000")})
public String hystrix(){
//int i=1/0;
return restTemplate.getForObject("http://provider/hystrix", String.class);
}
/* //注意:此方法不用加注解,返回值可以呈现给用户!
public String fallbackMethod(){
return "I'm the fallbackMethod in consumer";
}*/
//注意:此方法不用加注解,返回值可以呈现给用户!
public String fallbackMethod(Throwable throwable){
return "I'm the fallbackMethod in consumer。"+throwable.getMessage();
}
3、直接访问provider:
4、consumer调用provider:
说明:发生异常后,回退方法中的Throwable参数会被封装相关的异常信息。
五、发生异常不熔断,直接返回异常给用户:自己的异常或者服务提供者的异常均可!
下面指定所有异常都不熔断,当然,也可以指定某种特定异常:
@RequestMapping("/hystrix")
//timeoutInMilliseconds:设置熔断超时的时间
@HystrixCommand(fallbackMethod = "fallbackMethod", ignoreExceptions = Exception.class,commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "2000")})
public String hystrix(){
//int i=1/0;
return restTemplate.getForObject("http://provider/hystrix", String.class);
}
/* //注意:此方法不用加注解,返回值可以呈现给用户!
public String fallbackMethod(){
return "I'm the fallbackMethod in consumer";
}*/
//注意:此方法不用加注解,返回值可以呈现给用户!
public String fallbackMethod(Throwable throwable){
return "I'm the fallbackMethod in consumer。"+throwable.getMessage();
}
结果:
六、自定义熔断:HystrixCommand
1、provider:
@RequestMapping("/hystrix")
public String hystrix() throws Exception{
//Thread.sleep(10000);
//int i=1/0;
return "I'm from the provider. If you can see me, it means the connection works well.";
}
2、在consumer中自定义HystrixCommand:
package cn.consumer.config;
import com.netflix.hystrix.HystrixCommand;
import org.springframework.web.client.RestTemplate;
//注意:有两个HystrixCommand:一个是注解,一个是抽象类。千万不要导错了包!
public class MyHystrixCommand extends HystrixCommand<String> {
private RestTemplate restTemplate;
public MyHystrixCommand(Setter setter,RestTemplate restTemplate) {
super(setter);
this.restTemplate=restTemplate;
}
@Override
protected String run() throws Exception {
return restTemplate.getForObject("http://provider/hystrix", String.class);
}
@Override
protected String getFallback() {
return "getFallback()";
}
}
3、在consumer的controller中使用HystrixCommand:
//自定义熔断
@RequestMapping("/myhystrix")
public String myhystrix(){
MyHystrixCommand myHystrixCommand=new MyHystrixCommand(
com.netflix.hystrix.HystrixCommand.Setter.withGroupKey(
HystrixCommandGroupKey.Factory.asKey("")
), restTemplate);
return myHystrixCommand.execute();
}
4、结果:
无异常时:(把 int i = 1/0 注释掉)
发生异常时:(放开 int i = 1/0 的注释)
最后
以上就是超级香菇为你收集整理的#Hystrix:服务熔断、服务降级 #自定义熔断: @FDDLC的全部内容,希望文章能够帮你解决#Hystrix:服务熔断、服务降级 #自定义熔断: @FDDLC所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复