01 微服务高可用技术
对于Hystrixx相关的内容,在前面《互联网并发与安全专题》有提及过,有兴趣的同学可以去参考下:
1.1 服务高可用手段
大型复杂的分布式系统中,高可用相关的技术架构非常重要。
高可用架构非常重要的一个环节,就是如何将分布式系统中的各个服务打造成高可用的服务,从而足以应对分布式系统环境中的各种各样的问题,,避免整个分布式系统被某个服务的故障给拖垮,比如:
- 服务间的调用超时
- 服务间的调用失败
要解决这些棘手的分布式系统可用性问题,就涉及到了高可用分布式系统中的很多重要的技术,包括:
- 资源隔离
- 限流与过载保护
- 熔断
- 优雅降级
- 容错
- 超时控制
- 监控运维
1.2 服务降级、熔断、限流概念
----- 服务学崩效应:
- 服务雪崩效应产生与服务堆积在同一个线程池中,因为所有的请求都是同一个线程池进行处理,这时候如果在高并发情况下,所有的请求全部访问同一个接口,这时候可能会导致其他服务没有线程进行接受请求,这就是服务雪崩效应效应。
----- 服务降级:
- 在高并发情况下,防止用户一直等待,使用服务降级方式(直接返回一个友好的提示给客户端,调用fallBack方法)
----- 服务熔断:
- 熔断机制目的为了保护服务,在高并发的情况下,如果请求达到一定极限(可以自己设置阔值)如果流量超出了设置阈值,让后直接拒绝访问,保护当前服务。使用服务降级方式返回一个友好提示,服务熔断和服务降级一起使用。
----- 服务隔离:
- 因为默认情况下,只有一个线程池会维护所有的服务接口,如果大量的请求访问同一个接口,达到tomcat 线程池默认极限,可能会导致其他服务无法访问。
- 解决服务雪崩效应:使用服务隔离机制(线程池方式和信号量),使用线程池方式实現隔离的原理: 相当于每个接口(服务)都有自己独立的线程池,因为每个线程池互不影响,这样的话就可以解决服务雪崩效应。
- 线程池隔离:每个服务接口,都有自己独立的线程池,每个线程池互不影响。
- 信号量隔离:使用一个原子计数器(或信号量)来记录当前有多少个线程在运行,当请求进来时先判断计数器的数值,若超过设置的最大线程个数则拒绝该请求,若不超过则通行,这时候计数器+1,请求返 回成功后计数器-1。
----- 服务限流:
- 服务限流就是对接口访问进行限制,常用服务限流算法令牌桶、漏桶。计数器也可以进行粗暴限流实现。
02 Hystrix
Hystrix是国外知名的视频网站Netflix所开源的非常流行的高可用架构框架。Hystrix能够完美的解决分布式系统架构中打造高可用服务面临的一系列技术难题。
Hystrix “豪猪”,具有自我保护的能力。hystrix 通过如下机制来解决雪崩效应问题。
在微服务架构中,我们把每个业务都拆成了单个服务模块,然后当有业务需求时,服务间可互相调用,但是,由于网络原因或者其他一些因素,有可能出现服务不可用的情况,当某个服务出现问题时,其他服务如果继续调用这个服务,就有可能出现线程阻塞,但如果同时有大量的请求,就会造成线程资源被用完,这样就可能会导致服务瘫痪,由于服务间会相互调用,很容易造成蝴蝶效应导致整个系统宕掉。因此,就有人提出来断路器来解决这一问题。
- 资源隔离:包括线程池隔离和信号量隔离,限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用。
- 降级机制:超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据。
- 熔断:当失败率达到阀值自动触发降级(如因网络故障/超时造成的失败率高),熔断器触发的快速失败会进行快速恢复。
- 缓存:提供了请求缓存、请求合并实现。
2.1 Hystrix集成步骤
1. 新建maven工程
2. 添加maven依赖
<!-- hystrix断路器 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
3. 配置Hystrix断路器
feign: hystrix: enabled: true #### hystrix禁止服务超时时间 hystrix: command: default: execution: timeout: enabled: false
4. 开启Hystrix断路器
@SpringBootApplication @EnableEurekaClient @EnableFeignClients @EnableHystrix public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } }
5. 业务层代码
@RestController public class ServiceBController { @Autowired private RestTemplate restTemplate; @RequestMapping("/getOrder") public String getOrder() { // order 使用rpc 远程调用技术 调用 会员服务 String memberUrl = "http://app-service-a/getMember"; String result = restTemplate.getForObject(memberUrl, String.class); System.out.println("会员服务调用订单服务,result:" + result); return result; } @HystrixCommand(fallbackMethod = "orderToUserInfoFallback") @RequestMapping("/getUserInfoHystrix") public String orderToUserInfoHystrix() { System.out.println("orderToUserInfo:" + "当前线程池名称:" + Thread.currentThread().getName()); return getOrder(); } @RequestMapping("/orderToUserInfoFallback") public String orderToUserInfoFallback() { return "系统错误!!!!"; } }
6. 浏览器输入http://localhost:8001/getUserInfoHystrix
可以看出访问是正常的。
2.2 压力测试
使用JMeter,设置开启100条线程,每条线程去循环调用。
压力测试的文章可以参考之前写的文章:
运行压力测试,浏览器访问,可以看到访问不了服务了:
关闭压力测试,再次访问,可以看到可以正常访问了:
可以看出Hystrix起到了保护服务的功能。
03 Hystrix 仪表盘
Hystrix其实还有个Dashboard(仪表板),它主要用来实时监控Hystrix的各项指标信息,可以帮助我们快速发现系统中存在的问题。
下面直接看看集成步骤:
1.在pom.xml引入相关的依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
2.在spring boot 的启动类上面引入注解@EnableHystrixDashboard,启用Hystrix Dashboard功能。
package org.hope.hystrix.dashboard; import org.springframework.boot.SpringApplication; import org.springframework.cloud.client.SpringCloudApplication; import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard; @EnableHystrixDashboard @SpringCloudApplication public class HystrixDashboardApplication { public static void main(String[] args) { SpringApplication.run(HystrixDashboardApplication.class, args); } }
3.修改配置文件application.properties
spring.application.name=hystrix-dashboard server.port=2001
4.启动应用,然后再浏览器中输入http://localhost:2001/hystrix可以看到如下界面:
通过Hystrix Dashboard主页面的文字介绍,我们可以知道,Hystrix Dashboard共支持三种不同的监控方式
- ☞默认的集群监控:通过URL:http://turbine-hostname:port/turbine.stream开启,实现对默认集群的监控。
- ☞指定的集群监控:通过URL:http://turbine-hostname:port/turbine.stream?cluster=[clusterName]开启,实现对clusterName集群的监控。
- ☞单体应用的监控:通过URL:http://hystrix-app:port/hystrix.stream开启,实现对具体某个服务实例的监控。
- ☞Delay:控制服务器上轮询监控信息的延迟时间,默认为2000毫秒,可以通过配置该属性来降低客户端的网络和CPU消耗。
- ☞Title:该参数可以展示合适的标题。
在Hystrix-Dashboard的主界面上输入: http://localhost:9000/hystrix.stream然后点击 Monitor Stream按钮
在监控的界面有两个重要的图形信息:一个实心圆和一条曲线。
- 实心圆:1、通过颜色的变化代表了实例的健康程度,健康程度从绿色、黄色、橙色、红色递减。2、通过大小表示请求流量发生变化,流量越大该实心圆就越大。所以可以在大量的实例中快速发现故障实例和高压实例。
- 曲线:用来记录2分钟内流浪的相对变化,可以通过它来观察流量的上升和下降趋势。
05 Turbine集群监控
Turbine是聚合服务器发送事件流数据的一个工具,Hystrix的监控中,只能监控单个节点,实际生产中都为集群,因此可以通过Turbine来监控集群下Hystrix的metrics情况。
Turbine的github地址:https://github.com/Netflix/Turbine
使用场景:
- 在复杂的分布式系统中,相同服务的结点经常需要部署上百甚至上千个,很多时候,运维人员希望能够把相同服务的节点状态以一个整体集群的形式展现出来,这样可以更好的把握整个系统的状态。 为此,Netflix又提供了一个开源项目Turbine来提供把多个hystrix.stream的内容聚合为一个数据源供Dashboard展示。
Turbine使用了Netflix的另一个开源项目Archaius来做配置文件的管理,其提供了非常强大的配置文件管理策略Archaius:https://github.com/Netflix/archaius
由于篇幅原因,具体可以参考博客:《Spring Cloud Turbine(集群监控)》
06 总结
代码已提交至Github,有兴趣的同学可以下载来看看:https://github.com/ylw-github/SpringCloud-Hystrix-Demo