Hystrix服务降级的两种处理方式@HystrixCommand注解和定义统一fallback接口
问题答疑:Hystrix服务保护框架,在微服务中Hystrix能够为我们解决哪些问题?1.断路器2.服务降级3.服务熔断4.服务隔离机制5.服务雪崩效应 连环雪崩效应 如果严重的话,可能会导致整个微服务接口无法访问,所有服务器都会瘫痪.基于Hystrix解决服务雪崩效应原理:服务降级...
项目地址: 链接:https://pan.baidu.com/s/1Mxo0ltvZbpz_r8mCU-mSpw
提取码:3j4a
问题答疑:
Hystrix服务保护框架,在微服务中Hystrix能够为我们解决哪些问题?
1.断路器
2.服务降级
3.服务熔断
4.服务隔离机制
5.服务雪崩效应 连环雪崩效应 如果严重的话,可能会导致整个微服务接口无法访问,所有服务器都会瘫痪.
基于Hystrix解决服务雪崩效应原理:
服务降级
1.在高并发的情况下,防止用户一直等待.使用服务降级方式(返回一个友好的提示直接给客户端,不会去处理请求,调用fallBack)
目的是为了用户体验.
2.场景:秒杀-----当前请求人数过多,请稍后尝试. (在tomcat中没有线程进行处理客户端请求的时候,不应该让用户一直转圈等待)
3.如果调用其他接口超时的时候(默认是1秒时间),如果在一秒钟没有及时响应返回的话,(默认情况下业务逻辑是可以执行的)则直接执行服务降级.
服务隔离机制
服务熔断目的是为了保护服务,在高并发情况下,如果请求达到了一定的极限(可以自己设置阈值).如果流量
超出了设置的阈值,自动开启保护服务功能,使用服务降级方式返回友好提示.熔断机制和服务降级一起使用.
服务熔断
隔离方式线程池和信号量隔离.
线程池隔离:每个服务接口都有自己独立的线程池,每个线程池互不影响,缺点:CPU占用率非常高.不是所有
的接口都去采用线程池隔离,核心关键接口.
源码地址 : 链接:https://pan.baidu.com/s/17-cFGA3fJFLF8gcnDZdWXg
提取码:1q9z 具体见解压说明文件
1.先说常用和推荐使用的一种方式: 定义统一fallback接口
1.pom.xml依赖
<!--Hystrix断路器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2.application.properties配置文件
#指定运行端口
server.port=8200
#服务名称
spring.application.name=order
#获取注册实例列表
eureka.client.fetch-registry=true
#注册到Eureka的注册中心
eureka.client.register-with-eureka=true
#配置注册中心地址
#eureka.client.zhang.service-url.defaultZone=http://localhost:8001/eureka/
eureka.client.service-url.defaultZone=http://localhost:8000/eureka/
#feign客户端建立连接超时时间
feign.client.config.default.connect-timeout=10000
#feign客户端建立连接后读取资源超时时间
feign.client.config.default.read-timeout=10000
#开启Hystrix断路器
feign.hystrix.enabled=true
#配置Hystrix 超时时间 超时关闭
#hystrix.command.default.execution.timeout.enabled=false
#超时时间(默认1000ms)在调用方配置,被该调用方的所有方法的超时时间都是该值,优先级低于下边的指定配置
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=3000
#在调用方配置,被该调用方的指定方法(HystrixCommandKey方法名)的超时时间是该值
hystrix.command.HystrixCommandKey.execution.isolation.thread.timeoutInMilliseconds=4000
#线程池核心线程数 默认为10
hystrix.threadpool.default.coreSize=10
#最大排队长度。默认-1 如果要从-1换成其他值则需重启,即该值不能动态调整,若要动态调整,需要使用到下边这个配置
hystrix.threadpool.default.maxQueueSize=100
#排队线程数量阈值,默认为5,达到时拒绝,如果配置了该选项,队列的大小是该队列
hystrix.threadpool.default.queueSizeRejectionThreshold=5
# 简言之,10s内请求失败数量达到20个,断路器开。 当在配置时间窗口内达到此数量的失败后,进行短路。默认20个
hystrix.command.default.circuitBreaker.requestVolumeThreshold=20
#短路多久以后开始尝试是否恢复,默认5s
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=5
#出错百分比阈值,当达到此阈值后,开始短路。默认50%
hystrix.command.default.circuitBreaker.errorThresholdPercentage=50%
#调用线程允许请求HystrixCommand.GetFallback()的最大数量,默认10。超出时将会有异常抛出,注意:该项配置对于THREAD隔离模式也起作用
hystrix.command.default.fallback.isolation.semaphore.maxConcurrentRequests=50000
3.定义Feign调用接口,和新建统一fallback处理类并实现Feign调用接口
@FeignClient(value = "member",fallback = MemberServiceFallback.class)
public interface MemberServiceFeign extends IMemberService {
//此处为方便调用member服务的接口,采用直接继承member服务接口 不易写错且减少代码量
//@FeignClient(value = "member",fallback = MemberServiceFallback.class)
//value值为被调用服务名 fallback 值为 统一定义的fallback 类
}
@Component
public class MemberServiceFallback implements MemberServiceFeign {
@Override
public UserEntity getMember(String name) {
return null;
}
//服务降级友好提示
@Override
public ResultVO getUserinfo() {
return new ResultVO(StatusCode.RESULT_SUCCESS,"服务器忙!请稍后重试!!!");
}
}
4.启动类
@SpringBootApplication
@EnableEurekaClient //开启eureka客户端
@EnableFeignClients //开启feign调用
@EnableHystrix //开启hystrix
public class AppOrder {
public static void main(String[] args) {
SpringApplication.run(AppOrder.class, args);
}
}
5.Feign调用服务降级测试接口(被调用member服务接口实现,睡眠5秒,配置超时3秒,故会超时)
@RestController
public class OrderServcieImpl implements IOrderService {
@Autowired
private MemberServiceFeign memberServiceFeign;
//hystrix第二种写法,使用类方式
@RequestMapping("/orderToMemberUserInfoHystrixDemo02")
public ResultVO orderToMemberUserInfoHystrixDemo02() {
System.out.println("orderToMemberUserInfoHystrixDemo02: 线程池名称:"+Thread.currentThread().getName());
return memberServiceFeign.getUserinfo();
}
}
@Override
@RequestMapping("/getUserinfo")
public ResultVO getUserinfo() {
try {
Thread.sleep(5000);
}catch (Exception e){
e.printStackTrace();
}
return new ResultVO(StatusCode.RESULT_SUCCESS,"订单服务接口调用会员服务接口成功...."+serverPort);
}
}
6.启动eureka member order 等服务,测试
2.@HystrixCommand注解方式
1.pom.xml文件 application.properties配置文件 启动类 同方法一 Feign调用服务接口 不要fallback
2.测试代码
//解决服务雪崩效应 hystrix有两种方式配置保护服务 通过注解和接口形式
//fallbackMethod 方法的作用:服务降级执行
//@HystrixCommand 默认开启了线程池隔离方式 ,服务降级,服务熔断
@HystrixCommand(fallbackMethod = "orderToMemberUserInfoHystrixFallbackMethod")
@RequestMapping("/orderToMemberUserInfoHystrix")
public ResultVO orderToMemberUserInfoHystrix() {
System.out.println("orderToMemberUserInfoHystrix: 线程池名称:"+Thread.currentThread().getName());
return memberServiceFeign.getUserinfo();
}
//服务降级处理方法
public ResultVO orderToMemberUserInfoHystrixFallbackMethod(){
return new ResultVO(StatusCode.RESULT_SUCCESS,"返回友好提示:服务降级 !!! 服务器忙,请稍后重试!!!!");
}
3.启动服务,调用接口测试
更多推荐
所有评论(0)