前言

俗话说 「不要重复造轮子」,关于是否有必要不再本次讨论范围。

创建这个项目的主要目的还是提升自己,看看和知名类开源项目的差距以及学习优秀的开源方式。

好了,现在着重来谈谈 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 框架)的更多相关文章

  1. 「造个轮子」——cicada 设计一个配置模块

    前言 在前两次的 cicada 版本中其实还不支持读取配置文件,比如对端口.路由的配置. 因此我按照自己的想法创建了一个 issue ,也收集到了一些很不错的建议. 最终其实还是按照我之前的想法来做了 ...

  2. 「造个轮子」——cicada 源码分析

    前言 两天前写了文章<「造个轮子」--cicada(轻量级 WEB 框架)> 向大家介绍了 cicada 之后收到很多反馈,也有许多不错的建议. 同时在 GitHub 也收获了 80 几颗 ...

  3. 「造个轮子」——设计 HTTP 请求全局上下文

    前言 本次 Cicada 已经更新到了 v1.0.3. 主要是解决了两个 issue,#9(Boss线程数好像设置有误 ) #8(怎么返回纯字符串内容不要JSON格式?). 所以本次的主要更新为: C ...

  4. python几个轻量级web框架

    python几个轻量级web框架 2016-04-11 18:04:34 惹不起的程咬金 阅读数 7944更多 分类专栏: 云计算/大数据/并行计算 Python   我最近发表了一篇名为 ‘7 Mi ...

  5. 轻量级web框架cicada----(转)

    源码地址: https://github.com/TogetherOS/cicada 快速启动 下面来看看如何快速启动一个 HTTP 服务. 只需要创建一个 Maven 项目,并引入核心包. < ...

  6. 轻量级Web框架Flask——Web表单

    安装 Flask-WTF及其依赖可使用pip安装 pip install flask_wtf 配置 要求应用配置一个密钥.密钥是一个由随机字符构成的唯一字符串,通过加密或签名以不同的方式提升应用的安全 ...

  7. 轻量级的Web框架——Nancy

    最近想找一个简单的.Net下的轻量级Web框架,作为用户的本地的一个WebServer,实现同浏览器程序的一些简单交互,并调用本地服务,实现类似浏览器插件的功能.它有如下几点要求: 简单,能快速账务, ...

  8. Spring MVC Web框架

      1. Spring MVC简介 Spring MVC是java EE平台请求驱动类型的轻量级Web框架,使用了MVC设计模式的思想,spring框架的主要优势之一就是分层架构,分层架构允许选择使用 ...

  9. Python Web 框架:Tornado

    1.Tornado Tornado:python编写的web服务器兼web应用框架 1.1.Tornado的优势 轻量级web框架 异步非阻塞IO处理方式 出色的抗负载能力 优异的处理性能,不依赖多进 ...

随机推荐

  1. MongoDB,从数组中删除对象

    { _id: 5150a1199fac0e6910000002, name: 'some name, items: [{ id: 23, name: 'item name 23' },{ id: 24 ...

  2. Anki 2.0 用户手册

    Anki 2.0 用户手册 目录 Anki 2.0 用户手册 视频介绍 卡片和模板 Javascript Anki 2.0 用户手册 视频介绍 共享牌组和基础复习技巧 调换卡片正反面 卡片样式设计 亲 ...

  3. CentOS6.x 下 /etc/security/limits.conf 被改错的故障经历

    Intro 我司本小厂,每个员工都是身兼数职,所以开发人员直接登录线上服务器改东西是常态.有些开发人员,自持水平较高(的确水平也是较高,但缺乏对系统的敬畏),所以总是越俎代庖,改一些本身应该是线上运维 ...

  4. 大数据学习之Linux进阶02

    大数据学习之Linux进阶 1-> 配置IP 1)修改配置文件 vi /sysconfig/network-scripts/ifcfg-eno16777736 2)注释掉dhcp #BOOTPR ...

  5. shiro(四)项目开发中的配置、

    配置拦截.过滤.验证请求 <!-- shiro --> <!-- 項目自定义的Realm --> <bean id="ShiroRealm" clas ...

  6. vue小技巧之偷懒的文件路径——减少不必要的代码

    众所周知,我们写vue项目的时候都会创建很多个文件,尤其是一些中大型项目,会有很深的文件夹,当你去引入的时候,要写很长的路径比如我要引入一个css文件, 必须得 import  '../../../s ...

  7. HashCode总结

    不同的实例对象的hashCode是不相同的 package com.cici.test;class DoubleLinkNode{ public int iData; public double dD ...

  8. angularjs和ajax的结合使用 (三)

    转眼九月份了,忙忙碌碌 发现今年还没开过张,写一篇吧. 15年在空闲时就倒腾过angularjs那玩意儿 ,觉得还是挺好的,李金龙那厚厚的一本书,只不过没有系统化应用.最主要的是原来有一个东西没有用到 ...

  9. 推荐多线程下载工具axel替代wget

    在爬数据的时候很多时候需要下载文件比如压缩文件,音频,视频,图片等等,这些文件通常有一个请求的url,这个时候使用request模块或者urllib模块都很慢,而且很不稳定,这个时候使用wget或者a ...

  10. [JZOJ3615]【NOI2014模拟】数列(平面几何+二维线段树)

    Description 给定一个长度为n的正整数数列a[i]. 定义2个位置的f值为两者位置差与数值差的和,即f(x,y)=|x-y|+|a[x]-a[y]|. 你需要写一个程序支持2种操作(k都是正 ...