文章目录
- 1. 概述
- 2. 使用
- 2.1 服务熔断 - 控制器发生异常触发熔断
- 2.2 服务降级 - 服务提供商依赖的服务岩机触发
1. 概述
Hystrix
- 作用:具备了服务降级、服务熔断、线程隔离、请求缓存、请求合并以及服务监控等强大功能。
雪崩效应
因为一个服务处理缓慢,而导致依赖的服务一同缓慢 - 所谓牵一发而动全身
服务熔断 - Controller层 - 服务故障( 服务提供者异常 )
- 当某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回"错误"的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路 - 应对雪崩效应。
- Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内20次调用失败就会启动熔断机制
- 满足条件的时候,会返回预先设置的数据,而不是无限期的等待 - 最外层做保护
- 例子:某个窗口因为电脑坏了,导致不能进行登记工作。但是该窗口的业务并没有关掉。每当有人过来该窗口进行办理业务的时候。窗口负责人都会说:“电脑发生了故障,今天不能办理业务,明天在来吧!”
服务降级 - 消费者端调用点进行处理( Feign发送请求处进行处理 )- 某些接口不提供,减少服务器负荷(服务消费者 需要消费的 服务提供者岩机)
- 服务内部出错,返回预先准备的数据
- 例子:某个窗口无人访问。但另一个窗口一直有人访问忙不过来。则公司暂时关掉无人访问的窗口。负责该窗口的人去帮助其他忙不过来的窗口
- 例子:订单服务 需要向 产品服务请求获取数据,产品服务关掉服务器导致不能获取数据,以致于订单服务需要使用到降级的数据
2. 使用
2.1 服务熔断 - 控制器发生异常触发熔断
步骤1 - 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
步骤2 - 配置文件
eureka:
client:
#将可用区映射到与eureka服务器通信的完全限定URL列表
service-url:
defaultZone: http://127.0.0.1:1111/eureka/
instance:
#获取要注册到eureka的该实例的唯一ID(在appName范围内) -- 默认为服务名+端口号。
instance-id: orderService
# 表示在猜测主机名时,服务器的IP地址应用于参考操作系统报告的主机名的标志。 -eureka中介存储Ip地址
prefer-ip-address: true
# register-with-eureka: false
# fetch-registry: false
server:
port: 3030
spring:
application:
name: orderService
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/springcloud?serverTimezone=UTC
driver-class-name: com.mysql.jdbc.Driver
mybatis:
type-aliases-package: top.linruchang.order_service.domain
configuration:
cache-enabled: true
lazy-loading-enabled: true
mapper-locations: classpath:/mapper/*Mapper.xml
# 订单服务 请求 产品服务数据的超时时间设置 - 则可能会触发SpringCLoud自身的熔断处理,如果你有自己设置熔断机制的数据,则会返回熔断机制的数据
productService:
ribbon:
# 服务与服务之间的连接、读取时间
ConnectTimeout: 10000
ReadTimeout: 10000
# 设置请求服务提供者等待几秒后触发熔断机制,优先级比上面超时时间高,建议跟Ribbon设置的时间一致
hystrix:
command:
default:
execution:
timeout:
enabled: true
isolation:
thread:
timeoutInMilliseconds: 6000
# 服务降级启动 - 关键
feign:
hystrix:
enabled: true
步骤3 - 服务提供者启动类添加注解@EnableCircuitBreaker
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableCircuitBreaker
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
}
步骤4 - 准备熔断的数据,控制器添加注解@HystrixCommand(fallbackMethod=“熔断数据方法”)
@Controller
@RequestMapping("books")
public class BookController {
// 形参、返回值必须与控制器一致
public JsonModel addFallbackMethod(@PathVariable("id") Integer id) {
JsonModel jsonModel = new JsonModel();
jsonModel.setMsg("发生错误,熔断开启:请求地址含有" + id);
return jsonModel;
}
@PostMapping("{id}")
@ResponseBody
@HystrixCommand(fallbackMethod="addFallbackMethod")
public JsonModel add(@PathVariable("id") Integer id) {
// 用来测试Hystrix熔断机制 - 如果运行到这里发生异常,没有熔断机制的话。服务异常,浏览器访问到的是错误页面。但有熔断机制,服务异常,则有返回addFallbackMethod这个方法的数据
int a = 1/id;
JsonModel jsonModel = new JsonModel();
jsonModel.setSuccess(bookService.add(book) == 1);
jsonModel.setMsg(jsonModel.getSuccess() ? "下单成功":"下单失败");
return jsonModel;
}
}
浏览器访问:books/0 时,则返回addFallbackMethod的数据
2.2 服务降级 - 服务提供商依赖的服务岩机触发
步骤1 - 添加依赖,跟服务熔断一样
步骤2 - 配置文件抄上面的即可,关键是启动服务 降级feign.hystrix.enabled=true
步骤3 - 启动类添加@EnableCircuitBreaker注解
步骤4 - 准备降级数据
订单服务控制器 - 需要获取产品服务的数据
@Controller
@RequestMapping("books")
public class BookController {
@GetMapping("testDemotion")
@ResponseBody
public Product testDemotion() {
return productServiceClient.queryById(1);
}
}
产品服务的接口
// 该注解不但指定产品服务名、而且还要指定产品服务的降级类ProductServiceClientFallback
@FeignClient(name="productService", fallback = ProductServiceClientFallback.class)
public interface ProductServiceClient {
@GetMapping(value = "products/{id}")
@ResponseBody
public Product queryById(@PathVariable("id") Integer id);
@RequestMapping(value = "products/", method = RequestMethod.GET)
@ResponseBody
public List<Product> listUI();
}
服务降级的数据 - 即产品数据岩机或关机后则返回这里的数据
@Component
public class ProductServiceClientFallback implements ProductServiceClient {
@Override
public Product queryById(Integer id) {
Product product = new Product();
product.setName("服务降级成功");
return product;
}
@Override
public List<Product> listUI() {
return null;
}
}
步骤5 - 测试 - 注册测试时需要关闭产品服务才能触发服务降级