Solon 框架如何方便获取每个请求的响应时间?
经常会有同学问 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 框架如何方便获取每个请求的响应时间?的更多相关文章
- 【Spring学习笔记-MVC-5】利用spring MVC框架,实现ajax异步请求以及json数据的返回
作者:ssslinppp 时间:2015年5月26日 15:32:51 1. 摘要 本文讲解如何利用spring MVC框架,实现ajax异步请求以及json数据的返回. Spring MV ...
- 第三百一十五节,Django框架,CSRF跨站请求伪造
第三百一十五节,Django框架,CSRF跨站请求伪造 全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.midd ...
- scrapy框架的日志等级和请求传参, 优化效率
目录 scrapy框架的日志等级和请求传参, 优化效率 Scrapy的日志等级 请求传参 如何提高scripy的爬取效率 scrapy框架的日志等级和请求传参, 优化效率 Scrapy的日志等级 在使 ...
- Solon Web 开发,四、请求上下文
Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...
- 速战速决 (6) - PHP: 获取 http 请求数据, 获取 get 数据 和 post 数据, json 字符串与对象之间的相互转换
[源码下载] 速战速决 (6) - PHP: 获取 http 请求数据, 获取 get 数据 和 post 数据, json 字符串与对象之间的相互转换 作者:webabcd 介绍速战速决 之 PHP ...
- 【openresty】获取post请求数据FormInputNginxModule模块
关于openresty的一些介绍看这里. 首先,实验背景为openresty作为后台来处理前台post传递的数据. 在openresty内,有一个FormInputNginxModule模块,作用是解 ...
- WCF和WebService中获取当前请求报文的方法
WCF中: 1. 在hosting WCF的web.config中加入: <system.serviceModel> <serviceHostingEnvironment aspNe ...
- curl获取http请求的状态码
$curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); //设置头文件的信息作为数据流输出 curl_setopt($curl, CUR ...
- VS2008 C++ 利用WinHttp API获取Http请求/响应头部Header
http://www.cnblogs.com/LCCRNblog/p/3833472.html 这一篇博客中,实现了获取http请求/响应后的html源码,现在需要获取http请求/响应的头部Head ...
随机推荐
- Python - pip 批量更新
pip 常用命令 https://www.cnblogs.com/poloyy/p/15170968.html pip list 结合 Linux 命令 pip list 命令可以查询已安装的库,结合 ...
- MongoDB(10)- 查询嵌套文档
插入测试数据 db.inventory.insertMany( [ { item: "journal", qty: 25, size: { h: 14, w: 21, uom: & ...
- Intel® QAT加速卡之Ring & Ring Bank
1. QAT的应用模式 Intel 通讯系列芯片对于每种受支持的加速服务(加密,数据压缩),都支持以下应用模式: 内核模式,其中应用程序和加速服务都在内核中运行空间. 用户空间直接访问在用户空间中运行 ...
- pluto中监听各个网口的500端口处理逻辑
1. pluto中监听各个网口的500端口处理逻辑 whack_handle() find_ifaces() find_raw_ifaces4() socket.setsockopt.bind.ioc ...
- TCP头部格式和封装
文章目录 12.3 TCP头部和封装 12.3.1 端口号 12.3.2 序列号 12.3.3 头部长度 12.3.4 相关控制位 12.3.5 窗口大小 12.3.6 校验和 12.3.7 选项字段 ...
- 深入浅出 BPF TCP 拥塞算法实现原理
本文地址:https://www.ebpf.top/post/ebpf_struct_ops 1. 前言 eBPF 的飞轮仍然在快速转动,自从 Linux 内核 5.6 版本支持 eBPF 程序修改 ...
- 【PHP数据结构】其它排序:简单选择、桶排序
这是我们算法正式文章系列的最后一篇文章了,关于排序的知识我们学习了很多,包括常见的冒泡和快排,也学习过了不太常见的简单插入和希尔排序.既然今天这是最后一篇文章,也是排序相关的最后一篇,那我们就来轻松一 ...
- 使用OPCache提升PHP的性能
对于 PHP 这样的解释型语言来说,每次的运行都会将所有的代码进行一次加载解析,这样一方面的好处是代码随时都可以进行热更新修改,因为我们不需要编译.但是这也会带来一个问题,那就是无法承载过大的访问量. ...
- js判断访客来源网址和关键字
加入现在有A.B两个站,A为友站,B为我站. 希望判断使用从A站连来时,就把访问者拒绝在门外,只要用简单几行的javascript,就可抓到使用的来源,以及作出一些防范的措施. <script ...
- Shell系列(15)- 数值运算方法
数值运算-方法1 declare -i [root@localhost ~]# aa=11 [root@localhost ~]# aa=22 #给变量aa和bb赋值 [root@localhos ...