cicada

Fast, lightweight Web framework based on Netty

License

License

GroupId

GroupId

top.crossoverjie.opensource
ArtifactId

ArtifactId

cicada
Last Version

Last Version

2.0.4
Release Date

Release Date

Type

Type

pom
Description

Description

cicada
Fast, lightweight Web framework based on Netty
Project URL

Project URL

https://crossoverjie.top/categories/cicada/
Source Code Management

Source Code Management

https://github.com/TogetherOS/cicada

Download cicada

Filename Size
cicada-2.0.4.pom 7 KB
Browse

How to add to project

<!-- https://jarcasting.com/artifacts/top.crossoverjie.opensource/cicada/ -->
<dependency>
    <groupId>top.crossoverjie.opensource</groupId>
    <artifactId>cicada</artifactId>
    <version>2.0.4</version>
    <type>pom</type>
</dependency>
// https://jarcasting.com/artifacts/top.crossoverjie.opensource/cicada/
implementation 'top.crossoverjie.opensource:cicada:2.0.4'
// https://jarcasting.com/artifacts/top.crossoverjie.opensource/cicada/
implementation ("top.crossoverjie.opensource:cicada:2.0.4")
'top.crossoverjie.opensource:cicada:pom:2.0.4'
<dependency org="top.crossoverjie.opensource" name="cicada" rev="2.0.4">
  <artifact name="cicada" type="pom" />
</dependency>
@Grapes(
@Grab(group='top.crossoverjie.opensource', module='cicada', version='2.0.4')
)
libraryDependencies += "top.crossoverjie.opensource" % "cicada" % "2.0.4"
[top.crossoverjie.opensource/cicada "2.0.4"]

Dependencies

There are no dependencies for this project. It is a standalone project that does not depend on any other jars.

Project Modules

  • cicada-core
  • cicada-ioc
  • cicada-base

Build Status QQ群

📘 Features | 🌁 Quick Start | 🏖 Performance Test | 🌈 ChangeLog | 💡 Contact Author| 🇨🇳 中文文档



Introduction

Fast, lightweight Web framework based on Netty; without too much dependency, and the core jar package is only 30KB.

If you are interested, please click Star.

Features

Quick Start

Create a project with Maven, import core dependency.

<dependency>
    <groupId>top.crossoverjie.opensource</groupId>
    <artifactId>cicada-core</artifactId>
    <version>x.y.z</version>
</dependency>

Of course, it is recommended to introduce an additional IOC container plugin:

<dependency>
    <groupId>top.crossoverjie.opensource</groupId>
    <artifactId>cicada-ioc</artifactId>
    <version>2.0.4</version>
</dependency>

start class:

public class MainStart {

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

Configuring Business Action

@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<DemoReq> reqWorkRes = new WorkRes<>() ;
        reqWorkRes.setMessage("hello =" + req.getName());
        CicadaContext.getContext().json(reqWorkRes) ;
    }

    @CicadaRoute("getInfo")
    public void getInfo(DemoReq req){

        WorkRes<DemoReq> reqWorkRes = new WorkRes<>() ;
        reqWorkRes.setMessage("getInfo =" + req.toString());
        CicadaContext.getContext().json(reqWorkRes) ;
    }

    @CicadaRoute("getReq")
    public void getReq(CicadaContext context,DemoReq req){

        WorkRes<DemoReq> reqWorkRes = new WorkRes<>() ;
        reqWorkRes.setMessage("getReq =" + req.toString());
        context.json(reqWorkRes) ;
    }



}

Launch and apply access: http://127.0.0.1:5688/cicada-example/routeAction/getUser?id=1234&name=zhangsan

{"message":"hello =zhangsan"}

Cicada Context

Through context.json(), context.text(), you can choose different response ways.

@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<DemoReq> 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 Support

Set Cookie

Cookie cookie = new Cookie() ;
cookie.setName("cookie");
cookie.setValue("value");
CicadaContext.getResponse().setCookie(cookie);

Get Cookie

Cookie cookie = CicadaContext.getRequest().getCookie("cookie");
logger.info("cookie = " + cookie.toString());

Custom configuration

By default, the configuration file under the classpath is read.

You can also customize the configuration file.

Just need to extends top.crossoverjie.cicada.server.configuration.AbstractCicadaConfiguration class.

Write the name of the configuration file at the same time.

Like this:

public class RedisConfiguration extends AbstractCicadaConfiguration {


    public RedisConfiguration() {
        super.setPropertiesName("redis.properties");
    }

}

public class KafkaConfiguration extends AbstractCicadaConfiguration {

    public KafkaConfiguration() {
        super.setPropertiesName("kafka.properties");
    }


}

Get configuration information

Get the configuration infomation, follow this:

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);

External configuration file

Configuration files can also be read in multiple environments, just add VM parameters, also ensure that the parameter name and file name are consistent.

-Dapplication.properties=/xx/application.properties
-Dkafka.properties=/xx/kakfa.properties
-Dredis.properties=/xx/redis.properties

Custom interceptor

Implement top.crossoverjie.cicada.example.intercept.CicadaInterceptor interface.

@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);
    }
}

Custom exception handle

You can define global exception handle,like this:

@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);
    }
}

Performance Test

Test Conditions: 100 threads and 100 connections ;1G RAM/4 CPU

Nearly 10W requests per second.

ChangeLog

v2.0.2

  • fix #40
  • add global handle exception interface.
  • get bean by class type.

v2.0.1

  • Logo.
  • Cookie Support.
  • Beautify the log.

v2.0.0

  • Fixed #12 #22 #28
  • Flexible routing ways.
  • Pluggable IOC beanFactory.

v1.0.3

  • Fixed #9
  • Fixed #8,Multiple response ways.
  • Refactoring core code and add Cicada Context.
  • Elegant closing service.

v1.0.2

  • Fixed #6
  • Customize the configuration file.
  • Using flexible.
  • Refactor the code.

Contact author

crossoverJie#gmail.com

qrcode_for_gh_3a954a025f10_258.jpg

Special thanks

top.crossoverjie.opensource

Together Open Source

Let's open source together ,Welcome everyone to participate.

Versions

Version
2.0.4
2.0.2
2.0.1
2.0.0
1.0.4
1.0.3
1.0.2
1.0.1