SpringCloud学习资料汇总超级棒的
如上是我在看文章时忽然看到的一个很好的学习SpringCloud的网站
SpringClound——微服务概述——史上最烂
SpringClound——SpringClound入门概述——史上最烂
SpringCloud——Eureka——史上最基本
SpringClound——Ribbon负载均衡——史上最烂系列
SpringClound——Feign
SpringClound——Hystrix断路器
多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”.
对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒钟内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障。这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统。
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-hystrixartifactId>
dependency>
熔断打开:
请求不再进行调用当前服务。内部设置时钟-般为MTTR (平均故障处理时间)。当打开时长达到所设时钟则进入半熔断状态
熔断关闭:
熔断关闭不会对服务进行熔断
熔断半开:
部分请求根据规则调用当的服务,如果请求成功目符合规则则认为当前服务恢复正常,关闭熔断
1:当满足一定的阀值的时候(默认10秒内超过20个请求次数)
2:当失败率达到一定的时候(默认10秒内超过50%的请求失败)
3:到达以上阀值,断路器将会开启
4:当开启的时候,所有请求都不会进行转发
5:一段时间之后(默认是5秒),这个时候断路器是半开状态,会让其中一个请求进行转发。如果成功,断路器会关闭,若失败,继续开启。
如下报错,就会调用注解@HystrixCommand,断路器就起作用了
涉及到断路器的三个重要参数:快照时间窗、请求总数阀值、错误百分比阀值。
1:快照时间窗(sleepWindowInMilliseconds):断路器确定是否打开需要统计-些请求和错误数据,而统计的时间范围就是快照时间窗,默认为最近的10秒。
2:请求总数阀值(requestVolumeThreshold):在快照时间窗内,必须满足请求总数阀值才有资格熔断。默认为20,意味着在10秒内,如果该hystrix命令的调用次数不足20次,即使所有的请求都超时或其他原因失败,断路器都不会打开。
3:错误百分比阀值(errorThresholdPercentage):当请求总数在快照时间窗内超过了阀值,比如发生了30次调用,如果在这30次调用中,有15次发生了超时异常,也就是超过50%的错误百分比,在默认设定50%阀值情况下,这时候就会将断路器打开。
// ================= 服务熔断 ==================
@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") // 失败率达到多少后跳闸
})
public String paymentCircuitBreaker(Integer id) {
if (id < 0) {
throw new RuntimeException("******** id 不能为负数 *********");
}
String simpleUUID = IdUtil.simpleUUID();
return Thread.currentThread().getName() + "\t" + "调用成功, 流水号: " + simpleUUID;
}
public String paymentCircuitBreaker_fallback(Integer id) {
return "******** id 不能为负数 请稍后再试 o(╥﹏╥)o *********";
}
DeptController.java
@RestController
public class DeptController
{
@Autowired
private DeptService service;
@Autowired
private DiscoveryClient client;
@RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)
//一旦调用服务方法失败并抛出了错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法
@HystrixCommand(fallbackMethod = "processHystrix_Get")
public Dept get(@PathVariable("id") Long id)
{
Dept dept = this.service.get(id);
if (null == dept) {
throw new RuntimeException("该ID:" + id + "没有没有对应的信息");
}
return dept;
}
public Dept processHystrix_Get(@PathVariable("id") Long id)
{
return new Dept().setDeptno(id).setDname("该ID:" + id + "没有没有对应的信息,null--@HystrixCommand")
.setDb_source("no this database in MySQL");
}
当输入地址查询的时候,如果传进来的id,找不到,就会抛出异常,然后会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法,如下
关于服务降级的理论知识
程序运行异常,超时,服务熔断触发服务降级,线程池打满都会导致服务降级
OrderHystrixController.java
全局服务降级
@RestController
@Slf4j
@DefaultProperties(defaultFallback = "paymentGlobalFallBack")
public class OrderHystrixController {
@Resource
private PaymentHystrixService paymentHystrixService;
@GetMapping("/consumer/payment/hystrix/ok/{id}")
public String ok(@PathVariable("id") Integer id) {
return paymentHystrixService.paymentInfo_OK(id);
}
@GetMapping("/consumer/payment/hystrix/timeout/{id}")
@HystrixCommand
public String timeout(@PathVariable("id") Integer id) {
return paymentHystrixService.paymentInfo_TIMEOUT(id);
}
// 下面是全局fallback方法
public String paymentGlobalFallBack() {
return "全局异常信息处理,请稍后再试o(╥﹏╥)o";
}
}
pom.xml
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-hystrixartifactId>
dependency>
通配服务降级
PaymentFallbackService .java
@Component
public class PaymentFallbackService implements PaymentHystrixService {
@Override
public String paymentInfo_OK(Integer id) {
return "-------PaymentFallbackService fall back paymentInfo_OK, o(╥﹏╥)o";
}
@Override
public String paymentInfo_TIMEOUT(Integer id) {
return "-------PaymentFallbackService fall back paymentInfo_TIMEOUT, o(╥﹏╥)o";
}
}
PaymentHystrixService .interface
@Component
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT", fallback = PaymentFallbackService.class)
public interface PaymentHystrixService {
@GetMapping("/payment/hystrix/ok/{id}")
String paymentInfo_OK(@PathVariable("id") Integer id);
@GetMapping("/payment/hystrix/timeout/{id}")
String paymentInfo_TIMEOUT(@PathVariable("id") Integer id);
监控(Hystrix Dashboard)的创建步骤
1:创建如下工程
2:pom.xml
<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.0modelVersion>
<parent>
<groupId>com.atstudying.springcloundgroupId>
<artifactId>microservicespringcloundartifactId>
<version>0.0.1-SNAPSHOTversion>
parent>
<artifactId>microservicecloud-consumer-hystrix-dashboardartifactId>
<dependencies>
<dependency>
<groupId>com.atstudying.springcloundgroupId>
<artifactId>microserviceclound-apiartifactId>
<version>${project.version}version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>springloadedartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-eurekaartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-ribbonartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-configartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-feignartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-hystrixartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-hystrix-dashboardartifactId>
dependency>
dependencies>
project>
3:application.yml
server:
port: 9001
4:DeptConsumer_DashBoard_App.java
@SpringBootApplication
@EnableHystrixDashboard
public class DeptConsumer_DashBoard_App
{
public static void main(String[] args)
{
SpringApplication.run(DeptConsumer_DashBoard_App.class, args);
}
}
5:测试
熔断监控面板(Hystrix Dashboard)
总结:七色,一圈,一线
Hystrix 工作流程