Spring Cloud学习过程二

Spring Cloud Hystrix

Hystrix也是基于Netflix,它具有服务降级,服务熔断,线程隔离,请求缓存,请求合并以及服务监控等功能。
使用步骤:
1.引用

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
  1. 在启动类上使用@EnableCircuitBreaker或者@EnableHystrix,在Spring Cloud项目中,启动类可以使用@SpringCloudApplication其中包含了@SpringBootApplication@EnableDiscoveryClinet@EnableCircuitBreaker也就是说,SpringCloud本身就包含了熔断器。
  2. 在使用的Service中使用@HystrixCommand来表示服务降级方法。如:
  @HystrixCommand(fallbackMethod = "fallback")
        public String consumer() {
            return restTemplate.getForObject("http://eureka-client/dc", String.class);
        }

Hystrix 依赖隔离

Hystrix通过舱壁模式实现了线程池隔离,它会为每一个HystrixCommand提供一个线程池,这样可以保证在我们有使用@HystrixCommand出现高延迟的情况,也不会影响其他的服务调用,因为他们各用线程池。
好处:

  • 保护自身,不会受依赖的其他服务影响
  • 降低接入风险,新服务不稳定的情况,不会影响本身
  • 当依赖服务正常后,它的线程池会被清理并立即恢复健康
  • 当依赖服务配置错误,,线程池会快速的反应出此问题(通过失败次数、延迟、超时、拒绝等指标的增加情况)
  • 当依赖服务出现大性能问题,线程池的监控指标信息会反映变化
  • 每个线程池都提供了内置的并发实现,可以利用它为同步的依赖服务构建异步的访问

信号量隔离
如果在实际应用中,发现线程池隔离会影响性能,可以使用信号量隔离,但是在使用信号量隔离,需要保证依赖服务本身的高可用,使用方法就是在配置中增加execution.isolation.strategy = SEMAPHORE信号量默认是10,这个数量也是可以再配置中修改的。

Hystrix的隔离是和服务降级同时存在的,也就是说在我们使用@HystrixCommand时就已经包含的依赖隔离。

Hystrix 熔断器

熔断器相当于我们的保险丝,它在以下时间会触发:

  • 快照时间窗:统计近10秒的请求和错误数据
  • 请求总数下限:在快照时间窗内,必须要满足请求总数下限,默认20
  • 错误百分比下限:在快照时间窗内,超过了请求总数下限,且发生了16次异常,超过50%。默认50%

作用当熔断器未打开时,假设我们的服务超时为3秒,那么通常每个请求过来出现超时都需要等待3秒。当熔断器打开时,服务降直接使用降级,不需要等待3秒,而是直接返回fallback。这时Hystrix会启动一个休眠时间窗,它用来表示在某一时间段之后,将一部分请求放给主逻辑,用来尝试请求返回是否正常,如果正常关闭熔断器,如果不正常重新计时。

Hystrix Dashboard

Dashboard用来对Hystrix的各种指标进行监控。
使用步骤:

  1. 引用
	<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.启动类增加@EnableHystrixDashboard
它包含三种监控方式:

  • 默认集群监控,通过URLhttp://turbine-hostname:port/turbine.stream开启,实现对默认集群的监控
  • 制定集群监控,通过URLhttp://turbine-hostname:port/turbine.stream?cluster=[clusterName]开启,实现对clusterName集群的监控
  • 单独应用监控,通过URLhttp://hystrix-app:port/hystrix.stream开启,实现对具体某个服务实例的监控
    针对集群监控需要整合turbine目前这里还不能使用,这里对之前已经使用了@EnableCircuitBreaker的服务进行监控,直接在Dashboard首页输入http://localhost:port/hystrix.stream,在监控首页有Delay用来表示每隔多少时间进行一次轮询。Title 监控的服务标题。
    图片来自程序员DD
  • 实心圆,通过颜色表示健康程度,绿黄橙红依次递减,大小和流量成正比。
  • 曲线,两分钟的流量变化
    图片来自程序员DD

Turbine

监控集群Hystrix
使用步骤:

  1. 引用
    <dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-turbine</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-actuator</artifactId>
	</dependency>
  1. 启动类增加@EnableTurbine
  2. 配置增加
# 注册中心地址
eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/
# 指定需要收集监控信息的服务名
turbine.app-config=eureka-consumer-ribbon-hystrix
# 集群名称
turbine.cluster-name-expression="default"
#可以让同一主机上的服务通过主机名与端口号的组合来进行区分,默认情况下会以host来区分不同的服务,这会使得在本地调试的时候,本机上的不同服务聚合成一个服务来统计。
turbine.combine-host-port=true

通过消息代理收集聚合

Spring Cloud 在整合Turbine使用了消息代理的收集,也就是说我们可以将所有需要收集的监控信息都输出到消息代理中,然后Turbine再从消息代理异步的获取监控信息,在程序员DD的博客中使用了RabbitMQ大家可以去看看。
使用步骤:

  1. 引用
    <dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-turbine-amqp</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-actuator</artifactId>
	</dependency>

这个amqp中已经依赖了spring-cloud-starter-turbine-streanspring-cloud-starter-stream-rabbit
2. 启动类使用@EnableTurbineStream
3. 配置增加

#Turbine管理端口
management.port=8990
eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/
  1. 修改之前Hystrix服务,在pom中引用上amqp
学习内容总结于“程序员DD”,用于记录方便以后温故。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值