「車輪を作る」——cicada(軽量級WEBフレーム)


前言
「車輪を作るのを繰り返さない」と言われるように、今回の議論の範囲をやめる必要があるかどうかについて.
このプロジェクトを作成する主な目的はやはり自分を向上させ、有名なオープンソースプロジェクトとの差を見て、優秀なオープンソース方式を学ぶことです.
では、cicadaというプロジェクトの核心機能についてお話しします.
私は彼を高速で軽量級のWEBフレームワークと定義した.あまり依存しておらず、コアjarパッケージは30 KBしかありません.
1行のコードだけでHTTPサービスを開始することもできます.
とくせい
重要ないくつかの特性についてお話しします.
現在のバージョンでは、主に基本的なリクエスト、応答、カスタムパラメータ、ブロッキング機能が実現されています.
機能は少ないが、五臓がそろっている.
今後の反復過程で上図機能が徐々に改善されるので、良いアイデアがあれば教えてください.https://github.com/crossoverJie/cicada/issues.
クイックスタート
HTTPサービスをすばやく起動する方法を見てみましょう.
Mavenプロジェクトを作成し、コアパッケージを導入するだけです.

    top.crossoverjie.opensource
    cicada-core
    1.0.0

上の図に示すように、起動クラスをもう1つ構成すればいいです.
public class MainStart {

    public static void main(String[] args) throws InterruptedException {
        CicadaServer.start(MainStart.class,"/cicada-example") ;
    }
}

ビジネスアクションの設定
もちろん、ビジネスロジックを実現する場所も必要です.cicadaは、インタフェースを実装するだけで特定の論理を実装できるインタフェースを提供する.
ビジネスアクション実装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 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 res = new WorkRes();
        res.setCode(StatusEnum.SUCCESS.getCode());
        res.setMessage(StatusEnum.SUCCESS.getMessage());
        res.setDataBody(demoResVO) ;
        return res;
    }

}

また、カスタムクラスに@CicadaAction注記を追加する必要があり、主にルーティングを要求するときにビジネスクラスを見つけるためのvalueを指定する必要があります.
アプリケーションを起動してアクセスhttp://127.0.0.1:7317/cicada-example/demoAction?name=12345&id=10
ビジネスロジックを実行しながら、サービス側のリターンを得ることができます.
現在、デフォルトではjson応答がサポートされており、後期にはテンプレート解析も追加されます.
サービスでは関連ログも印刷されます.
柔軟なパラメータ構成
ここで、すべての要求パラメータは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の2つの方法が提供されているが,すべての方法が実現される必要はない.
したがって、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で測定した場合は以下の通りである.
同じサーバでTomcatで結果を圧してみます.
Tomcatのスレッドプール構成:

私がここで要求したのはTomcatのdocディレクトリで、結果はcicadaの性能がTomcatよりも強いように見えますが.
しかし、この比較中の変数は完全に制御されていません.TomcatはHTMLを返していますが、cicadaはjsonだけを返しています.もちろん問題はこれだけではありません.
しかし、cicadaの現在の性能は悪くないことを説明することができます.
まとめ
本文はcicadaの実現原理をあまり議論していないので、興味のあるのはソースコードを見ることができて、すべて比較的に簡単です.
後続の更新ではこの内容をよく検討します.
同時に、意外なcicadaが更新され続け、将来的にはより多くの実用的な機能が追加されます.
私は適当なタイミングでそれを私の生産プロジェクトに応用して、もっと多くの友达が参加して一緒にこの「車輪」をもっとよくすることを望んでいます.
プロジェクトのアドレス:https://github.com/crossoverJie/cicada
あなたのいいねと転送は最大のサポートです.