首页 > 其他分享 >SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控

SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控

时间:2022-10-31 13:42:24浏览次数:74  
标签:服务 hystrix Hystrix SpringCloud public 8001 dept Dashboard id


文章目录

  • ​​一、概念:服务雪崩​​
  • ​​二、什么是Hystrix​​
  • ​​三、服务熔断​​
  • ​​概述​​
  • ​​实验​​
  • ​​第一步:创建服务提供者springcloud-provider-dept-hystrix-8001​​
  • ​​第二步:修改pom.xml​​
  • ​​第三步:修改application.yml​​
  • ​​第四步:修改DeptController​​
  • ​​第五步:修改主类​​
  • ​​四、服务降级​​
  • ​​第一步:在springcloud-api项目的service包下建立DeptClientServiceFallbackFactory​​
  • ​​第二步:配置service调用​​
  • ​​第三步:yml开启降级​​
  • ​​第四步:测试​​
  • ​​总结​​
  • ​​五、Dashboard流监控​​
  • ​​实验​​
  • ​​第一步:创建一个maven项目springcloud-consumer-hystrix-dashborad​​
  • ​​第二步:添加依赖​​
  • ​​第三步:配置yml​​
  • ​​第四步:配置主类DeptConsumerDashboard_9001​​
  • ​​第五步:配置服务提供者的依赖​​
  • ​​第六步:然后启动9001项目,直接访问http://localhost:9001/hystrix​​
  • ​​第七步:写服务提供者的主类​​

一、概念:服务雪崩

SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_dashboard


SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_ide_02


SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_spring_03


SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_spring_04

二、什么是Hystrix

SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_spring cloud_05


SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_spring_06


官网资料

​https://github.com/Netflix/Hystrix/wiki​

三、服务熔断

概述

SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_spring cloud_07

SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_云原生_08

实验

第一步:创建服务提供者springcloud-provider-dept-hystrix-8001

第二步:修改pom.xml

<!--hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>

第三步:修改application.yml

instance:
instance-id: springcloud-provider-dept-hystrix-8001 #修改Eureka上的默认描述信息
prefer-ip-address: true # 为true可以显示服务的ip地址

第四步:修改DeptController

在方法上加入@HystrixCommand即可,这里做一个演示,就写一个方法做测试

//提供Restfull服务!!
@RestController
public class DeptController {

@Autowired
private DeptServiceImpl deptService;


@GetMapping("/dept/get/{id}")
@HystrixCommand(fallbackMethod = "hystrixGetDept") //失败了就会调用下面的这个备选方案
public Dept getDept(@PathVariable("id") Long id) {
Dept dept = deptService.queryById(id);
if (dept == null) {
throw new RuntimeException("id-->" + id + "不存在该用户,或者信息无法找到");
}
return dept;
}

//备选方案
public Dept hystrixGetDept(@PathVariable("id") Long id) {
return new Dept()
.setDeptno(id)
.setDname("id=>" + id + "没有对应的信息,null---@hystrix")
.setDb_source("not this database in MySQL");
}

}

第五步:修改主类

然后在主启动类上添加对熔断的支持 启用断路器DeptProviderHystrix_8001

//启动类
@SpringBootApplication
@EnableEurekaClient //在服务启动后自动注册到Eureka中
@EnableCircuitBreaker //添加对熔断的支持 启用断路器
public class DeptProviderHystrix_8001 {
public static void main(String[] args) {
SpringApplication.run(DeptProviderHystrix_8001.class, args);
}
}

启动集群,启动springcloud-provider-dept-hystrix-8001,启动80项目(普通的,不是feign的80项目)

访问正常请求http://localhost/consumer/dept/get/1

SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_ide_09


访问不正常请求,http://localhost/consumer/dept/get/10不会显示500错误,而是显示我们备选方案的返回结果

SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_云原生_10

四、服务降级

服务降级,当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。比如电商平台,在针对618、双11等高峰情形下采用部分服务不出现或者延时出现的情形。

服务熔断:针对服务器的,某个服务连接超时或者异常的时候,引起熔断

服务降级:针对客户端,从整体网站请求负载考虑,当某个服务熔断或则关闭时,服务不在被调用,此时在客户端,我们可以准备一个FallbackFactory,返回一个默认的值,整体的服务水平下降了,好歹能用,比直接挂掉强

第一步:在springcloud-api项目的service包下建立DeptClientServiceFallbackFactory

DeptClientServiceFallbackFactory

//服务降级
@Component
//失败回调
public class DeptClientServiceFallbackFactory implements FallbackFactory {

@Override
public DeptClientService create(Throwable throwable) {
return new DeptClientService() {
@Override
public Dept queryById(Long id) {
return new Dept()
.setDeptno(id)
.setDname("id=>" + id + ",没有对应的信息,客户端提供了降级的信息,这个服务现在已经被关闭了")
.setDb_source("没有数据");
}

@Override
public boolean addDept(Dept dept) {
//...
return false;
}

@Override
public List<Dept> queryAll() {
//...
return null;
}

};
}
}

SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_ide_11


然后怎么去体现它呢?还是一样的,在 springcloud-api 项目的DeptClientService接口上添加即可

第二步:配置service调用

@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT", fallbackFactory = DeptClientServiceFallbackFactory.class)

SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_dashboard_12

第三步:yml开启降级

SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_dashboard_13

第四步:测试

启动7001项目、启动8001项目(正常的,不是Hystrix的那个)、然后再启动feign的80项目

正常访问 http://localhost/consumer/dept/get/1

SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_spring_14


访问一个不存在的数据

SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_ide_15

把8001服务提供者关闭,再次访问http://localhost/consumer/dept/get/1

SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_云原生_16


说明了什么?说明了服务熔断是被动的,服务降级是手动的,但是开启服务降级后,没有关闭服务,访问一个不存在的数据,也会返回一个客户端自定义的返回结果,当把服务关闭后,访问任何请求都是有客户端自定义的结果。

总结

SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_dashboard_17

五、Dashboard流监控

SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_spring cloud_18

实验

客户端的应用

第一步:创建一个maven项目springcloud-consumer-hystrix-dashborad

SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_云原生_19

第二步:添加依赖

<dependencies>
<!--dashboard监控页面-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!--Eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<!--hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<!--Ribbon-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<!--消费者只需要 实体类 + Web 依赖即可-->
<dependencies>
<dependency>
<groupId>com.wu</groupId>
<artifactId>springcloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--热部署工具-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>

第三步:配置yml

server:
port: 9001
hystrix:
dashboard:
proxy-stream-allow-list: "*"

第四步:配置主类DeptConsumerDashboard_9001

@SpringBootApplication
//服务端必须都要有监控依赖actuator
@EnableHystrixDashboard //开启监控页面 http://localhost:9001/hystrix
public class DeptConsumerDashboard_9001 {
public static void main(String[] args) {
SpringApplication.run(DeptConsumerDashboard_9001.class, args);
}
}

第五步:配置服务提供者的依赖

SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_dashboard_20

第六步:然后启动9001项目,直接访问http://localhost:9001/hystrix

SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_spring_21


现在监控页面搭载完成

我们要如何监控呢?监控什么呢?

我们监控的是实现了熔断支持的类(主启动类上加了@EnableCircuitBreaker注解),这里我们刚好有一个项目springcloud-provider-dept-hystrix-8001,还有一个前提,服务类必须添加actuator依赖

第七步:写服务提供者的主类

然后我们修改springcloud-provider-dept-hystrix-8001项目的主启动类,添加一个Servlet,为了配合监控使用

//启动类
@SpringBootApplication
@EnableEurekaClient //在服务启动后自动注册到Eureka中
@EnableCircuitBreaker //添加对熔断的支持 启用断路器
public class DeptProviderHystrix_8001 {
public static void main(String[] args) {
SpringApplication.run(DeptProviderHystrix_8001.class, args);
}

//为了配合监控使用
//增加一个Servlet
@Bean
public ServletRegistrationBean hystrixMetricsStreamServlet() {
ServletRegistrationBean registrationBean = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
registrationBean.addUrlMappings("/actuator/hystrix.stream");
return registrationBean;
}
}

SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_ide_22

启动7001项目,启动9001项目,启动hystrix的8001项目,然后访问http://localhost:8001/dept/get/1,有返回数据即可

然后访问http://localhost:8001/actuator/hystrix.stream,会得到一些数据流-

SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_spring cloud_23


然后http://localhost:9001/hystrix,填入以下信息即可

SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_spring_24

SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_dashboard_25


SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_ide_26


SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_云原生_27


SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_dashboard_28


SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_spring_29


SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_云原生_30


SpringCloud学习八:Hystrix服务熔断、服务降级、Dashboard流监控_ide_31


标签:服务,hystrix,Hystrix,SpringCloud,public,8001,dept,Dashboard,id
From: https://blog.51cto.com/u_15854304/5809334

相关文章