源码地址:

  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. linux,windows下日志文件查找关键词

    1.查找 /apps/tomcat/tomcat3/apache-tomcat-7.0.69/logs 目录下已.txt结尾的文件,在文件中搜索关键字 IfcmpEcrService并打印行号 /lo ...

  2. vim 使用和配置

    vim 启动的时候,默认加载用户目录下.vimrc的配置文件,如果不存在,则会加载系统配置文件/etc/vim/vimrc ~/.vimrc文件配置 #避免中文乱码set fileencodings= ...

  3. Linux文件系统命令 cp

    命令名:cp 功能:拷贝文件,把一个文件的内容拷贝到另外一个文件中去. eg: cp source_file dist_file renjg@renjg-HP-Compaq-Pro--MT:~$ cp ...

  4. UVALive - 6434 (贪心)

    题目链接:https://vjudge.net/problem/UVALive-6434 题意:给你n个数字,要你把这n个数字分成m组,每一组的消耗值定义为改组最大值和最小值之差,要求这m组的消耗值总 ...

  5. ASP.NET使用文件上传控件上传图片

    ASPX代码 <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default. ...

  6. volatile(一)

    在并发编程中,我们通常会遇到以下三个问题:原子性问题,可见性问题,有序性问题.我们先看具体看一下这三个概念: 1.原子性  原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断 ...

  7. php 正则概述

    修饰符   s 模式中的点号元字符匹配所有字符 非打印字符 字符  含义  \cx  匹配由x指明的控制字符.例如, \cM 匹配一个 Control-M 或回车符.x 的值必须为 A-Z 或 a-z ...

  8. git 实现提交远程分支步骤

    git clone git branch [分支名] 创建分支 git branch 查看本地所有分支 git checkout [分支名称] 切换分支 ---写代码--- git status (查 ...

  9. HDU 1846 Brave Game(巴什博弈超简单题)

    题目传送:http://acm.hdu.edu.cn/showproblem.php?pid=1846 Problem Description 十年前读大学的时候,中国每年都要从国外引进一些电影大片, ...

  10. Git的小总结

    1.Git的介绍 Git(分布式版本控制系统)是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. 下载地址:https://git-scm.com 2.介绍命令 $ git ...