一、概念部分
1 .什么是保险丝?
熔断是指断开与服务器的连接。 保险丝在服务不可用时主动断开,以免引起进一步的雪崩效应。 他是保护服务高可用性的最后一道防线。
2 .为什么需要保险丝?
为了保证服务的高可用性,首先考虑的是服务群集,但群集并不能完全保证服务的高可用性
如果某个服务发生故障,负载平衡时可能会多次调用,调用方无法得到调用结果,因此可能会发生请求超时或其他异常。 在这种情况下,如果服务不快速熔断,调用发生故障的服务节点的调用方就会增加,从而可能导致大量调用失败或级联故障雪崩。
在分布式系统中,通常有很多服务呼叫,如服务呼叫关系: AB-C-D。
基本服务故障可能会导致级联故障,如下图所示。
需要一种熔断机制,在某个节点发生故障时,可以迅速进行熔断处理,避免更多服务调用失败。
二、代码实现
服务熔断
1 .创建项目客户服务, 在build.gradle上显示依赖于dependencies { compile (org.spring framework.cloud : spring-cloud-starter-eureka ' )的compile () 开始-功能) ) compile ) org.spring framework.cloud 3330 compile (org.spring framework.cloud : spring-cloud-stoud
测试编译(org.spring framework.boot : spring-boot-starter-test ' )
}
创建application.yml#spring配置spring:
APP 3: # APP名称(服务调用方) )
name:consumer-service#服务器配置服务器: #端口
port:7000#配置服务注册发现eureka:
客户端: #配置服务注册中心地址
服务-URL:
efault zone :https://www.API boot.cn/eureka # feign远程呼叫配置feign:
hystrix:#开放式熔断
启用:真
3 .添加启动类注释/**
*服务调用方
* @启用客户端发现
*@enablefeignclientsfeign打开远程呼叫
* @打开*@EnableHystrixDashboard熔断监视操控板
* @打开*@EnableCircuitBreaker断路器
//@ springbootapplication @ enablediscoveryclient @ enablefeignclients @ enablehystrixdashboard @ enablecircuitbreakerpublicard
spring application.run (consumerserviceapplication.class,args );
}
}
4 .远程呼叫接口HelloRemote.java/**
*feign远程呼叫接口
*FeignClient注释的name属性值必须描述服务提供商在注册中心注册的服务名称
*FeignClient注释的fallback属性值表示远程调用失败时的回调类
*/@ feign client (name=' producer-service ',fallback=helloremotefallback.class ) publicinterfacehelloremote(/* )
*远程调用方法
*@paramname名称
*@return远程呼叫结果
*/
@requestmapping(value='/hello ' ) string hello (request param ) value='name ' ) Stringname );
}
5 .远程回调类HelloRemoteFallback.java/**
*熔断回调类
/p>* 继承feign远程调用接口,并在实现方法中输出回调的信息
*/@Componentpublic class HelloRemoteFallback implements HelloRemote { /**
* 远程调用失败,将会回调该方法
* @param name 名称
* @return 自定义返回信息
*/
@Override
public String hello(@RequestParam(value = "name") String name) { return "hello " + name + ", this message is failed";
}
}
6.创建控制器类 HelloController.java/**
* Hello控制器 测试远程调用接口
* 将远程调用接口注入,并调用远程方法
*/@RestControllerpublic class HelloController { @Autowired
private HelloRemote helloRemote; // 远程调用接口
/**
* 输出hello方法
* @param name 名称
* @return 远程调用返回值
*/
@RequestMapping(value = "/hello/{name}") public String hello(@PathVariable(value = "name") String name){ return helloRemote.hello(name);
}
}
发现我们的服务consumer-service已经成功运行起来并且注册到了服务注册中心,
consumer-service所调用的远程服务 producer-service我也已经提前运行起来了。
我们通过consumer-service服务 远程调用了producer-service服务,并且成功响应。
接下来我们手动停止服务提供者 producer-service服务,假装服务故障。
我们再次访问服务调用者提供的远程调用方法 https://consumer.apiboot.cn/hello/lanshiqin
发现远程调用不成功,但是不会因为调用不成功导致服务异常,而是熔断了远程服务的连接并以友好的方式触发了我们的远程调用失败时指定的本地回调方法,输出了自定义信息。证明熔断成功。
熔断监控
由于我们为服务消费者添加了熔断监控并且开启了服务,所以我们可以监控服务消费者项目 consumer-service 的熔断信息
打开浏览器输入地址: https://consumer.apiboot.cn/hystrix
浏览器返回了刺猬图标的界面,我们可以通过他来监控服务调用的成功率情况。
Hystrix Dashboard 面板的地址栏里输入,点击 Monitor Stream,进入监控的图表页面。
一开始该页面的Circuit页卡会显示Loading…,我们只要访问以下服务消费者的地址 https://consumer.apiboot.cn/hello/lanshiqin 监控面板即可显示熔断信息与图表详情。
下图为服务提供者正常被服务消费者调用的时候的熔断信息
我们把服务提供者服务关闭,让服务消费者无法正常远程调用到服务,然后查看服务消费者的熔断信息,发现100.0%的调用失败,因为我们没有做服务提供者集群,所以唯一的服务提供者被关闭后,远程调用将100%调用失败。
到此,我们的单个应用的熔断监控器已经成功的监控到远程服务的调用情况。
作者:轻松的网络
链接:https://www.jianshu.com/p/e8a477a051d8