๐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
IOC
beanFactoryใ - 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("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);
}
}
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.properties
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 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