前言
俗話說 「不要重復(fù)造輪子」,關(guān)于是否有必要不再本次討論范圍击吱。
創(chuàng)建這個(gè)項(xiàng)目的主要目的還是提升自己虑椎,看看和知名類開源項(xiàng)目的差距以及學(xué)習(xí)優(yōu)秀的開源方式。
好了纲爸,現(xiàn)在著重來談?wù)?cicada 這個(gè)項(xiàng)目的核心功能亥鸠。
我把他定義為一個(gè)快速、輕量級(jí) WEB 框架识啦;沒有過多的依賴负蚊,核心 jar 包僅 30KB。
也僅需要一行代碼即可啟動(dòng)一個(gè) HTTP
服務(wù)颓哮。
特性
現(xiàn)在來談?wù)勚匾膸讉€(gè)特性家妆。
當(dāng)前版本主要實(shí)現(xiàn)了基本的請(qǐng)求、響應(yīng)冕茅、自定義參數(shù)以及攔截器功能伤极。
功能雖少,但五臟俱全姨伤。
在今后的迭代過程中會(huì)逐漸完善上圖功能哨坪,有好的想法也歡迎提 https://github.com/crossoverJie/cicada/issues。
快速啟動(dòng)
下面來看看如何快速啟動(dòng)一個(gè) HTTP 服務(wù)乍楚。
只需要?jiǎng)?chuàng)建一個(gè) Maven 項(xiàng)目当编,并引入核心包。
<dependency>
<groupId>top.crossoverjie.opensource</groupId>
<artifactId>cicada-core</artifactId>
<version>1.0.0</version>
</dependency>
如上圖所示徒溪,再配置一個(gè)啟動(dòng)類即可忿偷。
public class MainStart {
public static void main(String[] args) throws InterruptedException {
CicadaServer.start(MainStart.class,"/cicada-example") ;
}
}
配置業(yè)務(wù) Action
當(dāng)然我們還需要一個(gè)實(shí)現(xiàn)業(yè)務(wù)邏輯的地方。cicada
提供了一個(gè)接口臊泌,只需要實(shí)現(xiàn)該接口即可實(shí)現(xiàn)具體邏輯鲤桥。
創(chuàng)建業(yè)務(wù) Action 實(shí)現(xiàn) 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;
}
}
同時(shí)需要再自定義類中加上 @CicadaAction
注解缺虐,并需要指定一個(gè) value
芜壁,該 value 主要是為了在請(qǐng)求路由時(shí)能找到業(yè)務(wù)類。
這樣啟動(dòng)應(yīng)用并訪問
http://127.0.0.1:7317/cicada-example/demoAction?name=12345&id=10
便能執(zhí)行業(yè)務(wù)邏輯同時(shí)得到服務(wù)端的返回高氮。
目前默認(rèn)支持的是 json
響應(yīng)慧妄,后期也會(huì)加上模板解析。
服務(wù)中也會(huì)打印相關(guān)日志剪芍。
靈活的參數(shù)配置
這里所有的請(qǐng)求參數(shù)都封裝在 Param
中塞淹,可以利用其中的各種 API 獲取請(qǐng)求數(shù)據(jù)。
之所以是靈活的:我們甚至可以這樣請(qǐng)求:
http://127.0.0.1:7317/cicada-example/demoAction?jsonData="info": {
"age": 22,
"name": "zhangsan"
}
這樣就可以傳遞任意結(jié)構(gòu)的數(shù)據(jù)罪裹,只要業(yè)務(wù)處理時(shí)進(jìn)行解析即可饱普。
自定義攔截器
攔截器是一個(gè)框架的基本功能运挫,可以利用攔截器實(shí)現(xiàn)日志記錄、事務(wù)提交等通用工作套耕。
為此 cicada
提供一個(gè)接口: top.crossoverjie.cicada.server.intercept.CicadaInterceptor
谁帕。
我們只需要實(shí)現(xiàn)該接口即可編寫攔截功能:
@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 的執(zhí)行時(shí)間。
目前默認(rèn)只實(shí)現(xiàn)了 action 的攔截冯袍,后期也會(huì)加入自定義攔截器匈挖。
攔截適配器
雖說在攔截器中提供了 before/after
兩個(gè)方法,但也不是所有的方法都需要實(shí)現(xiàn)康愤。
因此 cicada
提供了一個(gè)適配器:
top.crossoverjie.cicada.server.intercept.AbstractCicadaInterceptorAdapter
我們需要繼承他便可按需實(shí)現(xiàn)其中的某個(gè)方法儡循,如下所示:
@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());
}
}
性能測(cè)試
既然是一個(gè) HTTP 服務(wù)框架,那性能自然也得保證征冷。
在測(cè)試條件為:300 并發(fā)連續(xù)壓測(cè)兩輪择膝;1G 內(nèi)存、單核 CPU检激、1Mbps肴捉。
用 Jmeter 壓測(cè)情況如下:
同樣的服務(wù)器用 Tomcat 來壓測(cè)看看結(jié)果。
Tomcat 的線程池配置:
<Executor name="tomcatThreadPool" namePrefix="consumer-exec-"
maxThreads="510" minSpareThreads="10"/>
我這里請(qǐng)求的是 Tomcat 的一個(gè) doc 目錄呵扛,雖說結(jié)果看似 cicada
的性能比 Tomcat 還強(qiáng)每庆。
但其實(shí)這個(gè)對(duì)比過程中的變量并沒有完全控制好,Tomcat 所返回的是 HTML今穿,而 cicada
僅僅返回了 json缤灵,當(dāng)然問題也不止這些。
但還是能說明 cicada
目前的性能還是不錯(cuò)的蓝晒。
總結(jié)
本文沒有過多討論 cicada
實(shí)現(xiàn)原理腮出,感興趣的可以看看源碼,都比較簡(jiǎn)單芝薇。
在后續(xù)的更新中會(huì)仔細(xì)探討這塊內(nèi)容胚嘲。
同時(shí)不出意外 cicada
會(huì)持續(xù)更新,未來也會(huì)加入更多實(shí)用的功能洛二。
甚至我會(huì)在適當(dāng)?shù)臅r(shí)機(jī)將它應(yīng)用于我的生產(chǎn)項(xiàng)目馋劈,也希望更多朋友能參與進(jìn)來一起把這個(gè)「輪子」做的更好。
項(xiàng)目地址:https://github.com/crossoverJie/cicada
你的點(diǎn)贊與轉(zhuǎn)發(fā)是最大的支持晾嘶。