开发者学堂课程【Spring Cloud 微服务架构设计与开发实战 :2.6 Spring Cloud 微服务API 的监控 Hystrix】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/60/detail/1089
2.6 Spring Cloud 微服务 API 的监控 Hystrix
内容介绍
一、Spring Cloud 微服务监控
二、Spring Cloud 微服务 Hystrix 监控面板
下面来讲微服务架构的限流,提到的 Hystrix 也是 Netflix 提供的,之前提过Netflix 是 Spring Cloud 微服务架构最早期核心的贡献公司,提供了许多重要的组件,Hystrix 就是其中之一。
一、Spring Cloud 微服务监控
1、Netflix Hystrix
(1)Netflix 发布了 Hystrix 熔断器框架,保护系统
(2)通过控制那些访问远程系统、服务和第三方库的节点
(3)从而对延迟和故障提供更强大的容错能力
(4)Fallback 灾备操作,出错以后返回的值
(5)Hystrix 中, 主要通过线程池来实现资源隔离
(6)Hystrix 的信号模式(Semaphores)来隔离资源
(7)Hystrix 支持 dashboard 控制面板监控信息
(8)Feign 可以和 Hystrix 结合使用,也可以独立使用
(9)Hystrix 使用了命令模式,对命令对象抽象了两个抽象类: HystrixCommand 和 HystrixObservableCommand
Hystrix 本意指的是豪猪,之前在微服务架构已经演示过在生产环境下有知识高并发,可能有成百上千的实例,但也有可能有十台服务器支持的并发是一万,但是双十一支持的并发瞬间达到了十万,这时就有一个问题,那就是这个系统是直接崩溃还是做限流,还是一定程度上做一些措施去限制一部分流量,服务器中留一部分流量。现在的淘宝双十一已经做得很好了,基本不限流,还能过滤掉一些微请求和低攻击,但对于大部分公司来说服务器规模达不到这样的程度,这个时候就要保证系统的高可用,不让系统过载出现大面积崩溃,可以适当的接入部分请求服务部分请求,这样的话整个系统还是可用的,当瞬间流量过载的时候可用消除部分的峰值请求,相当于用了隔离的策略,实行隔离工作,但是 Java 本身没有像 Hystrix 倒班的概念,实际上他的隔离是通过线程池进行隔离的,为了避免某个服务调度出错引发整个系统崩溃的问题,这里面也出现了 dashboard 监控面板,可以监控服务的调度数据,当然 Hystrix 可以部署在服务端,也可以部署在调用端,一般是放在调用端,尤其是放在代理服务器上,网关服务器调度所有的服务,所以可以统一看到流量的监控信息,也可以针对某一个服务执行熔断策略。还有底层一个面试题需要注意,Hystrix 是设计模式里面经典的 Command 模式的应用,也就是命令模式,其中封装了各种不同的操作来做解耦工作。
2、断路器模式
如下图整个熔断工具 Hystrix 一般是放在服务调度中,因为服务调度端的话会调用多个服务,对于做限流是比较方便的,就是说常见的限流和高速公转的限流一定是在闸机口,在流量的入口,在全部流量经过的地方进行限流才有意义。
二、Spring Cloud 微服务 Hystrix 监控面板
Spring Cloud 监控面板在后面进行实战练习,它提供了 Hystrix dashboard 和还要再加上两个引用。下面做练习,看下具体的实战项目。为了简化方便就在之前Feign的基础上做实训。
1、Hystrix 监控面板实训
第一步加上两个引用依赖,然后保存进行拉包,这里面有 Hystrix,还有 dashboard,当然 dashboard 可以单独做一个独立的项目,做一个监控面板的程序,而 Hystrix 是用做采集,所以这两个引用可以分开,就是搭建包的时候有单独的项目,监控数据源是一个项目,还有一个重要的是 actuator,这个依赖是 Spring Cloud2.2 提供的叫数据采集的一个组件,而且不能没有,因为 actuator 要暴露一些核心的数据,以上操作改完后还要加上两个很重要的注解,@EnableHystrix 和 @EnableHystrixDashboard,@EnableHystrixDashboard 为启用监控面板,要把监控面板剥离成独立的也是可以的,@EnableHystri 为启用监控,代码如下:
@EnableHystrix
@
EnableHystrixDashboard
…
<dependency>
<groupId>org. springframework. cloud</ groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org. springframework. cloud</ groupId>
<artifactId>spring-cloud- starter- netflix- hystrix- dashboard</artifactId>
</dependency>
<dependency>
<groupId>org. springframework. boot</ groupId>
<artifactId>spring- boot -starter- actuator</artifactId>
</dependency>
然后还要改配置文件,在文件中要暴露监控数据源地址,只有暴露数据才能进行采集,否则采不到,而现在 Spring Cloud 版本之间有默认的安全差异,很多规则都改掉了,所以要通过 management.endpoints.web.exposure.include 得到监控地址,其次还要改9002的测试端口,然后启动9002的端口,application 代码为:
server
.port
=
9002
…
#暴露监控数据源地址
management
.endpoints.web.exposure.include=*
运行后可以发现并没有很大的变动9002,只是加上了注解和三个依赖包,然后再访问 localhost:9002/hystrix,会进入监控面板的入口界面,入口界面是有点像豪猪的一个 logo,需要给出监控地址才能采集监控数据,输入采集地址为http://localhost:9002/actutor/hystrix.stream,如下图:
2、进一步优化
这时候会出现一个错误,这个错误在以后做监控的时候也一定会遇到,错误为无法连接到监控数据流,是因为默认在2.2级以后版本又更改了,不允许直接去连接,而且本身这种数据也属于安全数据,那要进行连接就要在配置里面允许本地服务器进行调用,并且这里面采集面板和代理服务器还有一个依赖关系,如果不这样的话,这个错误会一直出现,是看不见采集数据的,增加代码为:
#允许展示监控服务器
hystrix.dashboard.proxy-stream-al1ow-list=localhost,192.168.1.101
暴露的协议也是可以改的,默认的使用 web 也就是 http协议,以及 REST 协议,再次回到浏览器运行则页面加载为 Loading,然后就要主动触发调用9002新的微服务程序,触发后才有数据源,等待一会后正常的话会出现触发的数据,不正常的话再打开 http://localhost:9002/actutor/hystrix.stream 会发现里面的数据流为空,是不会展示的,在练习中此处运行为不正常,所以回到代码中进行检查。
代码中.exposure.include=*
,* 号表示所有,也可以代表健康信息,其他信息都可以拿来用,继续检查会发现代理服务器在想办法去监控数据量,此时浏览器再进行触发一次,页面就会显示数据流,如图:
所以数据流要重新打开一次,此时监控界面就可以看到数据了,然后进行多次手动的测试调用,回到监控界面就会发现手动点击速度为1.2次每秒,如图:
以上则说明调度成功。通过监控面板可以看到上面的界面,这里面只做了一个 test 微服务,当然也可以做多个,多个的话体现的就比较明显,如下可以在案例中再加入 hi 的微服务调度,效果是一样的,调度两个的话就是按照两个策略来执行监控的,增加代码为:
@RequestMapping("/hi")
public String hi() {
return proxy .hi();
}
页面进行访问 localhost:9002/hi,调度 hi 后界面如下:
如果有多个服务的话监控页面看起来就更内容丰富,都是通过 OderProxy来进行调度,做这个练习需要注意注解,在配置文件中可做的参数,三个重要的依赖包,中间一旦出现错误就会导致连接不上数据流,没有数据的情况,如果正常的话数据流里面应该有监控日志,而且不断刷新默认应该是1秒左右或者500毫秒,以上这个策略就到处结束。下节课介绍熔断和限流怎么实现,而这里已经实现了数据采集,后面就知道其他的怎么做。