hystrix 用途
- 熔断机制
- 服务降级
- 服务限流
雪崩效应
1、服务雪崩效应产生原因
所有请求堆积在同一个接口,被一个请求一直阻塞,造成大量请求堆积
- 可以使用jmeter进行压力测试
2、服务雪崩效应解决
- 服务熔断:请求堆积,callback返回错误
- 服务降级:接口隔离,每个接口有独立的线程池,不会造成其他接口堵塞
- 限流机制:nginx、网关zuul、限制单位时间访问最大次数
3、hystrix
ribbon 整合断路器
- 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--ribbon+rest => feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<!--断路器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
- 配置文件
server:
port: 8882
spring:
application:
name: consumer-ribbon
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8888/eureka/
- 启动类配置
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableHystrix
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
/**
* 开启负载均衡
* @return
*/
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
}
- 请求接口加入断路器
@RestController
public class OrderController {
@Autowired
RestTemplate restTemplate;
@RequestMapping("/getUserList")
@HystrixCommand(fallbackMethod = "fallError")
public List<String> hiService() {
return restTemplate.getForObject("http://server-client/getUserList", List.class);
}
/**
* 熔断调用方法
* 默认阈值:20次/5s
* @return
*/
public List<String> fallError(){
List<String> result = new ArrayList<>();
result.add( "调用服务异常");
return result;
}
}
feign 整合断路器
feign默认包含hystric 依赖
- 修改feign接口,加入断路器
@FeignClient(value = "server-client",fallback = UserServiceHystric.class)
public interface UserService {
/**
* 服务接口
* @return
*/
@RequestMapping(value = "/getUserList")
List<String> getUserList();
}
- 断路器
@Service
public class UserServiceHystric implements UserService {
/**
* 对某个接口的所有方法进行短路异常处理
* @return
*/
@Override
public List<String> getUserList() {
// Thread.sleep(4000)
List<String> result = new ArrayList<>();
result.add( "调用服务异常");
return result;
}
}
- 修改配置文件
server:
port: 8883
tomcat:
max-threads: 50
spring:
application:
name: service-feign
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8888/eureka/
feign:
hystrix:
enabled: true
###超时时间
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 4000