概述
前言
Github:https://github.com/yihonglei/thinking-in-springcloud
Eureka注册中心:eureka-server
服务提供者(订单服务):eureka-provider-order
服务容错(用户服务):eureka-consumer-hystrix
一 熔断
在微服务架构中,系统被拆分成多个服务单元,各个单元应用间通过服务注册与订阅方式互相依赖。
每个服务单元在不同的进程中运行,依赖通过远程调用的方式执行,这样就可能出现网络原因,
或者是服务自身出现调用故障或延迟,这些状况会直接导致调用方对外的服务也出现延迟,
如果这个时候调用方的请求还在不断增加,最后就会因为等待出现故障的依赖方响应形成任务的积压,
大量任务积压,就会导致整个服务瘫痪,后果不言而喻。
在现实生活中,断路器是指能够关合、承载和开断正常回路条件下的电流并能关合、
在规定的时间内承载和开断异常回路条件下的电流的开关装置。 断路器可用来分配电能,
不频繁地启动异步电动机,对电源线路及电动机等实行保护,
当它们发生严重的过载或者短路及欠压等故障时能自动切断电路,
其功能相当于熔断器式开关与过欠热继电器等的组合。
在分布式系统中,断路器模式的租用也是类似的,当某个服务单元发生故障之后,
通过断路器的故障监控,向调用方法返回一个自定义错误响应,而不是长时间的等待,
造成分布式系统瘫痪。
Spring Cloud为了解决上面这些问题,基于开源框架Netflix实现了Spring Cloud Hystrix,
该框架的目标在于通过控制哪些访问远程系统、服务等,从而对于网络延迟和故障提供更强大的容错能力。
Hystrix具备很强大的功能,比如服务降级、服务熔断、线程和信号隔离、请求缓存、请求合并以及
服务监控等功能。
让我们通过一个简单例子看下Hystrix是怎么用的。
二 Hystrix项目实例
1、项目结构
2、引入Hystrix依赖包
<!-- 引入断路器依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
3、开启断路器
在启动类中通过注解@EnableCircuitBreaker开启断路器功能。
package com.jpeony.hystrix;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* -- @SpringBootApplication 启动一个Spring Boot应用程序
* -- @EnableDiscoveryClient 服务发现与注册,当应用启动时,将应用注册到配置的注册中心
*
* @author yihonglei
*/
@EnableDiscoveryClient
@SpringBootApplication
@EnableCircuitBreaker
public class ConsumerHystrixApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerHystrixApplication.class, args);
}
}
4、UserService
通过注解@HystrixCommand指定回调方法。
package com.jpeony.hystrix.service;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
/**
* 用户服务
*
* @author yihonglei
*/
@Service
public class UserService {
@Autowired
private RestTemplate restTemplate;
/**
* 调用订单服务,查询用户订单信息
*/
@HystrixCommand(fallbackMethod = "queryOrderInfoFallback")
public String queryOrderInfo() {
ResponseEntity<String> responseEntity =
restTemplate.getForEntity("http://EUREKA-PROVIDER-ORDER/order/queryOrderInfo", String.class);
return responseEntity.getBody();
}
/**
* 当服务调不通时,会调用fallbackMethod对应的容错方法
*/
public String queryOrderInfoFallback() {
// 处理业务逻辑
return "error-hystrix-test";
}
}
5、在Controller中注入Service
package com.jpeony.hystrix.controller;
import com.jpeony.hystrix.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
/**
* -- @RestController这个注解等价于spring mvc用法中的@Controller+@ResponseBody
*
* @author yihonglei
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
/**
* 查询用户订单信息
*/
@RequestMapping(value = "/queryOrderInfo", method = {RequestMethod.GET, RequestMethod.POST})
public String queryOrderInfo() {
return userService.queryOrderInfo();
}
}
三 实例测试
1、启动服务
1)执行eureka-server项目的EurekaServerApplication,启动注册中心;
2)执行eureka-provider-order项目的EurekaOrderApplication,启动服务提供者;
3)执行eureka-consumer-hystrix项目的ConsumerHystrixApplication,启动服务消费者;
2、访问服务
访问路径:http://localhost:8005/user/queryOrderInfo
UserService中调用EUREKA-PROVIDER-ORDER服务,成功返回order服务的结果。
如果我们断开EUREKA-PROVIDER-ORDER服务,访问必然会超时,返回结果。
返回的结果为故障方法结果,也即当访问服务出现故障时,断路器会进行处理,
调用了userService.queryOrderInfo()上配置的回调方法,将回调处理的结果直接返回给了客户端。
我们也可以给EUREKA-PROVIDER-ORDER服务的被调用方法设置一个超时时间返回,
Hystrix默认超时时间为2000毫秒,如果调用EUREKA-PROVIDER-ORDER服务的queryOrderInfo方法
设置2000超时,请求服务超时,将会触发发熔断请求,并执行回调方法,作为调用响应结果返回。
最后
以上就是粗暴外套为你收集整理的【SpringCloud基础】Hystrix熔断器前言一 熔断二 Hystrix项目实例三 实例测试的全部内容,希望文章能够帮你解决【SpringCloud基础】Hystrix熔断器前言一 熔断二 Hystrix项目实例三 实例测试所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复