Spring Cloud 断路器Hystrix实战

来源:互联网 发布:牛头702手拉淘宝交易 编辑:程序博客网 时间:2024/04/29 07:38

微服务架构中,因分布式环境引起的请求状态通常包含如下三种

  • 成功
  • 失败
  • 超时

对于单机系统来说可以很容易的做到快速失败,这是没有问题的,对于分布式环境而言由于网络的不可靠性而导致的请求状态不确定的情况成为必然,我们不能容忍一个无限阻塞的现线程甚哪怕超过1S也不允许我们更愿意看到它快速失败.

基于以上简短的描述,微服务中可以引入断路器,来对分布式请求进行控制,进而实现上诉的快速失败,本节以Spring Cloud 下Netflix 成员Hystrix 举例在Spring Boot 微服务解决方案中的便捷之处.

主程序如下,@SpringBootApplication 注解驱动Sping Boot应用程序,@EnableDiscoveryClient 注解驱动服务注册,这里将服务注册到ZK,@EnableCircuitBreaker 启用断路器,该注解等价于@EnableHystrix. @EnableHystrixDashboard 注解驱动HystrixDashboard模块用来驱动UI模块,监视断路器的响应情况.

@SpringBootApplication@EnableDiscoveryClient@EnableCircuitBreaker@EnableHystrixDashboardpublic class ZkWebApplication {//// 管理界面用服务端口,Stream监控用Manager 端口http://it:4567/hystrix.streampublic static void main(String[] args) {SpringApplication.run(ZkWebApplication.class, args);}}
项目依赖,该部分引入的较多,实际上暂为用到,有简短注释可参考,其中spring-boot-starter-actuator,spring-cloud-starter-hystrix,spring-cloud-starter-hystrix-dashboard为 当前必须.

spring-boot-starter-actuator为项目映入多个endpoint以便于以REST URI的格式访问引用程序状态,spring-cloud-starter-hystrix模块为断路器核心模块,spring-cloud-starter-hystrix-dashboard断路器仪表盘用于监控断路器的状态WEB形式.

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- FEGIN:REST CLIENT --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-feign</artifactId></dependency><!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-ribbon --><!-- RIBBON:客户端负载均衡器 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-ribbon</artifactId></dependency><!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-hystrix --><!-- actuator Spring Cloud监控模块,引入依赖后自动发现和加载 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- HYSTRIX:断路器 --><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><!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-zookeeper-discovery --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zookeeper-discovery</artifactId><version>1.0.2.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-freemarker --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency><!-- 热部署包 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --><!-- JDBCTELEPLASTE --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId></dependency><!-- https://mvnrepository.com/artifact/oracle/ojdbc14 --><!-- ORACLE --><dependency><groupId>oracle</groupId><artifactId>ojdbc14</artifactId><version>10.2.0.1.0</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-jdbc --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- Spring 安全 --><!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-security --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><!-- 动态连接信息 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-hateoas</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency>

核心配置文件application.yml ,如不具备ZK环境可移除zookeeper模块依赖及配置模块.

server:  #应用端口  port: 8080spring:  #应用名称  application:    name: zj_web  cloud:    zookeeper:      enabled: true      #ZK CLUSTER      connect-string: host1:2181,host2:2181,host3:2181      discovery:        #注册到的节点位置        root: /services        #注册到ZK        register: true  #数据源配置  datasource:    url: jdbc:oracle:thin:@host1:1521/PROD    username: admin    password: admin    driver-class-name: oracle.jdbc.driver.OracleDriver#actuator模块管理参数management:  #actuator 端口  port: 4567  #释放所有端口  security:    enabled: false#断路器配置hystrix:  metrics:    enabled: true    #刷新间隔    polling-interval-ms: 2000    

断路器的简单使用,代码如下,@HystrixCommand 注解可以出现在调用服务的方法上对当前调用进行控制,fallbackMethod 指定当调用失败时执行的操作,@HystrixProperty 定义一个断路器的配置参数这里指定超时时间为3S ,error 方法用于在请求失败或者超时的后背方案,该方法的参数与调用者参数一致可参考官方文档.

@Controllerpublic class GlobalController {@RequestMapping(value = { "/index", "/" })public String page() {return "index";}@RequestMapping("/index/{page}")// 对当前请求使用断路器包装指定失败后回调本地方法,并指定超时时间@HystrixCommand(fallbackMethod = "error", commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000") })public String page(@PathVariable(required = false, value = "page") String page, Map<String, String> model) {if (page != null) {model.put("page", page);// 模拟超时任务}return "index";}// 本地错误回调页面,分布式调用超时或者异常回调本地方法public String error(String page, Map<String, String> model) {return "error";}}

REST URL访问actuator 模块暴露出的断点,目前在Spring Boot程序启动的日志中观察到如下endpoint ,一个endpoint实际上相当于一个系统的参数暴露.下图中的endpint都在4567端口下,上文已经配置过. 其中红色标注的即为 spring-cloud-starter-hystrix 模块需要监控的断点,该端点以流的实行定时输出断路器状态.

此外在应用程序端口8080下有如下一些URI,其中除了自己定义的部分为还有spring-cloud-starter-hystrix 模块定义的UI接口地址,红色标注

至此,.访问断路器的UI管理界面应该是 8080/hystrix,结果图如下,这里还为开始监控任何断路器



添加多当前应用程序断路器的状态监控,URL为 :4567/hystrix.stream ,单机Monitor Stream即可开始监控,多访问几次 :8080/index/home 即断路器结果如下:


这里需要主意的是一定要先访问断路器在开始在UI中监控断路器,否则监控无效.






0 0