天天看點

「造個輪子」——cicada(輕量級 WEB 架構)

前言

俗話說 「不要重複造輪子」,關于是否有必要不再本次讨論範圍。

建立這個項目的主要目的還是提升自己,看看和知名類開源項目的差距以及學習優秀的開源方式。

好了,現在着重來談談 cicada 這個項目的核心功能。

我把他定義為一個快速、輕量級 WEB 架構;沒有過多的依賴,核心 jar 包僅 30KB。

也僅需要一行代碼即可啟動一個 

HTTP

 服務。
「造個輪子」——cicada(輕量級 WEB 架構)

特性

現在來談談重要的幾個特性。

「造個輪子」——cicada(輕量級 WEB 架構)

目前版本主要實作了基本的請求、響應、自定義參數以及攔截器功能。

功能雖少,但五髒俱全。

在今後的疊代過程中會逐漸完善上圖功能,有好的想法也歡迎提 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

便能執行業務邏輯同時得到服務端的傳回。

「造個輪子」——cicada(輕量級 WEB 架構)

目前預設支援的是 

json

 響應,後期也會加上模闆解析。

服務中也會列印相關日志。

「造個輪子」——cicada(輕量級 WEB 架構)

靈活的參數配置

這裡所有的請求參數都封裝在 

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 壓測情況如下:

「造個輪子」——cicada(輕量級 WEB 架構)

同樣的伺服器用 Tomcat 來壓測看看結果。

Tomcat 的線程池配置:

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

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

「造個輪子」——cicada(輕量級 WEB 架構)

我這裡請求的是 Tomcat 的一個 doc 目錄,雖說結果看似 

cicada

 的性能比 Tomcat 還強。

但其實這個對比過程中的變量并沒有完全控制好,Tomcat 所傳回的是 HTML,而 

cicada

 僅僅傳回了 json,當然問題也不止這些。

但還是能說明 

cicada

 目前的性能還是不錯的。

總結

本文沒有過多讨論 

cicada

 實作原理,感興趣的可以看看源碼,都比較簡單。

在後續的更新中會仔細探讨這塊内容。

同時不出意外 

cicada

 會持續更新,未來也會加入更多實用的功能。

甚至我會在适當的時機将它應用于我的生産項目,也希望更多朋友能參與進來一起把這個「輪子」做的更好。

原文釋出時間為:2018-09-3

本文來自雲栖社群合作夥伴“

crossoverJie

”,了解相關資訊可以關注“

”。