SpringCloud入门(七)

代码地址  https://github.com/springcloud-demo

目录

第一章 服务容错和Hystrix

第二章 触发降级

第三章 超时设置

第四章 探讨断路器模式

4.1 使用配置项

4.2 feign-hystrix的使用

4.3 hystrix -dashboard

4.4 Zuul超时配置

第五章 服务追踪

5.1 Sleuth

5.2 Zipkin

5.3 分布式追踪系统


第一章 服务容错和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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值