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

本文涉及的产品
性能测试 PTS,5000VUM额度
简介:

前言

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

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

好了,现在着重来谈谈 cicada 这个项目的核心功能。

我把他定义为一个快速、轻量级 WEB 框架;没有过多的依赖,核心 jar 包仅 30KB。

也仅需要一行代码即可启动一个 HTTP 服务。

6985c4014c7af0bec1546f82b7693ee19a245c78

特性

现在来谈谈重要的几个特性。

ce7f13703085d0ac6cc232dd4bd3aede581bea51

当前版本主要实现了基本的请求、响应、自定义参数以及拦截器功能。

功能虽少,但五脏俱全。

在今后的迭代过程中会逐渐完善上图功能,有好的想法也欢迎提 https://github.com/crossoverJie/cicada/issues。

快速启动

下面来看看如何快速启动一个 HTTP 服务。

只需要创建一个 Maven 项目,并引入核心包。

 
  1. <dependency>

  2. <groupId>top.crossoverjie.opensource</groupId>

  3. <artifactId>cicada-core</artifactId>

  4. <version>1.0.0</version>

  5. </dependency>

如上图所示,再配置一个启动类即可。

 
  1. public class MainStart {

  2. public static void main(String[] args) throws InterruptedException {

  3. CicadaServer.start(MainStart.class,"/cicada-example") ;

  4. }

  5. }

配置业务 Action

当然我们还需要一个实现业务逻辑的地方。 cicada 提供了一个接口,只需要实现该接口即可实现具体逻辑。

创建业务 Action 实现 top.crossoverjie.cicada.server.action.WorkAction 接口。

 
  1. @CicadaAction(value = "demoAction")

  2. public class DemoAction implements WorkAction {

  3. private static final Logger LOGGER = LoggerBuilder.getLogger(DemoAction.class) ;

  4. private static AtomicLong index = new AtomicLong() ;

  5. @Override

  6. public WorkRes<DemoResVO> execute(Param paramMap) throws Exception {

  7. String name = paramMap.getString("name");

  8. Integer id = paramMap.getInteger("id");

  9. LOGGER.info("name=[{}],id=[{}]" , name,id);

  10. DemoResVO demoResVO = new DemoResVO() ;

  11. demoResVO.setIndex(index.incrementAndGet());

  12. WorkRes<DemoResVO> res = new WorkRes();

  13. res.setCode(StatusEnum.SUCCESS.getCode());

  14. res.setMessage(StatusEnum.SUCCESS.getMessage());

  15. res.setDataBody(demoResVO) ;

  16. return res;

  17. }

  18. }

同时需要再自定义类中加上 @CicadaAction 注解,并需要指定一个 value,该 value 主要是为了在请求路由时能找到业务类。

这样启动应用并访问

http://127.0.0.1:7317/cicada-example/demoAction?name=12345&id=10

便能执行业务逻辑同时得到服务端的返回。

35a579f635273a7e9e9ac13e05361d2d407e7854

目前默认支持的是  json 响应,后期也会加上模板解析。

服务中也会打印相关日志。

6cb4f4849aae9eb13885f6fb4bcb4f8831a01866

灵活的参数配置

这里所有的请求参数都封装在 Param 中,可以利用其中的各种 API 获取请求数据。

之所以是灵活的:我们甚至可以这样请求:

 
  1. http://127.0.0.1:7317/cicada-example/demoAction?jsonData="info": {

  2. "age": 22,

  3. "name": "zhangsan"

  4. }

这样就可以传递任意结构的数据,只要业务处理时进行解析即可。

自定义拦截器

拦截器是一个框架的基本功能,可以利用拦截器实现日志记录、事务提交等通用工作。

为此 cicada 提供一个接口: top.crossoverjie.cicada.server.intercept.CicadaInterceptor

我们只需要实现该接口即可编写拦截功能:

 
  1. @Interceptor(value = "executeTimeInterceptor")

  2. public class ExecuteTimeInterceptor implements CicadaInterceptor {

  3. private static final Logger LOGGER = LoggerBuilder.getLogger(ExecuteTimeInterceptor.class);

  4. private Long start;

  5. private Long end;

  6. @Override

  7. public void before(Param param) {

  8. start = System.currentTimeMillis();

  9. }

  10. @Override

  11. public void after(Param param) {

  12. end = System.currentTimeMillis();

  13. LOGGER.info("cast [{}] times", end - start);

  14. }

  15. }

这里演示的是记录所有 action 的执行时间。

目前默认只实现了 action 的拦截,后期也会加入自定义拦截器。

拦截适配器

虽说在拦截器中提供了 before/after 两个方法,但也不是所有的方法都需要实现。

因此 cicada 提供了一个适配器:

top.crossoverjie.cicada.server.intercept.AbstractCicadaInterceptorAdapter

我们需要继承他便可按需实现其中的某个方法,如下所示:

 
  1. @Interceptor(value = "loggerInterceptor")

  2. public class LoggerInterceptorAbstract extends AbstractCicadaInterceptorAdapter {

  3. private static final Logger LOGGER = LoggerBuilder.getLogger(LoggerInterceptorAbstract.class) ;

  4. @Override

  5. public void before(Param param) {

  6. LOGGER.info("logger param=[{}]",param.toString());

  7. }

  8. }

性能测试

既然是一个 HTTP 服务框架,那性能自然也得保证。

在测试条件为: 300并发连续压测两轮;1G内存、单核CPU、1Mbps。用 Jmeter 压测情况如下:

fd52d178166fb1bd6634e0810299521c3064795d
同样的服务器用 Tomcat 来压测看看结果。

Tomcat 的线程池配置:

 
  1. <Executor name="tomcatThreadPool" namePrefix="consumer-exec-"

  2. maxThreads="510" minSpareThreads="10"/>


9a6382828ab04955c283aafac1ba8b6ae460baef

我这里请求的是 Tomcat 的一个 doc 目录,虽说结果看似 cicada 的性能比 Tomcat 还强。

但其实这个对比过程中的变量并没有完全控制好,Tomcat 所返回的是 HTML,而 cicada 仅仅返回了 json,当然问题也不止这些。

但还是能说明 cicada 目前的性能还是不错的。

总结

本文没有过多讨论 cicada 实现原理,感兴趣的可以看看源码,都比较简单。

在后续的更新中会仔细探讨这块内容。

同时不出意外 cicada 会持续更新,未来也会加入更多实用的功能。

甚至我会在适当的时机将它应用于我的生产项目,也希望更多朋友能参与进来一起把这个「轮子」做的更好。


原文发布时间为:2018-09-3

本文来自云栖社区合作伙伴“crossoverJie”,了解相关信息可以关注“crossoverJie”。

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
相关文章
|
2月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
221 45
|
2月前
|
开发框架 搜索推荐 数据可视化
Django框架适合开发哪种类型的Web应用程序?
Django 框架凭借其强大的功能、稳定性和可扩展性,几乎可以适应各种类型的 Web 应用程序开发需求。无论是简单的网站还是复杂的企业级系统,Django 都能提供可靠的支持,帮助开发者快速构建高质量的应用。同时,其活跃的社区和丰富的资源也为开发者在项目实施过程中提供了有力的保障。
|
2月前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
50 2
|
2月前
|
中间件 Go API
Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架
本文概述了Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架。
152 1
|
2月前
|
开发框架 前端开发 JavaScript
利用Python和Flask构建轻量级Web应用的实战指南
利用Python和Flask构建轻量级Web应用的实战指南
115 2
|
2月前
|
SQL 安全 PHP
探索PHP的现代演进:从Web开发到框架创新
PHP是一种流行的服务器端脚本语言,自诞生以来在Web开发领域占据重要地位。从简单的网页脚本到支持面向对象编程的现代语言,PHP经历了多次重大更新。本文探讨PHP的现代演进历程,重点介绍其在Web开发中的应用及框架创新,如Laravel、Symfony等。这些框架不仅简化了开发流程,还提高了开发效率和安全性。
40 3
|
2月前
|
前端开发 JavaScript 开发工具
从框架到现代Web开发实践
从框架到现代Web开发实践
51 1
|
2月前
|
SQL 安全 PHP
探索PHP的现代演进:从Web开发到框架创新
PHP 自发布以来一直在 Web 开发领域占据重要地位,历经多次重大更新,从简单的脚本语言进化为支持面向对象编程的现代语言。本文探讨 PHP 的演进历程,重点介绍其在 Web 开发中的应用及框架创新。自 PHP 5.3 引入命名空间后,PHP 迈向了面向对象编程时代;PHP 7 通过优化内核大幅提升性能;PHP 8 更是带来了属性、刚性类型等新特性。
40 3
|
2月前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
77 2
|
2月前
|
JSON API 数据格式
如何使用Python和Flask构建一个简单的RESTful API。Flask是一个轻量级的Web框架
本文介绍了如何使用Python和Flask构建一个简单的RESTful API。Flask是一个轻量级的Web框架,适合小型项目和微服务。文章从环境准备、创建基本Flask应用、定义资源和路由、请求和响应处理、错误处理等方面进行了详细说明,并提供了示例代码。通过这些步骤,读者可以快速上手构建自己的RESTful API。
167 2