在父工程基础上建立Hystrix子工程,创建服务提供者

springcloud-consumer-dept-hystrix
image.png
image.png

通用的方式把springcloud-provider-dept-8081服务方的pom.xml文件,以及配置文件yml复制过来

image.png

通常使用新功能,

1:导入依赖pom,

image.png

2:编写配置文件yml,

  1. server:
  2. port: 8081
  3. #mybatis配置
  4. mybatis:
  5. type-aliases-package: org.springcloud.pojo
  6. config-location: classpath:mybatis/mybatis-config.xml
  7. mapper-locations: classpath:mybatis/mapper/*.xml
  8. #开启自动驼峰命名
  9. # configuration:
  10. # map-underscore-to-camel-case:
  11. #spring配置
  12. spring:
  13. application:
  14. name: springcloud-provider-dept-hystrix #修改applicationname为hystrix
  15. datasource:
  16. # 数据库名称
  17. type: com.alibaba.druid.pool.DruidDataSource
  18. driver-class-name: com.mysql.jdbc.Driver
  19. url: jdbc:mysql://localhost:3306/db03?useUncode=true&characterEncoding=utf8&verifyServerCertificate=false&useSSL=false&allowMultiQueries=true
  20. username: root
  21. password: root
  22. #eureka 的配置
  23. eureka:
  24. client:
  25. service-url:
  26. # 服务注册到哪里 打开eureka服务配置以配置中的地址为准
  27. # eureka配置好之后,开启eureka功能注解
  28. defaultZone: http://eureka7001.com:7001/eureka,http://eureka7001.com:7002/eureka,http://eureka7001.com:7003/eureka
  29. instance:
  30. # 修改eureka——Status up 描述
  31. # instance-id: provider-dept-8081
  32. instance-id: ${spring.application.name}:${server.port}
  33. prefer-ip-address: true
  34. # actuator 监控配置
  35. info:
  36. app.name: provider-dept
  37. company.name: blog.junjay.com
  38. # 服务开发者名称(作者)
  39. author: junjay

3:开启注解enable*主启动类 ,或controller

  1. package org.springcloud.controller;
  2. import org.springcloud.pojo.Dept;
  3. import org.springcloud.service.DeptService;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.PathVariable;
  7. import org.springframework.web.bind.annotation.RestController;
  8. import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
  9. /**
  10. * @author My 提供RestFul 风格服务
  11. */
  12. @RestController
  13. public class DeptController {
  14. @Autowired
  15. private DeptService deptService;
  16. // 使用@HystrixCommand 设置fallbackMethod当出现失败调用方法回调hystrixGet方法
  17. @GetMapping("/dept/queryById/{deptno}")
  18. @HystrixCommand(fallbackMethod = "hystrixGet")
  19. public Dept queryById(@PathVariable("deptno") Long deptno) {
  20. Dept dept = deptService.queryById(deptno);
  21. // 添加实际业务逻辑,如果查询id为空,则抛出异常
  22. if (dept == null) {
  23. throw new RuntimeException("id=》" + deptno + ",不存在该条信息,或查找不到~~");
  24. }
  25. return dept;
  26. }
  27. @GetMapping("/dept/queryById1/{deptno}")
  28. public Dept queryById1(@PathVariable("deptno") Long deptno) {
  29. return deptService.queryById(deptno);
  30. }
  31. // 备选方案,熔断
  32. public Dept hystrixGet(@PathVariable("deptno") Long deptno) {
  33. return new Dept().setDeptno(deptno).setDname("id=》" + deptno + ",没有对于信息,null----@hystrix")
  34. .setDb_source(" 没有 这个数据库 ");
  35. }
  36. }

@HystrixCommand 注解
1 Execution:用来控制HystrixCommand.run()的执行

execution.isolation.strategy:该属性用来设置HystrixCommand.run()执行的隔离策略。默认为THREAD。
execution.isolation.thread.timeoutInMilliseconds:该属性用来配置HystrixCommand执行的超时时间,单位为毫秒。
execution.timeout.enabled:该属性用来配置HystrixCommand.run()的执行是否启用超时时间。默认为true。
execution.isolation.thread.interruptOnTimeout:该属性用来配置当HystrixCommand.run()执行超时的时候是否要它中断。
execution.isolation.thread.interruptOnCancel:该属性用来配置当HystrixCommand.run()执行取消时是否要它中断。
execution.isolation.semaphore.maxConcurrentRequests:当HystrixCommand命令的隔离策略使用信号量时,该属性用来配置信号量的大小。当最大并发请求达到该设置值时,后续的请求将被拒绝。
2 Fallback:用来控制HystrixCommand.getFallback()的执行

fallback.isolation.semaphore.maxConcurrentRequests:该属性用来设置从调用线程中允许HystrixCommand.getFallback()方法执行的最大并发请求数。当达到最大并发请求时,后续的请求将会被拒绝并抛出异常。
fallback.enabled:该属性用来设置服务降级策略是否启用,默认是true。如果设置为false,当请求失败或者拒绝发生时,将不会调用HystrixCommand.getFallback()来执行服务降级逻辑。
3 Circuit Breaker:用来控制HystrixCircuitBreaker的行为。

circuitBreaker.enabled:确定当服务请求命令失败时,是否使用断路器来跟踪其健康指标和熔断请求。默认为true。
circuitBreaker.requestVolumeThreshold:用来设置在滚动时间窗中,断路器熔断的最小请求数。例如,默认该值为20的时候,如果滚动时间窗(默认10秒)内仅收到19个请求,即使这19个请求都失败了,断路器也不会打开。
circuitBreaker.sleepWindowInMilliseconds:用来设置当断路器打开之后的休眠时间窗。休眠时间窗结束之后,会将断路器设置为“半开”状态,尝试熔断的请求命令,如果依然时候就将断路器继续设置为“打开”状态,如果成功,就设置为“关闭”状态。
circuitBreaker.errorThresholdPercentage:该属性用来设置断路器打开的错误百分比条件。默认值为50,表示在滚动时间窗中,在请求值超过requestVolumeThreshold阈值的前提下,如果错误请求数百分比超过50,就把断路器设置为“打开”状态,否则就设置为“关闭”状态。
circuitBreaker.forceOpen:该属性默认为false。如果该属性设置为true,断路器将强制进入“打开”状态,它会拒绝所有请求。该属性优于forceClosed属性。
circuitBreaker.forceClosed:该属性默认为false。如果该属性设置为true,断路器强制进入“关闭”状态,它会接收所有请求。如果forceOpen属性为true,该属性不生效。
4 Metrics:该属性与HystrixCommand和HystrixObservableCommand执行种捕获的指标相关。

metrics.rollingStats.timeInMilliseconds:该属性用来设置滚动时间窗的长度,单位为毫秒。该时间用于断路器判断健康度时需要收集信息的持续时间。断路器在收集指标信息时会根据设置的时间窗长度拆分成多个桶来累计各度量值,每个桶记录了一段时间的采集指标。例如,当为默认值10000毫秒时,断路器默认将其分成10个桶,每个桶记录1000毫秒内的指标信息。
metrics.rollingStats.numBuckets:用来设置滚动时间窗统计指标信息时划分“桶”的数量。默认值为10。
metrics.rollingPercentile.enabled:用来设置对命令执行延迟是否使用百分位数来跟踪和计算。默认为true,如果设置为false,那么所有的概要统计都将返回-1。
metrics.rollingPercentile.timeInMilliseconds:用来设置百分位统计的滚动窗口的持续时间,单位为毫秒。
metrics.rollingPercentile.numBuckets:用来设置百分位统计滚动窗口中使用桶的数量。
metrics.rollingPercentile.bucketSize:用来设置每个“桶”中保留的最大执行数。
metrics.healthSnapshot.intervalInMilliseconds:用来设置采集影响断路器状态的健康快照的间隔等待时间。
5 Request Context:涉及HystrixCommand使用HystrixRequestContext的设置。

requestCache.enabled:用来配置是否开启请求缓存。
requestLog.enabled:用来设置HystrixCommand的执行和事件是否打印到日志的HystrixRequestLog中。
[

](https://blog.csdn.net/chengqiuming/article/details/81568234)

  1. /**
  2. * Copyright 2012 Netflix, Inc.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.netflix.hystrix.contrib.javanica.annotation;
  17. import java.lang.annotation.Documented;
  18. import java.lang.annotation.ElementType;
  19. import java.lang.annotation.Inherited;
  20. import java.lang.annotation.Retention;
  21. import java.lang.annotation.RetentionPolicy;
  22. import java.lang.annotation.Target;
  23. /**
  24. * This annotation used to specify some methods which should be processes as hystrix commands.
  25. */
  26. @Target({ElementType.METHOD})
  27. @Retention(RetentionPolicy.RUNTIME)
  28. @Inherited
  29. @Documented
  30. public @interface HystrixCommand {
  31. /**
  32. * The command group key is used for grouping together commands such as for reporting,
  33. * alerting, dashboards or team/library ownership.
  34. * <p/>
  35. * default => the runtime class name of annotated method
  36. *
  37. * @return group key
  38. */
  39. String groupKey() default "";
  40. /**
  41. * Hystrix command key.
  42. * <p/>
  43. * default => the name of annotated method. for example:
  44. * <code>
  45. * ...
  46. * @HystrixCommand
  47. * public User getUserById(...)
  48. * ...
  49. * the command name will be: 'getUserById'
  50. * </code>
  51. *
  52. * @return command key
  53. */
  54. String commandKey() default "";
  55. /**
  56. * The thread-pool key is used to represent a
  57. * HystrixThreadPool for monitoring, metrics publishing, caching and other such uses.
  58. *
  59. * @return thread pool key
  60. */
  61. String threadPoolKey() default "";
  62. /**
  63. * Specifies a method to process fallback logic.
  64. * A fallback method should be defined in the same class where is HystrixCommand.
  65. * Also a fallback method should have same signature to a method which was invoked as hystrix command.
  66. * for example:
  67. * <code>
  68. * @HystrixCommand(fallbackMethod = "getByIdFallback")
  69. * public String getById(String id) {...}
  70. *
  71. * private String getByIdFallback(String id) {...}
  72. * </code>
  73. * Also a fallback method can be annotated with {@link HystrixCommand}
  74. * <p/>
  75. * default => see {@link com.netflix.hystrix.contrib.javanica.command.GenericCommand#getFallback()}
  76. *
  77. * @return method name
  78. */
  79. String fallbackMethod() default "";
  80. /**
  81. * Specifies command properties.
  82. *
  83. * @return command properties
  84. */
  85. HystrixProperty[] commandProperties() default {};
  86. /**
  87. * Specifies thread pool properties.
  88. *
  89. * @return thread pool properties
  90. */
  91. HystrixProperty[] threadPoolProperties() default {};
  92. /**
  93. * Defines exceptions which should be ignored.
  94. * Optionally these can be wrapped in HystrixRuntimeException if raiseHystrixExceptions contains RUNTIME_EXCEPTION.
  95. *
  96. * @return exceptions to ignore
  97. */
  98. Class<? extends Throwable>[] ignoreExceptions() default {};
  99. /**
  100. * Specifies the mode that should be used to execute hystrix observable command.
  101. * For more information see {@link ObservableExecutionMode}.
  102. *
  103. * @return observable execution mode
  104. */
  105. ObservableExecutionMode observableExecutionMode() default ObservableExecutionMode.EAGER;
  106. /**
  107. * When includes RUNTIME_EXCEPTION, any exceptions that are not ignored are wrapped in HystrixRuntimeException.
  108. *
  109. * @return exceptions to wrap
  110. */
  111. HystrixException[] raiseHystrixExceptions() default {};
  112. /**
  113. * Specifies default fallback method for the command. If both {@link #fallbackMethod} and {@link #defaultFallback}
  114. * methods are specified then specific one is used.
  115. * note: default fallback method cannot have parameters, return type should be compatible with command return type.
  116. *
  117. * @return the name of default fallback method
  118. */
  119. String defaultFallback() default "";
  120. }

DeptProviderHystrix_8081 主启动类开启hystrix注解

  1. package org.springcloud;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
  5. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  6. import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
  7. // 启动类
  8. @SpringBootApplication
  9. // 开启eureka 在服务启动后自动将服务注册到eureka中
  10. @EnableEurekaClient
  11. // 服务发现及DeptController中的discovery方法
  12. @EnableDiscoveryClient
  13. // 添加对熔断的支持
  14. //Enable 启用 ,Circuit- 电路,Breaker 断路器
  15. @EnableCircuitBreaker
  16. public class DeptProviderHystrix_8081 {
  17. public static void main(String[] args) {
  18. SpringApplication.run(DeptProviderHystrix_8081.class, args);
  19. }
  20. }

启动服务访问
image.png
如果访问数据库中没有的信息,模拟异常,查看结果
image.png
隐藏eureka中的地址端口
prefer-ip-address: true #以IP地址注册到服务中心,相互注册使用IP地址

image.png