π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.
- 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>2.0.0</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("textAction")
public class TextAction implements WorkAction {
@Override
public void execute(CicadaContext context, Param param) throws Exception {
String url = context.request().getUrl();
String method = context.request().getMethod();
context.text("hello world url=" + url + " method=" + method);
}
}At the same time, you can also get other information in the request context through context.request().
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 void before(Param param) {
start = System.currentTimeMillis();
}
@Override
public void after(Param param) {
end = System.currentTimeMillis();
LOGGER.info("cast [{}] times", end - start);
}
}If you only want to implement one of the methods ,only extends top.crossoverjie.cicada.server.intercept.AbstractCicadaInterceptorAdapter abstract class.
@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());
}
}Test Conditions: 100 threads and 100 connections ;1G RAM/4 CPU
Nearly 10W requests per second.
- 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




