Solon 是一个微型的Java开发框架。项目从2018年启动以来,参考过大量前人作品;历时两年,4000多次的commit;内核保持0.1m的身材,超高的跑分,良好的使用体验。支持:RPC、REST API、MVC、WebSocket、Socket 等多种开发模式。
Solon 强调:克制 + 简洁 + 开放的原则;力求:更小、更快、更自由的体验。
替代?那有什么差别!
Solon 特性简集,相较于 Springboot 有什么区别?
所谓更小:
内核0.1m,最小开发单位0.2m(相比Dubbo、Springboot项目包,小到可以乎略不计)
所谓更快:
本机helloworld测试,Qps可达12万之多。可参考:《helloworld_wrk_test》
所谓更自由:(代码操控自由)
Props db = Solon.cfg().getProp("db");
UserService userService = Aop.get(UserService.class);
Solon.global().post("/user/update", x-> userService.updateById(x.paramMap()));
Solon.global().add("/rpc/", HelloService.class, true);
HelloService helloService = Nami.builder().create(HelloService.class);
本次版本重大变更:
1、增加过滤器(Filter),之前由触发器替代
所谓触发器,例:
app.before("/demo/", c-> System.out.println("我是请求之前触发的..."+ctx.path()) );
app.after("/demo/", c-> System.out.println("我是请求之后触发的..."+ctx.path()) );
“触发器”听起来像是数据库的东西,在Solon里的特性与数据库的触发特性确实也没什么区别。。。算是借用了。
Solon 之前的设计中仅有触发器和拦截器两种概念,也觉很够用。但某些场景下,过滤器会更合适。相对于触发器,过滤器的好处是把后续的处理完整的包围起来,拥有更强的控制性(比如,融断或并发限制)。
来看下Solon的过滤器,注解模式:
@Component
public class FilterDemo implements Filter {
@Override
public void doFilter(Context ctx, FilterChain chain) throws Throwable {
System.out.println("我是好人过滤器!!!path="+ctx.path());
chain.doFilter(ctx);
}
}
纯手写模式
app.filter((ctx, chain)->{
System.out.println("我是过滤器!!!path="+ctx.path());
chain.doFilter(ctx);
});
用法上,与Servlet的过滤器几首一样。。。(注:Solon 不是 Servlet 框架。它可以适配各种不同的Http容器)
2、强化自带网关的通用性、组装性
同一份接口实现,不同的协议输出:
简单版输出输入:
@Mapping("/api/v1/**")
@Controller
public class ApiGateway1x extends ApiGatewayBase {
@Override
protected void register() {
before(new StartInterceptor());
after(new OutputBuildInterceptor());
after(new OutputInterceptor());
after(new LogInterceptor());
after(new EndInterceptor("v1"));
addBeans(bw -> "api".equals(bw.tag()));
}
}
复杂版输入输出:
@Mapping("/api/v3/**")
@Component
public class ApiGateway3x extends ApiGatewayBase {
@Override
protected void register() {
filter(new SentryFilter());
before(new StartTrigger());
before(new ParamsParseTrigger());
before(new ParamsSignCheckTrigger(new Md5Encoder()));
before(new ParamsRebuildTrigger(new AesDecoder()));
after(new OutputBuildTrigger(new AesEncoder()));
after(new OutputSignTrigger(new Md5Encoder()));
after(new OutputTrigger());
after(new LogTrigger());
after(new EndTrigger("v3"));
addBeans(bw -> "api".equals(bw.tag()));
}
}
附:入门示例
(责任编辑:IT) |