摘要:在我们前期几章节中;学习了关于整体springCloud微服务的大致要领。比如整体开发的架构布局;就算以后在企业中开发;这些作为最基本的知识点是要知道的;很多企业无非在原来的这些组件上加以封装利用;好了,今天咋们就开始学习第三主要部分—Hystrix 。
Hystrix 讲学分类:
- 服务熔断
- 服务降级
- 服务监控
一、介绍Hystrix
想知道Hystrix到底用来干什么或者解决什么问题;那就好好看一下内容:首先我们已经搭建好了通过feign访问各大子服务;也许很多初学者就已经小有成就感了;其实不然,分布式系统面临的问题;目前的开发过于简单基础;就目前而言;无论我们得消费者或者服务生产者都是依赖了:
<!--引入自定义的api通用包,可以使用Dept部门entity-->
<dependency>
<groupId>com.lp.springcloud_parent</groupId>
<artifactId>microservicecloud-api</artifactId>
<version>${project.version}</version>
</dependency>
在以后复杂的分布式体系结构中的应用程序可能会出现数十个依赖关系;每个依赖在某些时候将不可避免地失败;就比如;客户调商品;商品调订单;订单调支付;支付调库存;等等…;如果没出现任何问题;那么皆大欢喜;此时我就假如某台子服务从Eruerk宕机了;访问就被卡在宕机服务上了;不接着走了;访问一次还行;超过上万次呢;那么出现资源占用;超时;可能整个系统就得面临崩溃了;那么就得想招呗;解决问题呗;那么Hystrix它就来了;它带着它的工具包来了;是的;Hystrix就是来解决一系列某个依赖服务失败了不能用了而导致整个系统而崩溃的问题。根据以上描述;Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
二、服务熔断
根据Hystrix的描述;那么我们是不是就得让服务出现问题啊;接下来我们呢;来干点坏事;相信听到干坏事了;比听到干正事还要兴奋啊;那么接下来看看;服务调不通了;Hystrix如何进行挽救;服务熔断机制是应对雪崩效应的一种微服务链路保护机制。当某个微服务不可用或者响应时间太长时;进而熔断该节点微服务的调用,快速返回“错误”的响应信息。当检测到该节点微服务调用响应正常后恢复链路。Hystrix会监控微服务调用的状况;当失败的调用到一定阈值;缺省是5秒内20次调用失败就会穹顶熔断机制。熔断机制的注解是@HystrixCommand。写个子服务 ---- microservicecloud-privider-dept-hystrix-8001来表明带hystrix的服务生产者。在之前的microservicecloud-privider-dept-8001类似;可直接复制改名使用;修改部分如下:
第一pom文件修改部分:
增加:
<!--hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.3.1.RELEASE</version>
</dependency>
第二appliction.yml修改部分:
eureka:
client: #客户端注册进eureka服务列表内
service-url:
defaultZone: http://localhost:7001/eureka
instance:
instance-id: microservicecloud-dept-hystrix //修改服务名称即可
第三deptController修改部分:
/**
* 部门查询
* @param deptno
* @return
*/
@RequestMapping(value = "/dept/list/{deptno}",method = RequestMethod.GET)
@ResponseBody
//一旦调用服务方法失败并抛出异常错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod指定的方法
@HystrixCommand(fallbackMethod = "processHystrix_Get")
public Dept list(@Param("deptno") int deptno){
Dept dept = deptService.find(deptno);
if (dept == null) {
throw new RuntimeException("该ID:"+deptno +"没有对应的信息");
}
return dept;
}
public Dept processHystrix_Get(@Param("deptno") int deptno){
Dept dept=new Dept();
dept.setDeptno(deptno).setDname("该ID:"+deptno +"没有对应的信息,null").setDb_source("no this database in Mysql");
return dept;
}
第四修改主启动类:
@SpringBootApplication
@EnableEurekaClient /*本服务启动后会自动注册进Eureka服务列表内*/
@EnableDiscoveryClient /*开启服务发现 --*/
@EnableCircuitBreaker //对Hystrix熔断机制的支持
public class DeptPrividerHystrix8001_App {
public static void main(String[] args) {
SpringApplication.run(DeptPrividerHystrix8001_App.class,args);
}
}
测试如下:
所需开启的服务:
结果:
我数据库中没有deptno为2的部门所以抛出异常:
为大家学习提供源码:https://gitee.com/Chirhiro/springcloud-5
三、服务降级
熔断与降级是两个概念;所处理的方式也是不一样的;所谓的降级;打个比方;比如多个服务存在;在生活当中;往往有些服务访问的需求量大;有些服务访问量少;比如某天访问量大的服务撑不住了;整体资源不够了;忍痛将访问量少的服务关闭;待访问量大的服务渡过难关;然后再开启回来;这就是降级处理;那这里就是说明降了访问量少服务的级来提高访问量大的服务的资源。那么访问量少的服务是不是被关了;再去访问是不是就不能使用了;那么你就得有提示老客户啊;不然的话客户是不是生气啊;在页面有暂时繁忙或者服务已关闭等等信息啊,所以必须要有服务降级的一个处理说明啊。然后根据spring的AOP思想;来解决上面服务熔断机制的耦合;因为在上面代码控制层中做了熔断处理;从而导致熔断与控制层的一个耦合度产生;为了解耦;分离出熔断处理机制。服务降级处理又是在客户端实现完成的;与服务端无关。
解耦说明:
之前在控制层与熔断耦合调用;而在控制层也是根据调用service层的接口;如果我们对service层的接口服务熔断;就会达到解耦目的。feign调用的是公共service模块;那么我们只要在其修改:
//@FeignClient(value = "MICROSERVICECLOUD-DEPT") 上程序
@FeignClient(value = "MICROSERVICECLOUD-DEPT",fallbackFactory = DeptClientServiceFallbackFactory.class)
@Component
public class DeptClientServiceFallbackFactory implements FallbackFactory<DeptClientService> {
@Override
public DeptClientService create(Throwable throwable) {
return new DeptClientService() {
@Override
public Dept list(int deptno) {
Dept dept=new Dept();
dept.setDeptno(deptno).setDname("该ID:"+deptno +"没有对应的信息,Consumer客户端提供的降级信息,此刻服务已关闭").setDb_source("no this database in Mysql");
return dept;
}
@Override
public List<Dept> list() {
return null;
}
};
}
}
演示:
开启服务:
正常测试:
关闭8001服务测试:
四、服务监控
服务监控是什么呢?同志们;如果能够很直观的看到每个服务的状态使用率;是不是对我们系统的高可用提供一大信息啊;除了隔离依赖服务的调用以外,Hystrix还提供了准实时的调用监控(Hystrix Dashboard),Hystrix 会持续地记录所有通过Hystrix 发起的请求的执行信息,并以统计报表和图形的形式展示给用户,包括每秒执行了多少请求多少成功,多少失败等。SpringCloud也提供了Hystrix Dashboard的整合,对监控内容转化成可视化界面。
新建 microservicecloud-consumer-hystrix-dashboard
第一修改pom文件部分:
<!--hystrix与hystrix-dashboard-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.3.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
<version>1.3.1.RELEASE</version>
</dependency>
第二修改application.yml文件:
server:
port: 9002
第三构造主启动类:
@SpringBootApplication
@EnableHystrixDashboard //开启服务监控
public class DeptConsumer_Dashboard_App {
public static void main(String[] args) {
SpringApplication.run(DeptConsumer_Dashboard_App.class,args);
}
}
启动服务打开界面:
操作使用与查看:
源码如下:https://gitee.com/Chirhiro/springcloud-6