代码地址 https://github.com/springcloud-demo
目录
第一章 服务容错和Hystrix
在微服务架构层中,通常会有多个服务相互调用,如果有某个服务不可用,导致近邻故障,造成整个系统不可用的情况称为雪崩效应.
比如A会调用B服务,B会调用C服务,假如B调用C服务的时候因为某种原因调用不成功,B就会一直重试同步等待造成资源耗尽,结果B服务也不可用,紧接着因为A调用B,A也不可用了,A,B,C都不可用,这样最终会导致A,B,C都不可用.
SpringCloud中防止雪崩的利器就是Hystric,基于netflix对应的Hystrix,Hystrix的中文意思是豪猪,
SpringCloud具备服务降级,服务熔断,依赖隔离,监控等强大的功能.
服务降级:双十一来的时候某宝会显示哎呦欸,挤爆了,或者是某些APP会提示网络开小差了,请稍后再试,服务降级的指导思想是要区分业务,具体就是要优先核心服务,非核心服务不可用或弱可用,站在整个系统来看,比如我们的点餐业务突然涌入大量流量,服务器资源就这么多,那我们应优先选择商品,订单,支付服务,另外比如广告积分属于非核心服务,这种业务暂时不提供服务或者提供部分服务.
在某个具体服务中,比如商品服务,可能买家查询服务优先保护它的可用,卖家查询可能就是非核心服务,可以区别对待.
在用的层面上来说,Hystric的服务降级是非常简单,概括来讲,通过HystricCommand注解指定,在fallbackMethod(回退函数)中具体实现降级逻辑即可.
第二章 触发降级
订单去调用商品服务,当你想调用的目标服务,即server端不能正常提供服务的时候,会发生降级.
打开order项目,实现订单服务调用商品服务.
@RestController
public class HystrixController {
@HystrixCommand(fallbackMethod = "fallback")
@GetMapping("/getProductInfoList")
public String getProductInfoList(){
RestTemplate restTemplate = new RestTemplate();
return restTemplate.postForObject("http://127.0.0.1:8082/product/listForOrder",
Arrays.asList("157875196366160022"),
String.class);
}
private String fallback(){
return "太拥挤了,请稍后再试~~";
}
}
在application中加上注解@EnableCircuitBreaker
我这里加的SpringCloudApplication等于注释中的三个注解.
/*@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker*/
@EnableFeignClients(basePackages = "com.imooc.product.client")
@SpringCloudApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
当然降级也不一定是用在这种场景,我们也可以用到自己的服务降级,当并发太高,或者服务连接数太多了,主动抛出异常,即可实现服务降级.
这里检测到异常,直接会运行对应的fallback函数.
@RestController
public class HystrixController {
@HystrixCommand(fallbackMethod = "fallback")
@GetMapping("/getProductInfoList")
public String getProductInfoList(){
// RestTemplate restTemplate = new RestTemplate();
// return restTemplate.postForObject("http://127.0.0.1:8082/product/listForOrder",
// Arrays.asList("157875196366160022"),
// String.class);
// if(服务太多,并发太高)
throw new RuntimeException("发生异常了");
}
private String fallback(){
return "太拥挤了,请稍后再试~~";
}
}
第三章 超时设置
我刚才写了一个注解@HystrixCommand(fallbackMethod = "fallback")就调了一个fallback方法,如果有很多个要写很多,这里提供了一个@DefaultProperties(defaultFallback = "defaultFallback").
@RestController
@DefaultProperties(defaultFallback = "defaultFallback")
public class HystrixController {
@HystrixCommand
@GetMapping("/getProductInfoList")
public String getProductInfoList(){
throw new RuntimeException("发生异常了");
}
private String defaultFallback(){
return "默认提示:太拥挤了,请稍后再试~~";
}
}
更多的场景要注意服务的访问时间,也就是超时的问题.
我们在product服务中设置睡眠2s.这样虽然order服务能访问到product服务,但因为等待时间过长,所以还是触发了服务降级.
public List<ProductInfoOutput> listForOrder(@RequestBody List<String> productList){
log.info("商品查询服务开始");
try {
Thread.sleep(2000);
} catch (InterruptedException e){
e.printStackTrace();
}
return productService.findList(productList);
}
我们可以配置超时时间,来避免这种情况.这样即使是2s也可以访问.
@RestController
@DefaultProperties(defaultFallback = "defaultFallback")
public class HystrixController {
@Hystrix