Sentinel对某一访问进行降级
准备:
AtomicLong 类支持线程安全的自增自减操作
//AtomicLong 类支持线程安全的自增自减操作
private AtomicLong atomicLong=new AtomicLong(1);
@GetMapping("/consumer/doRestEcho1")
public String doRestEcho01() throws InterruptedException {
//consumerService.doGetResource();
//获取自增对象的值,然后再加1
long num=atomicLong.getAndIncrement();
if(num%2==0){//模拟50%的慢调用比例
Thread.sleep(200);
}
String url="http://localhost:8081/provider/echo/"+server;
//远程过程调用-RPC
return restTemplate.getForObject(url,String.class);//String.class调用服务响应数据类型
}
降级
Sentinel异常处理
@Component
public class ServiceBlockExceptionHandler implements BlockExceptionHandler {
@Override
public void handle(HttpServletRequest request, HttpServletResponse response,BlockException e) throws Exception {
//response.setStatus(601);
//设置响应数据的编码
response.setCharacterEncoding("utf-8");
//告诉客户端要响应的数据类型以及客户端以什么编码呈现数据
response.setContentType("application/json;charset=utf-8");
PrintWriter pw=response.getWriter();
Map<String,Object> map=new HashMap<>();
if(e instanceof DegradeException){//降级、熔断
map.put("status",601);
map.put("message", "服务被熔断了!");
}else if(e instanceof FlowException){
map.put("status",602);
map.put("message", "服务被限流了!");
}else{
map.put("status",603);
map.put("message", "Blocked by Sentinel (flow limiting)");
}
//将map对象转换为json格式字符串
String jsonStr=new ObjectMapper().writeValueAsString(map);
pw.println(jsonStr);
pw.flush();
}
}
Sentinel热点
何为热点?热点即经常访问的数据。比如:
1.定义热点业务代码
//http://ip:port/consumer/doFindById?id=10
@GetMapping("/consumer/findById")
@SentinelResource("res")
public String doFindById(@RequestParam("id") Integer id){//对特定资源进行限流
return "resource id is "+id;
}
刷新,显示500 ,限流成功
对特殊参数不限流
当访问参数为1时则不限流
Sentinel系统规则
- Load(仅对 Linux/Unix-like 机器生效):当系统 load1 超过阈值,且系统当前的并发线程数超过系统容量时才会触发系统保护。系统容量由系统的 maxQps * minRt 计算得出。设定参考值一般是 CPU cores * 2.5。
- CPU使用率:当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0)。
- RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。
- 线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
- 入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。
系统保护规则是应用整体维度的,而不是资源维度的,并且仅对入口流量生效。入口流量指的是进入应用的流量(EntryType.IN),比如 Web 服务。
Sentinel授权规则
黑白名单规则(AuthorityRule)非常简单,主要有以下配置项:
资源名:即限流规则的作用对象
流控应用:对应的黑名单/白名单中设置的规则值,多个值用逗号隔开.
授权类型:白名单,黑名单(不允许访问).
@Component
public class DefaultRequestOriginParser implements RequestOriginParser {
@Override
public String parseOrigin(HttpServletRequest request) {
String origin = request.getParameter("origin");
return origin;
}
}
访问:localhost:8090/consumer/doRestEcho1?origin=app1
补充
@Override
public String parseOrigin(HttpServletRequest request) {
// String ip = request.getRemoteAddr();//获取请求参数
// System.out.println(ip);
// return ip;//实现禁用ip
// 获取请求头数据
String token = request.getHeader("token");
return token;
}//授权规则中的黑白名单的值,来自此方法的返回值