SpringCloud学习笔记8——初级篇之服务降级

    技术2022-08-16  88

    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; } /** * 缺省方法 * @return */ 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> <!-- hystrix --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> </dependency> <!--引入自定义的api通用包 可以使用公用的entities--> <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)主启动添加
    /** * 解决springboot升级后的坑 不配置访问会报错Unable to connect to Command Metric Stream. * @return */ @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.总结

    官网的图

    Processed: 0.021, SQL: 9