「造个轮子」——cicada(轻量级 WEB 框架)
前言
俗话说 「不要重复造轮子」,关于是否有必要不再本次讨论范围。
创建这个项目的主要目的还是提升自己,看看和知名类开源项目的差距以及学习优秀的开源方式。
好了,现在着重来谈谈 cicada 这个项目的核心功能。
我把他定义为一个快速、轻量级 WEB 框架;没有过多的依赖,核心 jar 包仅 30KB。
也仅需要一行代码即可启动一个 HTTP
服务。
特性
现在来谈谈重要的几个特性。
当前版本主要实现了基本的请求、响应、自定义参数以及拦截器功能。
功能虽少,但五脏俱全。
在今后的迭代过程中会逐渐完善上图功能,有好的想法也欢迎提 https://github.com/crossoverJie/cicada/issues。
快速启动
下面来看看如何快速启动一个 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 WorkRes<DemoResVO> execute(Param paramMap) 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) ;
return res;
}
}
同时需要再自定义类中加上 @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
目前的性能还是不错的。
总结
本文没有过多讨论 cicada
实现原理,感兴趣的可以看看源码,都比较简单。
在后续的更新中会仔细探讨这块内容。
同时不出意外 cicada
会持续更新,未来也会加入更多实用的功能。
甚至我会在适当的时机将它应用于我的生产项目,也希望更多朋友能参与进来一起把这个「轮子」做的更好。
项目地址:https://github.com/crossoverJie/cicada
你的点赞与转发是最大的支持。
「造个轮子」——cicada(轻量级 WEB 框架)的更多相关文章
- 「造个轮子」——cicada 设计一个配置模块
前言 在前两次的 cicada 版本中其实还不支持读取配置文件,比如对端口.路由的配置. 因此我按照自己的想法创建了一个 issue ,也收集到了一些很不错的建议. 最终其实还是按照我之前的想法来做了 ...
- 「造个轮子」——cicada 源码分析
前言 两天前写了文章<「造个轮子」--cicada(轻量级 WEB 框架)> 向大家介绍了 cicada 之后收到很多反馈,也有许多不错的建议. 同时在 GitHub 也收获了 80 几颗 ...
- 「造个轮子」——设计 HTTP 请求全局上下文
前言 本次 Cicada 已经更新到了 v1.0.3. 主要是解决了两个 issue,#9(Boss线程数好像设置有误 ) #8(怎么返回纯字符串内容不要JSON格式?). 所以本次的主要更新为: C ...
- python几个轻量级web框架
python几个轻量级web框架 2016-04-11 18:04:34 惹不起的程咬金 阅读数 7944更多 分类专栏: 云计算/大数据/并行计算 Python 我最近发表了一篇名为 ‘7 Mi ...
- 轻量级web框架cicada----(转)
源码地址: https://github.com/TogetherOS/cicada 快速启动 下面来看看如何快速启动一个 HTTP 服务. 只需要创建一个 Maven 项目,并引入核心包. < ...
- 轻量级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处理方式 出色的抗负载能力 优异的处理性能,不依赖多进 ...
随机推荐
- MongoDB,从数组中删除对象
{ _id: 5150a1199fac0e6910000002, name: 'some name, items: [{ id: 23, name: 'item name 23' },{ id: 24 ...
- Anki 2.0 用户手册
Anki 2.0 用户手册 目录 Anki 2.0 用户手册 视频介绍 卡片和模板 Javascript Anki 2.0 用户手册 视频介绍 共享牌组和基础复习技巧 调换卡片正反面 卡片样式设计 亲 ...
- CentOS6.x 下 /etc/security/limits.conf 被改错的故障经历
Intro 我司本小厂,每个员工都是身兼数职,所以开发人员直接登录线上服务器改东西是常态.有些开发人员,自持水平较高(的确水平也是较高,但缺乏对系统的敬畏),所以总是越俎代庖,改一些本身应该是线上运维 ...
- 大数据学习之Linux进阶02
大数据学习之Linux进阶 1-> 配置IP 1)修改配置文件 vi /sysconfig/network-scripts/ifcfg-eno16777736 2)注释掉dhcp #BOOTPR ...
- shiro(四)项目开发中的配置、
配置拦截.过滤.验证请求 <!-- shiro --> <!-- 項目自定义的Realm --> <bean id="ShiroRealm" clas ...
- vue小技巧之偷懒的文件路径——减少不必要的代码
众所周知,我们写vue项目的时候都会创建很多个文件,尤其是一些中大型项目,会有很深的文件夹,当你去引入的时候,要写很长的路径比如我要引入一个css文件, 必须得 import '../../../s ...
- HashCode总结
不同的实例对象的hashCode是不相同的 package com.cici.test;class DoubleLinkNode{ public int iData; public double dD ...
- angularjs和ajax的结合使用 (三)
转眼九月份了,忙忙碌碌 发现今年还没开过张,写一篇吧. 15年在空闲时就倒腾过angularjs那玩意儿 ,觉得还是挺好的,李金龙那厚厚的一本书,只不过没有系统化应用.最主要的是原来有一个东西没有用到 ...
- 推荐多线程下载工具axel替代wget
在爬数据的时候很多时候需要下载文件比如压缩文件,音频,视频,图片等等,这些文件通常有一个请求的url,这个时候使用request模块或者urllib模块都很慢,而且很不稳定,这个时候使用wget或者a ...
- [JZOJ3615]【NOI2014模拟】数列(平面几何+二维线段树)
Description 给定一个长度为n的正整数数列a[i]. 定义2个位置的f值为两者位置差与数值差的和,即f(x,y)=|x-y|+|a[x]-a[y]|. 你需要写一个程序支持2种操作(k都是正 ...