经常会有同学问 Solon 怎样才能获取每个请求的响应时间?要求是不需要给每个函数加注解。故此,整理了一下。

不给每个函数加注解,主要有两种方式可以获取请求响应时间:

方式1:基于全局过滤器

SolonApp app = Solon.start(TestApp.class, args);

//全局过滤器
app.filter((ctx, chain) -> {
//记录开始时间
long start = System.currentTimeMillis();
try {
chain.doFilter(ctx);
} finally {
//获得耗时
long elapsed = (System.currentTimeMillis() - start);
}
});

方式2:基于处理链 + 上下文特性

SolonApp app = Solon.start(TestApp.class, args);

//前置处理
app.before(c -> c.attrSet("start", System.currentTimeMillis())); //后置处理
app.after(c -> {
long start = c.attr("start", 0L);
long elapsed = (System.currentTimeMillis() - start);
});

其实也还有第三种,基于控制器基类;以及第四种基于轻网关。

方式3:基于控制器基类(和方式1 有点儿像)

//1.定义基类(增加包围拦截注入)
@Around(TimeInterceptor.class)
public class ControllerBase {
} //2.定义拦截器
public class TimeInterceptor implements Interceptor {
@Override
public Object doIntercept(Invocation inv) throws Throwable {
long start = System.currentTimeMillis();
try {
return inv.invoke();
} finally {
long elapsed = (System.currentTimeMillis() - start);
}
}
} //3.应用
@Controller
public class DemoController extends ControllerBase{
@Mapping("/hell")
public void hello(){ }
}

方式4:基于轻网关的处理链

//轻一点的示例
@Mapping("/API/V1/**")
@Controller
public class ApiGateway extends Gateway {
@Override
protected void register() {
before(new StartHandler()); //开始计时 after(new OutputBuildHandler());//构建输出内容
after(new OutputHandler());//输出
after(new EndBeforeLogHandler());//记录日志
after(new EndHandler("API"));//结束计时,并上报 addBeans(bw -> "api".equals(bw.tag()));
}
} //重一点的示例
@Mapping("/API/V2/**")
@Controller
public class ApiGatewayOfApp extends UapiGateway {
@Override
protected void register() {
filter(new BreakerFilter()); //融断 before(new StartHandler()); //开始计时
before(new ParamsParseHandler()); //参数解析
before(new ParamsSignCheckHandler(new Md5Encoder())); //参数签名较验
before(new ParamsRebuildHandler(new AesDecoder())); //参数重构
before(new ParamsNeedCheckHandler("g_lang"));//参数必要性检查//即公共参数
before(new ParamsLocaleHandler()); after(new OutputBuildHandler(new AesEncoder())); //输出构建
after(new OutputSignHandler(new Md5Encoder())); //输出签名
after(new OutputHandler()); //输出
after(new EndBeforeLogHandler()); //日志
after(new EndHandler("app.v1")); //结束计时 addBeans(bw -> "api".equals(bw.tag()));
}
}

有这方面困惑的同学,希望能看到此文。

关于 Solon ?

Solon 是一个轻量的Java基础开发框架。强调,克制 + 简洁 + 开放的原则;力求,更小、更快、更自由的体验。支持:RPC、REST API、MVC、Job、Micro service、WebSocket、Socket 等多种开发模式。短小而精悍!

关于 Solon Cloud ?

Solon Cloud 是一系列的接口标准和配置规范,相当于DDD模式里的防腐层概念。是 Solon 的微服务架构模式开发解决方案。

项目地址 ?

Solon 框架如何方便获取每个请求的响应时间?的更多相关文章

  1. 【Spring学习笔记-MVC-5】利用spring MVC框架,实现ajax异步请求以及json数据的返回

    作者:ssslinppp      时间:2015年5月26日 15:32:51 1. 摘要 本文讲解如何利用spring MVC框架,实现ajax异步请求以及json数据的返回. Spring MV ...

  2. 第三百一十五节,Django框架,CSRF跨站请求伪造

    第三百一十五节,Django框架,CSRF跨站请求伪造  全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.midd ...

  3. scrapy框架的日志等级和请求传参, 优化效率

    目录 scrapy框架的日志等级和请求传参, 优化效率 Scrapy的日志等级 请求传参 如何提高scripy的爬取效率 scrapy框架的日志等级和请求传参, 优化效率 Scrapy的日志等级 在使 ...

  4. Solon Web 开发,四、请求上下文

    Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...

  5. 速战速决 (6) - PHP: 获取 http 请求数据, 获取 get 数据 和 post 数据, json 字符串与对象之间的相互转换

    [源码下载] 速战速决 (6) - PHP: 获取 http 请求数据, 获取 get 数据 和 post 数据, json 字符串与对象之间的相互转换 作者:webabcd 介绍速战速决 之 PHP ...

  6. 【openresty】获取post请求数据FormInputNginxModule模块

    关于openresty的一些介绍看这里. 首先,实验背景为openresty作为后台来处理前台post传递的数据. 在openresty内,有一个FormInputNginxModule模块,作用是解 ...

  7. WCF和WebService中获取当前请求报文的方法

    WCF中: 1. 在hosting WCF的web.config中加入: <system.serviceModel> <serviceHostingEnvironment aspNe ...

  8. curl获取http请求的状态码

    $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); //设置头文件的信息作为数据流输出 curl_setopt($curl, CUR ...

  9. VS2008 C++ 利用WinHttp API获取Http请求/响应头部Header

    http://www.cnblogs.com/LCCRNblog/p/3833472.html 这一篇博客中,实现了获取http请求/响应后的html源码,现在需要获取http请求/响应的头部Head ...

随机推荐

  1. 理解ASP.NET Core - [03] Dependency Injection

    注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 依赖注入 什么是依赖注入 简单说,就是将对象的创建和销毁工作交给DI容器来进行,调用方只需要接 ...

  2. Java编程:为什么Class实例可以不是全局唯一

    通过定义两个类加载器加载同一字节码文件来证明Class实例为什么不是全局唯一的 1.将一个名为Demo(没有后缀)的字节码文件放在D盘根目录 2.定义两个类加载器 自定义ClassLoader三要素: ...

  3. 这款打怪升级的小游戏,7 年前出生于 GitHub 社区,如今在谷歌商店有 8 万人打了满分

    今天我在 GitHub 摸鱼寻找新的"目标"时,发现了一个开源项目是 RougeLike 类的角色扮演游戏「破碎版像素地牢」(Shattered Pixel Dungeon)类似魔 ...

  4. Appium问题解决方案(2)- AttributeError:module 'appium.webdriver' has no attribute 'Remote'

    背景 运行脚本的时候,就直接报这个错误了,然后去看了下 appium.webdriver 库 结果发现啥都没有,就知道有问题了,然后一步步排查 步骤一 检查Appium-Python-Client 和 ...

  5. Jenkins(6)- 新建用户

    如果想从头学起Jenkins的话,可以看看这一系列的文章哦 https://www.cnblogs.com/poloyy/category/1645399.html 进入用户管理 点击新建用户 填写新 ...

  6. 经典多级时间轮定时器(C语言版)

    经典多级时间轮定时器(C语言版) 文章目录 经典多级时间轮定时器(C语言版) 1. 序言 2. 多级时间轮实现框架 2.1 多级时间轮对象 2.2 时间轮对象 2.3 定时任务对象 2.4 双向链表 ...

  7. 简说yuv

    最近弄了一个读取y4m文件转成yuv的流的事情,记录一些yuv相关的细节 为什么会有yuv 因为我们目前的显示器显示的原理都是三原色,几乎所有的视频数据最后都要转为rgb格式才能渲染到显示屏上,而原始 ...

  8. Stream 流

    Stream流(接口不是函数接口) 描述 在java.1.8中,由于 lambda表达式这种函数编程jdk引入了一个全新的改变Stream流它是用来解决已有集合类库的一些弊端的. Stream是jav ...

  9. 升级到windows10之后的骚操作,安装debian,centos7,支持linux、docker、kubectl命令

    修改Windows10默认字体和图标很大 打开Hyper-V Windows10下载Docker Desktop https://www.docker.com/products/docker-desk ...

  10. Ubuntu管理员手册

    hostname cat /etc/hosts apt-get install iproute2 iproute2-doc ip a ps -aux