【持续更新】Sentinel实战

410 阅读1分钟

实战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的启动参数