micrboot,不依赖容器的JAVA轻量级HTTP服务框架,是一种的进步,
micrboot是我写的一个JAVA轻量级不依赖容器的HTTP服务框架,无法和springMVC+tomcat 或springBoot 想匹敌,但单纯的从一个HTTP 后端服务来讲,J2EE规范不应该是很适合的,由此设计开发了Micrboot,借鉴了springMVC的一些思想,不知道是一种思想上的进步,还是无意义的下折腾? 如下是micrboot的README.md文件micrboot干什么的基于netty高性能网络框架的HTTP RESTful服务器,非常适合后台接口的微服务。 和作者一样不喜欢微服务还要依赖一个重量级的WEB容器的同学,绝对是不二的选择 micrboot架构图优点
缺点
为什么写micrbootspringBoot越来越流行的今天,为什么要写micrboot?
TIPS:这一版是还没有经过线上的考验目前micrboot正在做性能测试,将对比tomcat,只做Http解码的Netty服务,后面在末尾增加性能测试报告(非专业) micrboot现在只是一个架子,还没有在正式环境中运行过,甚至完整的测试过,有任何问题,请发issue 怎么启动
<dependency>
<groupId>com.zhuanglide</groupId>
<artifactId>micrboot</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
具体可以参照micrboot-demo/src/main/resources/api.xml <context:component-scan base-package="com.zhuanglide.micrboot.demo.**">
<!-- 扫描ApiCommand注解 -->
<context:include-filter type="annotation" expression="com.zhuanglide.micrboot.mvc.annotation.ApiCommand"/>
</context:component-scan>
<!-- config server -->
<bean name="server" class="com.zhuanglide.micrboot.Server">
<property name="port" value="8080"/> <!-- set port=8080 -->
</bean>
@ApiCommand
public class ApiCommandTest{
@ApiMethod("/t1")
public ModelAndView test1(@ApiParam("name")String name,@ApiParam("age")int age){
ModelAndView mv = new ModelAndView("JSON_VIEW");
Map<String,Object> res = new HashMap<String,Object>();
res.put("a","我的家");
res.put("b",new Date());
res.put("name",name);
res.put("age",age);
mv.setResult(res);
return mv;
}
//restful,只针对GET请求
@ApiMethod("/t2",httpMethod = ApiMethod.HttpMethod.GET)
public ModelAndView test2(){
ModelAndView mv = new ModelAndView("JSON_VIEW");
Map<String,Object>();
res.put("Hello","这是一");
res.put("gaga",new Date());
mv.setResult(res);
return mv;
}
@ApiMethod("/detail/{id}")
public ModelAndView detail(@ApiPathVariable("id")int id,@ApiParam("name")String name){
ModelAndView mv = new ModelAndView("jsonView");
Map<String,Object>();
res.put("Hello","这是一");
res.put("gaga",new Date());
res.put("detailId",id);
res.put("name",name);
mv.setResult(res);
return mv;
}
}
{
"b": 1491034714263,"age": 123,"name": "哈哈","a": "我的家" }
具体可以参照micrboot-demo/src/main/java/com.zhuanglide.micrboot.demo.Main public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:api.xml");
Server server = context.getBean(Server.class);
server.start();
}
拦截器
public class TestInterceptor extends AbstractApiInterceptor {
int order ; //拦截器顺序
//分发之前,甚至可以更改最终invoke的接口
@Override
public boolean preDispatch(HttpRequest request,HttpResponse response) {
System.out.println("TestInterceptor preDispatch url="+request.getRequestUrl());
return super.preDispatch(request,response);
}
//执行invoke方法之前,可以更改,增加删除参数值
@Override
public void postHandler(ApiCommandMapping mapping,HttpRequest request,HttpResponse response) {
System.out.println("TestInterceptor postHandler url="+request.getRequestUrl());
super.postHandler(mapping,request,response);
}
//执行invoke方法之后,可以修改返回值
@Override
public void afterHandle(ApiCommandMapping mapping,Object modelView,HttpResponse response,Throwable throwable) {
System.out.println("TestInterceptor afterHandle url="+request.getRequestUrl());
super.afterHandle(mapping,modelView,response,throwable);
}
}
增加拦截器,需要在spring配置文件中显示调用 <bean class="com.zhuanglide.micrboot.demo.interceptor.TestInterceptor">
<property name="order" value="1"/>
</bean>
多接口合并
参考micrboot-demo/src/main/resources/api.xml <bean class="com.zhuanglide.micrboot.mvc.ApiDispatcher"/>
简单示例,在实际生产中,可以根据约定,自动解析要执行的接口,如果对执行顺序无要求,最好使用多线程的方式去执行,如果有严格要求,需要顺序的执行,使用者可以灵活掌握。 @ApiCommand("batch")
public class BatchCommndTest {
@Autowired(required = false)
private ApiDispatcher apiDispatcher;
@ApiMethod("run")
public ModelAndView batchRun(HttpContextRequest request,HttpContextResponse response){
ModelAndView mv = new ModelAndView("jsonView");
Map<String,Object> res = new HashMap<String,Object>();
try {
HttpContextRequest _req1 = request.clone();
_req1.setRequestUrl("/t1");
_req1.addParameter("name","auto name,xiaowang");
_req1.addParameter("age","18");
Object r1 = apiDispatcher.doProcess(_req1,response);
HttpContextRequest _req2 = request.clone();
_req2.setRequestUrl("/t2");
Object r2 = apiDispatcher.doProcess(_req2,null,false);
if (r1 != null && r1 instanceof ModelAndView) {
ModelAndView _mv = (ModelAndView) r1;
r1 = _mv.getResult();
}
if (r2 != null && r2 instanceof ModelAndView) {
ModelAndView _mv = (ModelAndView) r2;
r2 = _mv.getResult();
}
res.put("t1",r1);
res.put("t2",r2);
mv.setResult(res);
} catch (Exception te) {
te.printStackTrace();
mv.setResult("exception");
}
return mv;
}
}
{
"t2": { "gaga": 1491035540912,"Hello": "这是一" },"t1": { "b": 1491035539497,"age": 18,"name": "auto name,xiaowang","a": "我的家" } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |