经常会有同学问 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. Shell中的运算

    1.运算方式及运算符号 2.SHELL 中常用的运算命令 3.相关操作演示 1.用脚本写一个10秒倒计时 脚本的执行: 2.编写脚本,1分10秒的倒计时 执行脚本: 3.编写脚本,制作一个计算器 脚本 ...

  2. 小程序 mpvue page "xxx" has not been registered yet

    新增了几个页面,改了下目录结构,就开始报这个错. 重启了几次不管用,google 一番也无果. 灵机一动试一下 build npm run build build 版本没报错,OK 然后 $ rm - ...

  3. Mac超好用的软件合集和系统设置

    软件篇 这些软件好像只有动态壁纸是收费的. 推荐的都是特别小巧,更加专注特定功能,没那么多花里胡哨.当然你们有什么更好用的也可以推荐. 简单,好用才是我最喜欢的. Bob Github开源,Bob 是 ...

  4. Python之psutil-进程管理

    在给PC端应用做自动化测试或者监测应用性能时,不可避免的会与进程管理打交道,python中的psutil模块能够帮助我们处理进程,它主要用于系统监视.分析和限制进程资源以及管理正在运行的进程.一起来了 ...

  5. shell循环语句until

    until 条件 do 执行命令 done until 循环与 while 循环在处理方式上刚好相反. 当条件成立的时候,停止循环.

  6. Django实现基本的页面分页

    1.视图views.py from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage def index(requ ...

  7. 迭代器生成器阅读【Python3.8官网文档】

    目录 1.迭代器 2.生成器 2.1.yield 表达式 2.2.简要理解概念 2.3.生成器-迭代器的方法 2.4.生成器理解 2.5.例子 3.生成器表达式 1.迭代器 for element i ...

  8. SpringSecurity-Shiro-初见

    目录 简介 实战环境搭建 SpringSecurity 认证和授权 权限控制和注销 记住我 Shiro 快速上手 shiro整合mybais 简介 在 Web 开发中,安全一直是非常重要的一个方面. ...

  9. 计算字符串的长度.len,RuneCountInString

    内置函数len(),可以返回字符串/数组/切片/map/channel的长度. unicode/utf8包 函数:RuneCountInString(输入一个字符串),返回int类型的字符串长度.由于 ...

  10. 【PHP数据结构】PHP数据结构及算法总结

    断断续续地把这个系列写完了,就像上一个设计模式一样,算法这个系列也是前前后后写了将近有一年的时间.当然,都是在业余或者晚上的时间写完的,所以进度如此地慢.更主要的是,既然要写,总得要自己先弄懂吧,对于 ...