从零开始手写 dubbo rpc 框架-14-interceptor-拦截器

拦截器

说明

有时候我们需要统计方法的耗时,需要知道统计出参/入参的相关信息。

通过拦截器都可以非常方便的实现。

设计思路

无论是客户端还是服务端,只需要在方法执行前后,加入拦截器相关的方法调用,加入对应的上下文信息即可。

客户端实现

个人理解

目前主要在客户端添加拦截器,其实服务端是类似的。

接口

public interface Interceptor {

    /**
     * 开始
     * @param context 上下文
     * @since 0.1.4
     */
    void before(final InterceptorContext context);

    /**
     * 结束
     * @param context 上下文
     * @since 0.1.4
     */
    void after(final InterceptorContext context);

    /**
     * 异常处理
     * @param context 上下文
     * @since 0.1.4
     */
    void exception(final InterceptorContext context);

}

实现

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 状态判断
        //...

        //1. 拦截器
        final Interceptor interceptor = proxyContext.interceptor();
        final InterceptorContext interceptorContext = DefaultInterceptorContext.newInstance()
                .traceId(traceId);
        interceptor.before(interceptorContext);

        // 构建基本调用参数
        //...

        //proxyContext 中应该是属于当前 service 的对应信息。
        // 每一次调用,对应的 invoke 信息应该是不通的,需要创建新的对象去传递信息
        // rpcRequest 因为要涉及到网络间传输,尽可能保证其简洁性。
        //...

        //3. 执行远程调用
        //...

        interceptor.after(interceptorContext);
        return result;
    }

本期为了简单,暂时没有处理异常相关的拦截处理。

测试代码

register

启动

server

启动

client

  • 测试代码

客户端配置指定耗时拦截器。

config.interceptor(new CostTimeInterceptor());
  • 日志
[INFO] [2019-11-01 23:26:10.337] [main] [c.g.h.r.c.s.i.i.CostTimeInterceptor.after] - [Interceptor] cost time 49 mills for traceId: 6de5c8da8c784801921a2d2887f6e543
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值