sentinel-adapter模块

作者: 博恒NO1 | 来源:发表于2018-09-18 16:50 被阅读0次

sentinel-adapter模块,见名知意,这个模块的职能是适配,目前适配主流的框架有dubbo,grpc和web.

由于最了解的是dubbo,目前就先以dubbo为例子进行讲解。

由于dubbo框架的设计思想,具体不展开了,有兴趣可以去了解下,我后续也会写dubbo源码分析。

如下面三个配置的filter,在dubbo请求时会执行到:SentinelDubboProviderFilter,SentinelDubboConsumerFilter和DubboAppContextFilter 的invoke方法

sentinel.dubbo.provider.filter=com.alibaba.csp.sentinel.adapter.dubbo.SentinelDubboProviderFilter

sentinel.dubbo.consumer.filter=com.alibaba.csp.sentinel.adapter.dubbo.SentinelDubboConsumerFilter

dubbo.application.context.name.filter=com.alibaba.csp.sentinel.adapter.dubbo.DubboAppContextFilter

干货

源码分析SentinelDubboProviderFilter  dubbo调用方:

public Resultinvoke(Invoker invoker, Invocation invocation)throws RpcException {

    // Get origin caller.

//获取客户端 消费方是否包含dubboApplication数据,标明调用方身份

    String application = DubboUtils.getApplication(invocation, "");

    Entry interfaceEntry =null;

    Entry methodEntry =null;

    try {

        String resourceName = getResourceName(invoker, invocation);

        String interfaceName = invoker.getInterface().getName();

       //将数据加载到容器中保存

        ContextUtil.enter(resourceName, application);

        //设置资源保护,接口级别接口保护

        interfaceEntry = SphU.entry(interfaceName, EntryType.IN);

        //设置资源保护,方法级别接口保护

        methodEntry = SphU.entry(resourceName, EntryType.IN, 1, invocation.getArguments());

        //调用

        Result result = invoker.invoke(invocation);

        if (result.hasException()) {

//统计异常比例

Tracer.trace(result.getException());

        }

return result;

    }catch (BlockException e) {

//当出现拒绝后,进入fallback,可定制化fallback,默认DefaultDubboFallback,抛出SentinelRpcException异常

return DubboFallbackRegistry.getProviderFallback().handle(invoker, invocation, e);

    }catch (RpcException e) {

//统计异常比例

Tracer.trace(e);

        throw e;

    }finally {

if (methodEntry !=null) {

//清理方法级别资源

methodEntry.exit(1, invocation.getArguments());

        }

if (interfaceEntry !=null) {

//清理接口级别资源

interfaceEntry.exit();

        }

//清理

ContextUtil.exit();

    }

}

源码分析DubboAppContextFilter  dubbo被调用方:

@Override

public Resultinvoke(Invoker invoker, Invocation invocation)throws RpcException {

String application = invoker.getUrl().getParameter(Constants.APPLICATION_KEY);

    if (application !=null) {

RpcContext.getContext().setAttachment(DubboUtils.DUBBO_APPLICATION_KEY, application);

    }

return invoker.invoke(invocation);

}

写入自定义的dubboApplication命名

源码分析SentinelDubboConsumerFilter  dubbo被调用方:

@Override

public Resultinvoke(Invoker invoker, Invocation invocation)throws RpcException {

Entry interfaceEntry =null;

    Entry methodEntry =null;

    try {

//获取调用方接口名称

String resourceName = getResourceName(invoker, invocation);

        ContextUtil.enter(resourceName);

//设置资源保护,接口级别接口保护

        interfaceEntry = SphU.entry(invoker.getInterface().getName(), EntryType.OUT);

//设置资源保护,方法级别接口保护

        methodEntry = SphU.entry(resourceName, EntryType.OUT);

        Result result = invoker.invoke(invocation);

        if (result.hasException()) {

//统计异常比例

            Tracer.trace(result.getException());

        }

return result;

    }catch (BlockException e) {

//fallback

return DubboFallbackRegistry.getConsumerFallback().handle(invoker, invocation, e);

    }catch (RpcException e) {

//统计异常比例

Tracer.trace(e);

        throw e;

    }finally {

if (methodEntry !=null) {

//资源释放

methodEntry.exit();

        }

if (interfaceEntry !=null) {

//资源释放

interfaceEntry.exit();

        }

//资源释放

ContextUtil.exit();

    }

}

相关文章

  • sentinel-adapter模块

    sentinel-adapter模块,见名知意,这个模块的职能是适配,目前适配主流的框架有dubbo,grpc和w...

  • 限流降级框架Sentinel之源码结构

    包结构 如图所示 sentinel-adapter:适配器 sentinel-dubbo-adapter:sent...

  • python常用模块!!

    os模块: stat模块: sys模块: hashlib,md5模块: random模块: types模块: at...

  • 2018-08-19

    Angular 2 技能图谱 模块 自定义模块 根模块 特性模块 共享模块 核心模块 内置模块 Applicati...

  • 【时间管理100讲】精髓全在这里啦

    理论模块 精力管理。 行动管理。 学习模块。 高空模块。 反思模块。 运动模块。 阅读模块。 旅行模块。 人际关系...

  • python基础学习(三)

    常用模块 String模块 数学模块 随机模块 OS模块 os.path模块 re模块 常用函数及操作 列表操作 ...

  • day10-异常处理和pygame显示

    一、异常处理 1.模块 导入模块(自定义模块,第三方模块)import 模块 ---->模块.内容from 模块 ...

  • 重点知识复习(异常处理)

    1.模块 导入模块(自定义模块,第三方模块,系统其他模块)import 模块 ----> 模块.内容from 模...

  • Python常用模块

    Python常用模块之time模块 Python常用模块之os模块 Python常用模块之sys模块 Python...

  • nodejs-模块

    nodejs模块 一、nodejs模块分类 1.核心模块 Core Module、内置模块、原生模块 fs模块 p...

网友评论

    本文标题:sentinel-adapter模块

    本文链接:https://www.haomeiwen.com/subject/krbpnftx.html