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

crossoverJie發表於2019-01-19

前言

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

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

好了,現在著重來談談 cicada 這個專案的核心功能。

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

也僅需要一行程式碼即可啟動一個 HTTP 服務。

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


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

特性

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

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

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

功能雖少,但五臟俱全。

在今後的迭代過程中會逐漸完善上圖功能,有好的想法也歡迎提 github.com/crossoverJi…

快速啟動

下面來看看如何快速啟動一個 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 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;
    }

}
複製程式碼

同時需要再自定義類中加上 @CicadaAction 註解,並需要指定一個 value,該 value 主要是為了在請求路由時能找到業務類。

這樣啟動應用並訪問

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

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

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

目前預設支援的是 json 響應,後期也會加上模板解析。

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

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

靈活的引數配置

這裡所有的請求引數都封裝在 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 壓測情況如下:

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

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

Tomcat 的執行緒池配置:

<Executor name="tomcatThreadPool" namePrefix="consumer-exec-"
        maxThreads="510" minSpareThreads="10"/>
複製程式碼

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

我這裡請求的是 Tomcat 的一個 doc 目錄,雖說結果看似 cicada 的效能比 Tomcat 還強。

但其實這個對比過程中的變數並沒有完全控制好,Tomcat 所返回的是 HTML,而 cicada 僅僅返回了 json,當然問題也不止這些。

但還是能說明 cicada 目前的效能還是不錯的。

總結

本文沒有過多討論 cicada 實現原理,感興趣的可以看看原始碼,都比較簡單。

在後續的更新中會仔細探討這塊內容。

同時不出意外 cicada 會持續更新,未來也會加入更多實用的功能。

甚至我會在適當的時機將它應用於我的生產專案,也希望更多朋友能參與進來一起把這個「輪子」做的更好。

專案地址:github.com/crossoverJi…

你的點贊與轉發是最大的支援。

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

相關文章