3 断路器(Hystrix)
在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。
为了解决这个问题,业界提出了断路器模型。
在ribbon使用断路器
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
在启动类加入注解:@EnableHystrix
Service
@HystrixCommand(fallbackMethod = "hiError")
public String hiService(String name) {
return restTemplate.getForObject("http://CLIENT01/test?name=" + name, String.class);
}
public String hiError(String name) {
return "hi," + name + "!sorry error!";
}
关闭client工程,会调用hiError方法
Feign中使用断路器
Feign是自带断路器,在配置文件加以下代码:
feign:
hystrix:
enabled: true
service interface
@FeignClient(value = "CLIENT01", fallback = TestServiceImpl.class)
@Component
public class TestServiceImpl implements TestService {
@Override
public String test(String name) {
return "sorry " + name + ", error!";
}
}
Hystrix Dashboard
Dashboard仪表盘
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<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>
启动类加入注解:@EnableHystrixDashboard
和 @EnableCircuitBreaker
启动项目:http://127.0.0.1:9003/hystrix,在界面输入:http://ip/hystrix.stream
Hystrix Turbine
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-turbine</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-turbine</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
启动类:@EnableTurbine
application.yml
security:
basic:
enabled: false
turbine:
aggregator:
clusterConfig: default
appConfig: CLIENT01,CLIENT02
clusterNameExpression: new String("default")
clusterConfig
指定聚合哪些集群,多个使用","分割,默认为default。可使用http://ip/turbine.stream?cluster={clusterConfig之一}访问
appConfig
配置Eureka中的serviceId列表,表明监控哪些服务
clusterNameExpression
- clusterNameExpression指定集群名称,默认表达式appName;此时:turbine.aggregator.clusterConfig需要配置想要监控的应用名称
- 当clusterNameExpression: default时,turbine.aggregator.clusterConfig可以不写,因为默认就是default
- 当clusterNameExpression: metadata[‘cluster’]时,假设想要监控的应用配置了eureka.instance.metadata-map.cluster: ABC,则需要配置,同时turbine.aggregator.clusterConfig: ABC
打开浏览器:
http://127.0.0.1:9002/hystrix
输入监控流 http://127.0.0.1:9200/turbine.stream