源码地址:

  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----(转)的更多相关文章

  1. 「造个轮子」——cicada(轻量级 WEB 框架)

    前言 俗话说 「不要重复造轮子」,关于是否有必要不再本次讨论范围. 创建这个项目的主要目的还是提升自己,看看和知名类开源项目的差距以及学习优秀的开源方式. 好了,现在着重来谈谈 cicada 这个项目 ...

  2. python几个轻量级web框架

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

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

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

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

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

  5. Spring MVC Web框架

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

  6. Python Web 框架:Tornado

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

  7. Python 【web框架】之Flask

    flask 是Python实现的轻量级web框架.没有表单,orm等,但扩展性很好.很多Python web开发者十分喜欢.本篇介绍flask的简单使用及其扩展. 文中示例源码已经传到github:h ...

  8. Resty 一款极简的restful轻量级的web框架

    https://github.com/Dreampie/Resty Resty 一款极简的restful轻量级的web框架 开发文档 如果你还不是很了解restful,或者认为restful只是一种规 ...

  9. [转]轻量级 Java Web 框架架构设计

    工作闲暇之余,我想设计并开发一款轻量级 Java Web 框架,看看能否取代目前最为流行的而又越来越重的 Spring.Hibernate 等框架.请原谅在下的大胆行为与不自量力,本人不是为了重造轮子 ...

随机推荐

  1. Core 中 Filter 中相关处理

    //返回401 ContentResult Content = new ContentResult(); Content.StatusCode = 401; filterContext.Result ...

  2. JavaWeb:一个Servelt多个请求

    一个Servelt多个请求 基础模拟 方法一:使用switch方法  一.方法介绍 方法:switch 优点:方法简单,明了 缺点:维护麻烦,保密性不好 二.代码实现 1.servlet类 packa ...

  3. 2010年腾讯前端面试题学习(jquery,html,css部分)

    看了牛人写的回忆文章,里面有2010年腾讯的前端面试题,里面涉及到不少基础性的问题,js部分已学习,这是jquery,html和css部分,学习一下:) 原文地址:https://segmentfau ...

  4. http 请求头部解析

    作者:知乎用户链接:https://www.zhihu.com/question/42696895/answer/109035792来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  5. js常用到的方法积累

    //获取对象长度的方法 function countObjLen(obj) { var count = 0; for (var property in obj) { if (Object.protot ...

  6. 1--Jmeter4.0连接Oracle数据库

    一.Jmeter要连接oracle数据库,就必须复制JDBC驱动jar包文件ojdbc5.jar或者ojdbc6.jar到Jmeter的lib目录下 路径:oracle安装目录\jdbc\lib 二. ...

  7. USB眼图

    /********************************************************************** * USB眼图 * 说明: * 对于USB眼图,并不是很 ...

  8. SDM(Supervised Descent Method and its Applications to Face Alignment )

    sdm SDM 人脸对齐的核心内容很简单,就是特征到偏移量的映射:                                           Ix = R I 是特征,x是映射矩阵,R是偏移 ...

  9. NYOJ 737:石子合并(一)(区间dp)

    737-石子合并(一) 内存限制:64MB 时间限制:1000ms 特判: No 通过数:30 提交数:37 难度:3 题目描述: 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆. ...

  10. c++——引用的使用

    1.使用引用避免拷贝 c++中拷贝大的类类型对象或容器对象比较低效,甚至有的类型不支持拷贝,这种情况下只能通过引用形参访问该类型的对象 当函数无需修改引用形参的值时,最好使用常量引用 例1:返回两个字 ...