Sentinel实现区分来源的规则
1.创建MyRequestOriginParser
这里校验了一下Origin,不传则会抛异常,进而会被MyUrlBlockHandler捕获到 因IllegalArgumentException是AuthorityException的子类,所以会授权规则不通过
@Component public class MyRequestOriginParser implements RequestOriginParser { @Override public String parseOrigin(HttpServletRequest httpServletRequest) { String origin = httpServletRequest.getHeader("Origin"); if(StringUtils.isEmpty(origin)){ throw new IllegalArgumentException("Origin is not bu null"); } return origin; } }
share 一下MyUrlBlockHandler
import com.alibaba.csp.sentinel.adapter.servlet.callback.UrlBlockHandler; import com.alibaba.csp.sentinel.slots.block.BlockException; import com.alibaba.csp.sentinel.slots.block.authority.AuthorityException; import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException; import com.alibaba.csp.sentinel.slots.block.flow.FlowException; import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException; import com.alibaba.csp.sentinel.slots.system.SystemBlockException; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class MyUrlBlockHandler implements UrlBlockHandler { @Override public void blocked(HttpServletRequest request, HttpServletResponse response, BlockException ex) throws IOException { ErrorMsg msg = null; if (ex instanceof FlowException) { msg = ErrorMsg.builder() .status(100) .msg("限流了") .build(); } else if (ex instanceof DegradeException) { msg = ErrorMsg.builder() .status(101) .msg("降级了") .build(); } else if (ex instanceof ParamFlowException) { msg = ErrorMsg.builder() .status(102) .msg("热点参数限流") .build(); } else if (ex instanceof SystemBlockException) { msg = ErrorMsg.builder() .status(103) .msg("系统规则(负载/...不满足要求)") .build(); } else if (ex instanceof AuthorityException) { msg = ErrorMsg.builder() .status(104) .msg("授权规则不通过") .build(); } // http状态码 response.setStatus(500); response.setCharacterEncoding("utf-8"); response.setHeader("Content-Type", "application/json;charset=utf-8"); response.setContentType("application/json;charset=utf-8"); // spring mvc自带的json操作工具,叫jackson new ObjectMapper() .writeValue( response.getWriter(), msg ); } } @Data @Builder @AllArgsConstructor @NoArgsConstructor class ErrorMsg { private Integer status; private String msg; }
2. 测试方法
@GetMapping("/{id}") @SentinelResource("SentinelResource-ShareConroller-findById") public ShareDTO findById(@PathVariable("id") Integer id) { return this.shareService.findById(id); }
3. sentinelDashboard 设置规则
意思是只针对于 Origin是GXF的请求 流控