Spring Cloud快速入门(5),Hystrix服务熔断、降级、监控

什么是Hystrix?

在分布式系统里,服务之间会相互依赖,可能存在服务调用失败,比如超时,异常等,Hystrix能够保证在一个依赖出现问题的情况下,不会导致整体服务失败,以提高分布式系统的弹性。

Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,默认是5秒内20次调用失败就会启动熔断机制,不再调用微服务,而是返回调用方自定义的fallback,不至于把错误信息暴露给用户。

修改订单服务

  • 添加maven依赖
<code>
<dependency>
\t<groupid>org.springframework.cloud/<groupid>
\t\t<artifactid>spring-cloud-starter-netflix-hystrix/<artifactid>
/<dependency>/<code>
  • 创建ProductClientFallback降级处理类,实现ProductClient接口。
<code>@Component
public class ProductClientFallback implements ProductClient {
@Override
public CommonResult<product> getById(Long id) {
System.out.println("ProductClientFallback");
return CommonResult.failed("服务异常");
}
}/<product>/<code>
  • 修改ProductClient接口上的FeignClient注解,指定fallback为降级处理类
<code>@FeignClient(value = "sales-product-service",fallback = ProductClientFallback.class)/<code>
  • 开启Feign支持Hystrix,修改application.properties
<code>feign:
hystrix:
enabled: true
client:
config:
default:
connectTimeout: 3000
readTimeout: 3000/<code>
  • OrderController的getOrder方法,增加注解@HystrixCommand(fallbackMethod = "getOrderFail"),微服务调用异常时,会降级处理到getOrderFail,方法定义的参数和返回类型要和getOrder保持一致。
<code>private CommonResult getOrderFail(Long id) {
System.out.println("getOrderFail");
return CommonResult.failed("服务异常");
}/<code>
  • 启动类增加注解@EnableCircuitBreaker,开启熔断降级。

Hystrix测试

订单服务和产品服务都启动后,在浏览器输入:http://localhost:8094/order/get/1,可正常返回结果。

关闭产品服务,刷新浏览器,返回结果如下:

<code>{"code":500,"message":"服务异常","data":null}/<code>

Hystrix Dashboard监控

Spring Cloud提供hystrix dashboard监控通过hystrix发起的请求信息。

创建sales-hystrix-dashboard工程,继承sales-parent.

  • 添加maven依赖:
<code><dependency>
\t<groupid>org.springframework.boot/<groupid>
\t\t<artifactid>spring-boot-starter-web/<artifactid>
/<dependency>
<dependency>
\t<groupid>org.springframework.cloud/<groupid>
\t\t<artifactid>spring-cloud-starter-netflix-eureka-client/<artifactid>
/<dependency>

<dependency>
\t\t<groupid>org.springframework.cloud/<groupid>
\t\t\t<artifactid>spring-cloud-starter-netflix-hystrix/<artifactid>
/<dependency>

<dependency>
\t\t<groupid>org.springframework.cloud/<groupid>
\t\t\t<artifactid>spring-cloud-netflix-hystrix-dashboard/<artifactid>
/<dependency>/<code>

配置application.yml

<code>server:
port: ${PORT:8100}
spring:
application:
name: sales-hystrix-dashboard

eureka:
client:
registerWithEureka: true #服务注册开关
fetchRegistry: true #服务发现开关
serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址,多个中间用逗号分隔
defaultZone: http://localhost:8090/eureka/
instance:
prefer-ip-address: true #将自己的ip地址注册到Eureka服务中
ip-address: ${IP_ADDRESS:127.0.0.1}
instance-id: ${spring.application.name}:${server.port} #指定实例id

/<code>

创建启动类DashboardApplication,添加注解

@SpringBootApplication

@EnableHystrixDashboard

@EnableDiscoveryClient


  • 调整订单服务允许被监控,添加maven依赖
<code>
<dependency>
\t<groupid>org.springframework.boot/<groupid>
\t\t<artifactid>spring-boot-starter-actuator/<artifactid>
/<dependency>/<code>

配置bean

<code>\t\t@Bean
public ServletRegistrationBean<hystrixmetricsstreamservlet> getServlet(){
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}/<hystrixmetricsstreamservlet>/<code>

启动测试:

浏览器输入:http://localhost:8100/hystrix


Spring Cloud快速入门(5),Hystrix服务熔断、降级、监控

输入:http://localhost:8094/hystrix.stream,点击Monitor Stream,进入监控页面

调用订单服务的接口,http://localhost:8094/order/get/1,查看监控页面的变化。

Spring Cloud快速入门(5),Hystrix服务熔断、降级、监控


分享到:


相關文章: