轻量级web框架cicada----(转)
源码地址:
https://github.com/TogetherOS/cicada
快速启动
下面来看看如何快速启动一个 HTTP 服务。
只需要创建一个 Maven 项目,并引入核心包。
<dependency>
<groupId>top.crossoverjie.opensource</groupId>
<artifactId>cicada-core</artifactId>
<version>1.0.0</version>
</dependency>
如上图所示,再配置一个启动类即可。
public class MainStart {
public static void main(String[] args) throws InterruptedException {
CicadaServer.start(MainStart.class,"/cicada-example") ;
}
}
配置业务 Action
当然我们还需要一个实现业务逻辑的地方。cicada 提供了一个接口,只需要实现该接口即可实现具体逻辑。
创建业务 Action 实现 top.crossoverjie.cicada.server.action.WorkAction 接口。
@CicadaAction(value = "demoAction")
public class DemoAction implements WorkAction {
private static final Logger LOGGER = LoggerBuilder.getLogger(DemoAction.class) ;
private static AtomicLong index = new AtomicLong() ;
@Override
public void execute(CicadaContext context, Param param) throws Exception {
String name = paramMap.getString("name");
Integer id = paramMap.getInteger("id");
LOGGER.info("name=[{}],id=[{}]" , name,id);
DemoResVO demoResVO = new DemoResVO() ;
demoResVO.setIndex(index.incrementAndGet());
WorkRes<DemoResVO> res = new WorkRes();
res.setCode(StatusEnum.SUCCESS.getCode());
res.setMessage(StatusEnum.SUCCESS.getMessage());
res.setDataBody(demoResVO) ;
context.text(res.toString());
}
}
同时需要再自定义类中加上 @CicadaAction 注解,并需要指定一个 value,该 value 主要是为了在请求路由时能找到业务类。
这样启动应用并访问
http://127.0.0.1:7317/cicada-example/demoAction?name=12345&id=10
便能执行业务逻辑同时得到服务端的返回。

目前默认支持的是 json 响应,后期也会加上模板解析。
服务中也会打印相关日志。

灵活的参数配置
这里所有的请求参数都封装在 Param 中,可以利用其中的各种 API 获取请求数据。
之所以是灵活的:我们甚至可以这样请求:
http://127.0.0.1:7317/cicada-example/demoAction?jsonData="info": {
"age": 22,
"name": "zhangsan"
}
这样就可以传递任意结构的数据,只要业务处理时进行解析即可。
自定义拦截器
拦截器是一个框架的基本功能,可以利用拦截器实现日志记录、事务提交等通用工作。
为此 cicada 提供一个接口: top.crossoverjie.cicada.server.intercept.CicadaInterceptor。
我们只需要实现该接口即可编写拦截功能:
@Interceptor(value = "executeTimeInterceptor")
public class ExecuteTimeInterceptor implements CicadaInterceptor {
private static final Logger LOGGER = LoggerBuilder.getLogger(ExecuteTimeInterceptor.class);
private Long start;
private Long end;
@Override
public void before(Param param) {
start = System.currentTimeMillis();
}
@Override
public void after(Param param) {
end = System.currentTimeMillis();
LOGGER.info("cast [{}] times", end - start);
}
}
这里演示的是记录所有 action 的执行时间。
目前默认只实现了 action 的拦截,后期也会加入自定义拦截器。
拦截适配器
虽说在拦截器中提供了 before/after 两个方法,但也不是所有的方法都需要实现。
因此 cicada 提供了一个适配器:
top.crossoverjie.cicada.server.intercept.AbstractCicadaInterceptorAdapter
我们需要继承他便可按需实现其中的某个方法,如下所示:
@Interceptor(value = "loggerInterceptor")
public class LoggerInterceptorAbstract extends AbstractCicadaInterceptorAdapter {
private static final Logger LOGGER = LoggerBuilder.getLogger(LoggerInterceptorAbstract.class) ;
@Override
public void before(Param param) {
LOGGER.info("logger param=[{}]",param.toString());
}
}
性能测试
既然是一个 HTTP 服务框架,那性能自然也得保证。
在测试条件为:300 并发连续压测两轮;1G 内存、单核 CPU、1Mbps。用 Jmeter 压测情况如下:

同样的服务器用 Tomcat 来压测看看结果。
Tomcat 的线程池配置:
<Executor name="tomcatThreadPool" namePrefix="consumer-exec-"
maxThreads="510" minSpareThreads="10"/>

我这里请求的是 Tomcat 的一个 doc 目录,虽说结果看似 cicada 的性能比 Tomcat 还强。
但其实这个对比过程中的变量并没有完全控制好,Tomcat 所返回的是 HTML,而 cicada 仅仅返回了 json,当然问题也不止这些。
但还是能说明 cicada 目前的性能还是不错的。
转自:https://my.oschina.net/crossoverjie/blog/1941207
轻量级web框架cicada----(转)的更多相关文章
- 「造个轮子」——cicada(轻量级 WEB 框架)
前言 俗话说 「不要重复造轮子」,关于是否有必要不再本次讨论范围. 创建这个项目的主要目的还是提升自己,看看和知名类开源项目的差距以及学习优秀的开源方式. 好了,现在着重来谈谈 cicada 这个项目 ...
- python几个轻量级web框架
python几个轻量级web框架 2016-04-11 18:04:34 惹不起的程咬金 阅读数 7944更多 分类专栏: 云计算/大数据/并行计算 Python 我最近发表了一篇名为 ‘7 Mi ...
- 轻量级Web框架Flask——Web表单
安装 Flask-WTF及其依赖可使用pip安装 pip install flask_wtf 配置 要求应用配置一个密钥.密钥是一个由随机字符构成的唯一字符串,通过加密或签名以不同的方式提升应用的安全 ...
- 轻量级的Web框架——Nancy
最近想找一个简单的.Net下的轻量级Web框架,作为用户的本地的一个WebServer,实现同浏览器程序的一些简单交互,并调用本地服务,实现类似浏览器插件的功能.它有如下几点要求: 简单,能快速账务, ...
- Spring MVC Web框架
1. Spring MVC简介 Spring MVC是java EE平台请求驱动类型的轻量级Web框架,使用了MVC设计模式的思想,spring框架的主要优势之一就是分层架构,分层架构允许选择使用 ...
- Python Web 框架:Tornado
1.Tornado Tornado:python编写的web服务器兼web应用框架 1.1.Tornado的优势 轻量级web框架 异步非阻塞IO处理方式 出色的抗负载能力 优异的处理性能,不依赖多进 ...
- Python 【web框架】之Flask
flask 是Python实现的轻量级web框架.没有表单,orm等,但扩展性很好.很多Python web开发者十分喜欢.本篇介绍flask的简单使用及其扩展. 文中示例源码已经传到github:h ...
- Resty 一款极简的restful轻量级的web框架
https://github.com/Dreampie/Resty Resty 一款极简的restful轻量级的web框架 开发文档 如果你还不是很了解restful,或者认为restful只是一种规 ...
- [转]轻量级 Java Web 框架架构设计
工作闲暇之余,我想设计并开发一款轻量级 Java Web 框架,看看能否取代目前最为流行的而又越来越重的 Spring.Hibernate 等框架.请原谅在下的大胆行为与不自量力,本人不是为了重造轮子 ...
随机推荐
- 记录搭建ssm项目
搞java也快3年了,搭建一个ssm居然有点吃力. 参考链接:https://blog.csdn.net/gebitan505/article/details/44455235/ 环境准备:jdk8. ...
- innodb mvcc,事务隔离级别,读写锁
mvcc其实和copyonwritelist的思路差不多:读不加锁,写加锁,事务提交之后释放锁,并且延伸的是,在UNdolog里面保存了几个版本,实现不同的隔离级别.如果读数据页里面最新的数据,那么就 ...
- Linux:配置samba服务
配置samba服务 一.简略教程 1.挂载系统 mount /dev/cdrom /mnt/cdrom2.创建用户:useradd linlin3.创建用户密码:passwd linlin4.在用户 ...
- ios初识UITableView及简单用法二(模型数据)
// // ViewController.m // ZQRTableViewTest // // Created by zzqqrr on 17/8/24. // Copyright (c) 2017 ...
- ios轮播图片用法
// // ZQRViewController.m // 04-图片轮播器 // // Created by apple on 17-08-24. // Copyright (c) 2017年 zzq ...
- TDate赋值给Variant时注意的问题
//Delphi 10.3.1 32bit, Win 7 32bit procedure TForm1.btnTimeToVariantClick(Sender: TObject); var d:TD ...
- python 正则匹配时间格式转换方法
import re from datetime import datetime a = '2018年8月9日 10:10' s = re.findall('\d+',a) print(s) d = ' ...
- python day11 ——1. 函数名的使⽤ 2. 闭包 3. 迭代器
⼀. 函数名的运⽤. 1.函数名的内存地址 def func(): print("呵呵") print(func) 结果: <function func at 0x11 ...
- DocumentFragment --更快捷操作DOM的途径
使用DocumentFragment将一批子元素添加到任何类似node的父节点上,对这批子元素的操作不需要一个真正的根节点.可以不依赖可见的DOM来构造一个DOM结构,而效率高是它真正的优势,试验表明 ...
- [转]TCP滑动窗口详解
TCP滑动窗口详解 http://lyjdamzwf.blog.163.com/blog/static/75206837201193373226/ TCP滑动窗口(Sliding Window) ...