千家信息网

阿里巴巴开源Sentinel限流方案搭建是怎样的

发表于:2025-01-26 作者:千家信息网编辑
千家信息网最后更新 2025年01月26日,阿里巴巴开源Sentinel限流方案搭建是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Sentinel是阿里开源
千家信息网最后更新 2025年01月26日阿里巴巴开源Sentinel限流方案搭建是怎样的

阿里巴巴开源Sentinel限流方案搭建是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

Sentinel是阿里开源的一个限流方案框架具有以下特征:

  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。

  • 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。

  • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。

  • 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

一、搭建监控平台

1.下载相应的jar包,地址https://github.com/alibaba/Sentinel/releases

2.启动 java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar -Dsentinel.dashboard.auth.username=sentinel -Dsentinel.dashboard.auth.password=123456 sentinel-dashboard-1.6.3.jar

-Dsentinel.dashboard.auth.username 指定登录名

-Dsentinel.dashboard.auth.password 指定登录密码

3.访问localhost:8080 ,输入用户密码

4.看到如下效果搭建成功

二、客户端使用

以注解使用为例

1.maven依赖

        4.0.0        sentinel-demo-annotation-spring-aop                        org.springframework.boot                spring-boot-starter-parent                2.0.6.RELEASE                                                        com.alibaba.csp                        sentinel-core                        1.6.3                                                        com.alibaba.csp                        sentinel-transport-simple-http                        1.6.3                                                        com.alibaba.csp                        sentinel-annotation-aspectj                        1.6.3                                                        org.springframework.boot                        spring-boot-starter-aop                                                        org.springframework.boot                        spring-boot-starter-web                        

2.配置限流规则方案

/* * Copyright 1999-2018 Alibaba Group Holding Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.alibaba.csp.sentinel.demo.annotation.aop.config;import com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect;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 java.util.ArrayList;import java.util.List;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/** * @author Eric Zhao */@Configurationpublic class AopConfiguration {    @Bean    public SentinelResourceAspect sentinelResourceAspect() {        //配置固定限流规则,每秒为20qps,真对test        List rules = new ArrayList<>();          FlowRule rule = new FlowRule();          rule.setResource("test");          rule.setGrade(RuleConstant.FLOW_GRADE_QPS);          // Set limit QPS to 20.          rule.setCount(20);          rules.add(rule);          FlowRuleManager.loadRules(rules);        return new SentinelResourceAspect();    }}

3.实际应用

/* * Copyright 1999-2018 Alibaba Group Holding Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.alibaba.csp.sentinel.demo.annotation.aop.service;import org.springframework.stereotype.Service;import com.alibaba.csp.sentinel.annotation.SentinelResource;/** * @author Eric Zhao */@Servicepublic class TestServiceImpl implements TestService {    @Override    @SentinelResource(value = "test", blockHandler = "handleException", blockHandlerClass = {ExceptionUtil.class})    public void test() {        System.out.println("Test");    }    @Override    @SentinelResource(value = "hello", fallback = "helloFallback")    public String hello(long s) {        if (s < 0) {            throw new IllegalArgumentException("invalid arg");        }        return String.format("Hello at %d", s);    }    @Override    @SentinelResource(value = "helloAnother", defaultFallback = "defaultFallback",        exceptionsToIgnore = {IllegalStateException.class})    public String helloAnother(String name) {        if (name == null || "bad".equals(name)) {            throw new IllegalArgumentException("oops");        }        if ("foo".equals(name)) {            throw new IllegalStateException("oops");        }        return "Hello, " + name;    }    public String helloFallback(long s, Throwable ex) {        // Do some log here.        ex.printStackTrace();        return "Oops, error occurred at " + s;    }    public String defaultFallback() {        System.out.println("Go to default fallback");        return "default_fallback";    }}
/* * Copyright 1999-2018 Alibaba Group Holding Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.alibaba.csp.sentinel.demo.annotation.aop.controller;import com.alibaba.csp.sentinel.demo.annotation.aop.service.TestService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;/** * @author Eric Zhao */@RestControllerpublic class DemoController {    @Autowired    private TestService service;    @GetMapping("/foo")    public String apiFoo(@RequestParam(required = false) Long t) throws Exception {        if (t == null) {            t = System.currentTimeMillis();        }        service.test();        return service.hello(t);    }    @GetMapping("/baz/{name}")    public String apiBaz(@PathVariable("name") String name) {        return service.helloAnother(name);    }}

4.启动应用,-Dproject.name=test -Dcsp.sentinel.dashboard.server=localhost:8080 访问接口就可以看到监控信息了

-Dproject.name=test 指定监控名称

-Dcsp.sentinel.dashboard.server 指定监控平台地址

三、简单基于注解原理分析

1.sentinel 主要的核心功能由sentinel-core 提供,基于注解的应用主要是依赖于切面的使用,具体的实现如下

/* * Copyright 1999-2018 Alibaba Group Holding Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.alibaba.csp.sentinel.annotation.aspectj;import com.alibaba.csp.sentinel.Entry;import com.alibaba.csp.sentinel.EntryType;import com.alibaba.csp.sentinel.SphU;import com.alibaba.csp.sentinel.annotation.SentinelResource;import com.alibaba.csp.sentinel.slots.block.BlockException;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import java.lang.reflect.Method;/** * Aspect for methods with {@link SentinelResource} annotation. * * @author Eric Zhao */@Aspectpublic class SentinelResourceAspect extends AbstractSentinelAspectSupport {    @Pointcut("@annotation(com.alibaba.csp.sentinel.annotation.SentinelResource)")    public void sentinelResourceAnnotationPointcut() {    }    @Around("sentinelResourceAnnotationPointcut()")    public Object invokeResourceWithSentinel(ProceedingJoinPoint pjp) throws Throwable {        Method originMethod = resolveMethod(pjp);        SentinelResource annotation = originMethod.getAnnotation(SentinelResource.class);        if (annotation == null) {            // Should not go through here.            throw new IllegalStateException("Wrong state for SentinelResource annotation");        }        String resourceName = getResourceName(annotation.value(), originMethod);        EntryType entryType = annotation.entryType();        int resourceType = annotation.resourceType();        Entry entry = null;        try {            entry = SphU.entry(resourceName, resourceType, entryType, pjp.getArgs());            Object result = pjp.proceed();            return result;        } catch (BlockException ex) {            return handleBlockException(pjp, annotation, ex);        } catch (Throwable ex) {            Class[] exceptionsToIgnore = annotation.exceptionsToIgnore();            // The ignore list will be checked first.            if (exceptionsToIgnore.length > 0 && exceptionBelongsTo(ex, exceptionsToIgnore)) {                throw ex;            }            if (exceptionBelongsTo(ex, annotation.exceptionsToTrace())) {                traceException(ex, annotation);                return handleFallback(pjp, annotation, ex);            }            // No fallback function can handle the exception, so throw it out.            throw ex;        } finally {            if (entry != null) {                entry.exit(1, pjp.getArgs());            }        }    }}

与单机的应用其实是一样的,初始化规则,调用SphU的entry方法,判断限流机制

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

0