5.使用全局服务降级@DefaultProperties(defaultFallback = “”)注解解耦
可以看到fallback方法是一对一的,如果每个方法都跟一个与之匹配的fallback方法,会造成冗余,而且代码会膨胀,于是引出一个@DefaultProperties给出缺省的方法,这样没有指定的方法默认会调用@DefaultProperties中指定的方法,而指定fallback方法的还是会调用指定方法,不会调用缺省方法。这样,通用的和独享的各自分开
①修改80的controller
@DefaultProperties(defaultFallback
= "defaultFallbackMethod")
@HystrixCommand
@GetMapping(value
= "/consumer/payment/hystrix/ok/{id}")
public String
paymentInfo_OK(@PathVariable("id") Integer id
){
int a
= 1/0;
String result
= paymentHystrixService
.paymentInfo_OK(id
);
return result
;
}
public String
defaultFallbackMethod(){
return "执行了缺省方法";
}
②测试
通过测试结果可以看到,访问ok执行缺省方法,而访问timeout执行的是指定的方法。
6.通配服务降级FeignFallback
①新建实现类实现PaymentHystrixService接口
package com
.hry
.springcloud
.service
;
import org
.springframework
.stereotype
.Component
;
@Component
public class PaymentFallbackService implements PaymentHystrixService {
@Override
public String
paymentInfo_OK(Integer id
) {
return "********* PaymentFallbackService paymentInfo_OK *********";
}
@Override
public String
paymentInfo_TimeOut(Integer id
) {
return "********* PaymentFallbackService paymentInfo_TimeOut *********";
}
}
②修改PaymentHystrixService接口
在注解中添加属性
@FeignClient(value
= "CLOUD-PROVIDER-HYSTRIX-PAYMENT",fallback
= PaymentFallbackService
.class)
③恢复controller中的ok
为了演示宕机效果,我们把上一节修改的ok再改回去,把添加的内容注释掉。 类上的全局降级注解先不用管不会影响到ok了。
④测试
首先访问ok,能正常调通 关闭8001,模拟宕机情况,访问ok,此时调用了我们实现类中的方法。
7.服务熔断
总结与回顾
①服务熔断知识点
②修改8001service
新增
public String
paymentCricuitBreaker(Integer id
);
public String
paymentCircuitBreaker_fallback(Integer id
);
@HystrixCommand(fallbackMethod
= "paymentCircuitBreaker_fallback",commandProperties
= {
@HystrixProperty(name
= "circuitBreaker.enabled",value
= "true"),
@HystrixProperty(name
= "circuitBreaker.requestVolumeThreshold",value
= "10"),
@HystrixProperty(name
= "circuitBreaker.sleepWindowInMilliseconds",value
= "10000"),
@HystrixProperty(name
= "circuitBreaker.errorThresholdPercentage",value
= "60")
})
@Override
public String
paymentCricuitBreaker(Integer id
) {
if (id
< 0){
throw new RuntimeException("***id 不能为负数");
}
String simpleUUID
= IdUtil
.simpleUUID();
return Thread
.currentThread().getName()+"\t"+"调用成功,流水号:"+simpleUUID
;
}
@Override
public String
paymentCircuitBreaker_fallback(Integer id
) {
return "id 不能负数,请稍后再试,id :" +id
;
}
③修改controller
添加
@GetMapping("/payment/circuit/{id}")
public String
paymentCircuitBreaker(@PathVariable("id") Integer id
){
String result
= paymentService
.paymentCricuitBreaker(id
);
log
.info("*****result: "+result
);
return result
;
}
⑤测试
提高失败,然后正常访问发现正常访问的也出错了
⑧总结
断路器什么情况下起作用 开启或者关闭的条件
断路器打开之后
⑧服务限流
关于服务限流之后的Alibaba sentinel会详细演示。
8.Hystrix Dashboard
①创建module
②编写pom文件
<dependencies>
<dependency>
<groupId>org.springframework.cloud
</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard
</artifactId>
</dependency>
<dependency>
<groupId>com.hry.springcloud
</groupId>
<artifactId>cloud-api-commons
</artifactId>
<version>${project.version}
</version>
</dependency>
<dependency>
<groupId>org.springframework.boot
</groupId>
<artifactId>spring-boot-starter-web
</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot
</groupId>
<artifactId>spring-boot-starter-actuator
</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot
</groupId>
<artifactId>spring-boot-devtools
</artifactId>
<scope>runtime
</scope>
<optional>true
</optional>
</dependency>
<dependency>
<groupId>org.projectlombok
</groupId>
<artifactId>lombok
</artifactId>
<optional>true
</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot
</groupId>
<artifactId>spring-boot-starter-test
</artifactId>
<scope>test
</scope>
</dependency>
</dependencies>
③修改yml文件
server:
port: 9001
④创建主启动类
package com
.hry
.springcloud
;
import org
.springframework
.boot
.SpringApplication
;
import org
.springframework
.boot
.autoconfigure
.SpringBootApplication
;
import org
.springframework
.cloud
.netflix
.hystrix
.dashboard
.EnableHystrixDashboard
;
@SpringBootApplication
@EnableHystrixDashboard
public class HystrixDashBoardMain9001 {
public static void main(String
[] args
) {
SpringApplication
.run(HystrixDashBoardMain9001
.class, args
);
}
}
⑤修改8001
(1)确保8001的pom文件中有actuator坐标
<dependency>
<groupId>org.springframework.boot
</groupId>
<artifactId>spring-boot-starter-actuator
</artifactId>
</dependency>
(2)在主启动类有@EnableCircuitBreaker注解
(3)主启动添加
@Bean
public ServletRegistrationBean
getServlet(){
HystrixMetricsStreamServlet streamServlet
= new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean
= new ServletRegistrationBean(streamServlet
);
registrationBean
.setLoadOnStartup(1);
registrationBean
.addUrlMappings("/hystrix.stream");
registrationBean
.setName("HystrixMetricsStreamServlet");
return registrationBean
;
}
⑤测试
启动9001 访问 在这里能看到circuit的开关状态。
9.总结
官网的图