实战1#简单的使用sentinel的限流功能
1.1背景:spring+servlet项目
1.2引入sentinel的jar包
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.7.2</version>
</dependency>
1.3在自定义filter中使用限流功能
import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* @author zinsanity
* @date 2020-05-27 10:25
* @desc
*/
public class SentinelFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("----SentinelFilter过滤器初始化----");
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("HelloWorld");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
// Set limit QPS to 20.
rule.setCount(5);
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("SentinelFilter执行前!!!");
HttpServletRequest request = (HttpServletRequest) servletRequest;
String resource = request.getHeader("sentinel-resource");
System.out.println("####保护的资源名="+resource);
Entry entry = null;
try {
entry = SphU.entry(resource);
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("SentinelFilter执行后!!!");
} catch (BlockException e1) {
System.out.println("blocked!");
ServletOutputStream out = servletResponse.getOutputStream();
out.write("SentinelFilter BlockException".getBytes());
out.flush();
} finally {
if (entry != null) {
entry.exit();
}
}
}
@Override
public void destroy() {
}
}
注意
1.日志问题
在没有任何指定的情况下,日志会默认输出到这个路径下~/logs/csp/${appName}-metrics.log.xxx,默认解析 main 函数的类名作为应用名${appName}。如果我们想更改appName和日志路径,可以修改jvm的启动参数