Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/TogetherOS/cicada
🚀 Fast lightweight HTTP service framework.
https://github.com/TogetherOS/cicada
high-performance http json lightweight netty4
Last synced: about 4 hours ago
JSON representation
🚀 Fast lightweight HTTP service framework.
- Host: GitHub
- URL: https://github.com/TogetherOS/cicada
- Owner: TogetherOS
- License: apache-2.0
- Created: 2018-08-30T03:41:22.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2023-07-17T21:53:48.000Z (over 1 year ago)
- Last Synced: 2024-08-03T17:21:46.233Z (3 months ago)
- Topics: high-performance, http, json, lightweight, netty4
- Language: Java
- Homepage: https://crossoverjie.top/categories/cicada/
- Size: 282 KB
- Stars: 954
- Watchers: 62
- Forks: 212
- Open Issues: 12
-
Metadata Files:
- Readme: README-ZH.md
- License: LICENSE
Awesome Lists containing this project
README
[![Build Status](https://travis-ci.org/crossoverJie/cicada.svg?branch=master)](https://travis-ci.org/crossoverJie/cicada)
[![](https://maven-badges.herokuapp.com/maven-central/top.crossoverjie.opensource/cicada-core/badge.svg)](https://maven-badges.herokuapp.com/maven-central/top.crossoverjie.opensource/cicada-core/)
[![QQ群](https://img.shields.io/badge/QQ%E7%BE%A4-787381170-yellowgreen.svg)](https://jq.qq.com/?_wv=1027&k=5HPYvQk)[qq0groupsvg]: https://img.shields.io/badge/QQ%E7%BE%A4-787381170-yellowgreen.svg
[qq0group]: https://jq.qq.com/?_wv=1027&k=5HPYvQk📘[特性](#features) |🌁[快速启动](#quick-start) | 🏖[性能测试](#performance-test) | 🌈[更新记录](#changelog) | 💡 [联系作者](#contact-author)|🇦🇺[English](https://github.com/TogetherOS/cicada)
## 简介
基于 Netty4 实现的快速、轻量级 WEB 框架;没有过多的依赖,核心 jar 包仅 `30KB`。
如果你感兴趣,请点 [Star](https://github.com/crossoverJie/cicada/stargazers)。
## 特性
- [x] 代码简洁,没有过多依赖。
- [x] 一行代码即可启动 HTTP 服务。
- [x] [自定义拦截器](#自定义拦截器)。
- [x] [自定义全局异常](#自定义全局异常).
- [x] 灵活的传参方式。
- [x] `json` 响应格式。
- [x] [自定义配置](#自定义配置)。
- [x] 多种响应方式。
- [x] 内置可插拔 `IOC` 容器。
- [x] [`Cookie` 支持](#cookie-支持)。
- [ ] 文件上传。## 快速启动
创建一个 maven 项目,引入核心依赖。
```xml
top.crossoverjie.opensource
cicada-core
x.y.z```
当然也推荐额外再引入一个 `IOC` 容器插件:
```xml
top.crossoverjie.opensource
cicada-ioc
2.0.4```
启动类:
```java
public class MainStart {public static void main(String[] args) throws InterruptedException {
CicadaServer.start(MainStart.class,"/cicada-example") ;
}
}
```### 配置业务 Action
```java
@CicadaAction("routeAction")
public class RouteAction {private static final Logger LOGGER = LoggerBuilder.getLogger(RouteAction.class);
@CicadaRoute("getUser")
public void getUser(DemoReq req){LOGGER.info(req.toString());
WorkRes reqWorkRes = new WorkRes<>() ;
reqWorkRes.setMessage("hello =" + req.getName());
CicadaContext.getContext().json(reqWorkRes) ;
}@CicadaRoute("getInfo")
public void getInfo(DemoReq req){WorkRes reqWorkRes = new WorkRes<>() ;
reqWorkRes.setMessage("getInfo =" + req.toString());
CicadaContext.getContext().json(reqWorkRes) ;
}@CicadaRoute("getReq")
public void getReq(CicadaContext context,DemoReq req){WorkRes reqWorkRes = new WorkRes<>() ;
reqWorkRes.setMessage("getReq =" + req.toString());
context.json(reqWorkRes) ;
}}
```启动应用访问 [http://127.0.0.1:5688/cicada-example/routeAction/getUser?id=1234&name=zhangsan](http://127.0.0.1:5688/cicada-example/routeAction/getUser?id=1234&name=zhangsan)
```json
{"message":"hello =zhangsan"}
```## Cicada 上下文
通过 `context.json(),context.text()` 方法可以选择不同的响应方式。
```java
@CicadaAction("routeAction")
public class RouteAction {private static final Logger LOGGER = LoggerBuilder.getLogger(RouteAction.class);
@CicadaRoute("getUser")
public void getUser(DemoReq req){LOGGER.info(req.toString());
WorkRes reqWorkRes = new WorkRes<>() ;
reqWorkRes.setMessage("hello =" + req.getName());
CicadaContext.getContext().json(reqWorkRes) ;
}
@CicadaRoute("hello")
public void hello() throws Exception {
CicadaContext context = CicadaContext.getContext();String url = context.request().getUrl();
String method = context.request().getMethod();
context.text("hello world url=" + url + " method=" + method);
}}
```## Cookie 支持
### 设置 Cookie
```java
Cookie cookie = new Cookie() ;
cookie.setName("cookie");
cookie.setValue("value");
CicadaContext.getResponse().setCookie(cookie);
```### 获取 Cookie
```java
Cookie cookie = CicadaContext.getRequest().getCookie("cookie");
logger.info("cookie = " + cookie.toString());
```## 自定义配置
`cicada` 默认会读取 classpath 下的 `application.properties` 配置文件。
同时也可以自定义配置文件。
只需要继承 `top.crossoverjie.cicada.server.configuration.AbstractCicadaConfiguration`
并传入配置文件名称即可。比如:
```java
public class RedisConfiguration extends AbstractCicadaConfiguration {public RedisConfiguration() {
super.setPropertiesName("redis.properties");
}}
public class KafkaConfiguration extends AbstractCicadaConfiguration {
public KafkaConfiguration() {
super.setPropertiesName("kafka.properties");
}}
```![](https://ws3.sinaimg.cn/large/0069RVTdgy1fv5mw7p5nvj31by0fo76t.jpg)
### 获取配置
按照如下方式即可获取自定义配置:
```java
KafkaConfiguration configuration = (KafkaConfiguration) getConfiguration(KafkaConfiguration.class);
RedisConfiguration redisConfiguration = (RedisConfiguration) ConfigurationHolder.getConfiguration(RedisConfiguration.class);
ApplicationConfiguration applicationConfiguration = (ApplicationConfiguration) ConfigurationHolder.getConfiguration(ApplicationConfiguration.class);String brokerList = configuration.get("kafka.broker.list");
String redisHost = redisConfiguration.get("redis.host");
String port = applicationConfiguration.get("cicada.port");LOGGER.info("Configuration brokerList=[{}],redisHost=[{}] port=[{}]",brokerList,redisHost,port);
```### 外置配置文件
当然在特殊环境中(`dev/test/pro`)也可以读取外置配置文件。只需要加上启动参数,保证参数名称和文件名一致即可。
```shell
-Dapplication.properties=/xx/application.properties
-Dkafka.properties=/xx/kakfa.properties
-Dredis.properties=/xx/redis.properties
```## 自定义拦截器
实现 `top.crossoverjie.cicada.example.intercept.CicadaInterceptor` 接口。
```java
@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 boolean before(Param param) {
start = System.currentTimeMillis();
return true;
}@Override
public void after(Param param) {
end = System.currentTimeMillis();LOGGER.info("cast [{}] times", end - start);
}
}
```## 自定义全局异常
现在你可以自定义全局异常,就像这样:
```java
@CicadaBean
public class ExceptionHandle implements GlobalHandelException {
private final static Logger LOGGER = LoggerBuilder.getLogger(ExceptionHandle.class);@Override
public void resolveException(CicadaContext context, Exception e) {
LOGGER.error("Exception", e);
WorkRes workRes = new WorkRes();
workRes.setCode("500");
workRes.setMessage(e.getClass().getName());
context.json(workRes);
}
}
```## 性能测试
![](https://ws4.sinaimg.cn/large/006tNbRwly1fv4luap7w0j31kw0iwdnu.jpg)
> 测试条件:100 threads and 100 connections ;1G RAM/4 CPU。
**每秒将近 10W 请求。**
## 更新记录
### v2.0.2
- 修复 [#40](https://github.com/TogetherOS/cicada/issues/40)
- 新增全局异常接口。
- 通过类类型获取 bean。### v2.0.1
- 更新 Logo ,美化日志。
- 支持 `Cookie`### v2.0.0
- 修复 [#12](https://github.com/TogetherOS/cicada/issues/12) [#22](https://github.com/TogetherOS/cicada/issues/22) [#28](28)
- 更加灵活的路由方式。
- 内置可插拔 `IOC` 容器。### v1.0.3
- 修复 [#9](https://github.com/TogetherOS/cicada/issues/9)
- 修复 [#8](https://github.com/TogetherOS/cicada/issues/8),多种响应方式。
- 重构了核心代码,新增上下文环境。
- 优雅停机。### v1.0.2
- 修复 [#6](https://github.com/TogetherOS/cicada/issues/6)
- 自定义配置文件。
- 灵活使用配置。
- 重构代码。## 联系作者
> crossoverJie#gmail.com
![qrcode_for_gh_3a954a025f10_258.jpg](https://i.loli.net/2019/07/09/5d245f3e955ce61699.jpg)
## 特别感谢
- [Netty](https://github.com/netty/netty)
- [blade](https://github.com/lets-blade/blade)