πFeatures |πQuick Start | πPerformance Test | πChangeLog | π‘ Contact Author|π¨π³δΈζζζ‘£
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.
- Clean code, without too much dependency.
 - One line of code to start the HTTP service.
 - Custom interceptor.
 - Custom exception handle.
 - Flexible parameters way.
 -  Response 
json. -  Start with 
jar. - Custom configuration.
 - Multiple response ways.
 -  Pluggable 
IOCbeanFactoryγ -  Support 
Cookie. - File Upload.
 
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") ;
    }
}@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"}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 cookie = new Cookie() ;
cookie.setName("cookie");
cookie.setValue("value");
CicadaContext.getResponse().setCookie(cookie);Cookie cookie = CicadaContext.getRequest().getCookie("cookie");
logger.info("cookie = " + cookie.toString());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 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);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.propertiesImplement 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);
    }
}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);
    }
}Test Conditions: 100 threads and 100 connections ;1G RAM/4 CPU
Nearly 10W requests per second.
- fix #40
 - add global handle exception interface.
 - get bean by class type.
 
- Logo.
 - Cookie Support.
 - Beautify the log.
 
- Fixed #9
 - Fixed #8,Multiple response ways.
 - Refactoring core code and add 
Cicada Context. - Elegant closing service.
 
- Fixed #6
 - Customize the configuration file.
 - Using flexible.
 - Refactor the code.
 
crossoverJie#gmail.com


