屏蔽ip网站,打开网站代码,html5网站后台页面设计,四川内江网站建设Sentinel 隔离和降级Feign整合Sentinel线程隔离熔断降级熔断策略 授权规则#xff1a;自定义异常 隔离和降级
虽然限流可以尽量避免因高并发而引起的服务故障#xff0c;但服务还会因为其它原因而故障。而要将这些故障控制在一定范用避免雪崩#xff0c;就要靠线程隔离(舱壁… Sentinel 隔离和降级Feign整合Sentinel线程隔离熔断降级熔断策略 授权规则自定义异常 隔离和降级
虽然限流可以尽量避免因高并发而引起的服务故障但服务还会因为其它原因而故障。而要将这些故障控制在一定范用避免雪崩就要靠线程隔离(舱壁模式)和熔断降级。
Feign整合Sentinel
步骤一修改application.yml文件开启Feign的Sentinel功能 cloud:feign:sentinel:enabled: true步骤二给FeignClient编写失败后的降级逻辑 方式1FallbackClass无法对远程调用的异常做处理 方式2FallbackFactory可以对远程调用的异常做处理
用FallbackFactory举例 第一步
public class UserClientFallbackFactory implements FallbackFactoryUserQuery {Overridepublic UserQuery create(Throwable throwable) {return new UserQuery() {Overridepublic User findById(Long id) {log.error(查询用户失败, throwable);return new User();}};}
}第二步
Bean
public UserQueryFallbackFactory userQueryFallbackFactory(){return new UserQueryFallbackFactory();
}第三步
FeignClient(value userservice, fallbackFactory UserQueryFallbackFactory.class)
public interface UserQuery {GetMapping(/user/{id})User findById(PathVariable(id) Long id);
}线程隔离
线程数:是该资源能使用的tomcat线程数的最大值。也就是通过限制线程数量实现舱壁模式。下面图片中就可以直接指定线程数。 线程隔离的两种手段是? 1信号量隔离 2线程池隔离 信号量隔离的特点是? 基于计数器模式简单开销小 线程池隔离的特点是? 基于线程池模式有额外开销但隔离控制更强
熔断降级
熔断降级是解决雪崩问题的重要手段。其思路是由断路器统计服务调用的异常比例、慢请求比例如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求而当服务恢复时断路器会放行访问该服务的请求。其主要分为以下几个状态
熔断策略
断路器熔断策略有三种:慢调用、异常比例、异常数 慢调用:业务的响应时长(RT)大于指定时长的请求认定为慢调用请求。在指定时间内如果请求数量超过设定的最小数量慢调用比例大于设定的阈值则触发熔断。例如: RT超过500ms的调用是慢调用统计最近1000ms内的请求如果请求量超过10次并且慢调用比例不低于0.5则触发熔断熔断时长为5秒。然后进入half-open状态放行一次请求做测试。
异常比例或异常数 异常比例或异常数:统计指定时间内的调用如果调用次数超过指定请求数并且出现异常的比例达到设定的比例阈值(或超过指定异常数)则触发熔断。 统计最近1000ms内的请求如果请求量超过10次并且异常比例不低于0.5则触发熔断熔断时长为5秒。然后进入half-open状态放行一次请求做测试。
授权规则
授权规则可以对调用方的来源做控制有以下两种方式 白名单:来源在白名单内的调用者允许访问 黑名单:来源在黑名单内的调用者不允许访问 Sentinel是通过RequestOriginParser这个接口的parseOrigin来获取请求的来源的
public interface RequestOriginParser { String parseOrigin(HttpServletRequest request);}例如尝试从request中获取一个名为origin的请求头作为origin的值:
public class HeaderOriginParser implements RequestOriginParser {Overridepublic String parseOrigin(HttpServletRequest httpServletRequest) {String origin httpServletRequest.getHeader(origin);if(StringUtils.isEmpty(origin)){return black;}return origin;}
}还需要在gateway服务中利用网关的过滤器添加名为gateway的origin头:
spring:cloud:gateway:default-filters: # 默认过滤器会对所有的路由请求都生效- AddRequestHeaderorigin, gateway # Sentinel授权规则只有从网关服务的才合法通过添加请求头标识自定义异常
默认情况下发生限流、降级、授权拦截时都会抛出异常到调用方。如果要自定义异常时的返回结果需要实现BlockExceptionHandler接口:
Component
public class SentinelExceptionHandler implements BlockExceptionHandler {Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {String msg 未知异常;int status 429;if (e instanceof FlowException) {msg 请求被限流了;} else if (e instanceof ParamFlowException) {msg 请求被热点参数限流;} else if (e instanceof DegradeException) {msg 请求被降级了;} else if (e instanceof AuthorityException) {msg 没有权限访问;status 401;}response.setContentType(application/json;charsetutf-8);response.setStatus(status);response.getWriter().println({\msg\: msg , \status\: status });}
}来源B站黑马学习视频