相对于 Spring Boot 和 Spring Cloud 的项目
- 启动快 5 ~ 10 倍
- qps 高 2~ 3 倍
- 运行时内存节省 1/3 ~ 1/2
- 打包可以缩小到 1/2 ~ 1/10(比如,90Mb 的变成了 9Mb)
关于 Solon
Solon 是一个更现代感的应用开发框架,轻量、开放生态型的。支持 Web、Data、Job、Remoting、Cloud 等任何开发场景。
- 强调,克制 + 简洁 + 开放 + 生态的原则
- 力求,更小、更少、更快、更自由的体验
目前有近130个生态插件,含盖了日常开发的各种需求。
本次主要更新
- 添加 SocketContext::SessionState 接口支持
@Controller
public class DemoController{
@Socket
@Mapping("/hello")
public String hello(Context ctx){
if(ctx.session("user") == null){
ctx.sessionSet("user", "noear");
}
return ctx.session("user");
}
}
- 添加 Session::pathNew() 接口支持
- 添加 SolonApp::listenBefore, SolonApp::listenAfter 接口,以提供 Listener 过滤的支持
public class DemoApp {
public static void main(String[] args) {
Solon.start(DemoApp.class, args, app -> {
app.listenBefore(new ListenerEmpty() {
@Override
public void onOpen(Session session) {
//修改ws的监听路径
if (session.path().startsWith("/xx/")) {
session.pathNew(session.path().substring(4));
}
}
});
});
}
}
- 添加 sa-token-solon-plugin 插件对 dao 适配[实验方案]
- SaTokenDaoOfRedis
- SaTokenDaoOfSession
- 新增 mybatis-plus-extension-solon-plugin 插件
- 插件 solon.extend.sessionstate.jwt 呼略 ServiceConfigurationError 抛出
- 添加 CloudJobInterceptor,提供 job 的拦截机制
@Slf4j
public class CloudJobInterceptorImpl implements CloudJobInterceptor {
@Override
public void doIntercept(Job job, CloudJobHandler handler) throws Throwable {
long start = System.currentTimeMillis();
try {
handler.handle(job.getContext());
} catch (Throwable e) {
//记录带标签的日志
TagsMDC.tag0("job");
TagsMDC.tag1(job.getName());
log.error("{}", e);
throw e; //别吃掉
} finally {
//记录一个内部处理的花费时间
long timespan = System.currentTimeMillis() - start;
CloudClient.metric().addMeter(Solon.cfg().appName(), "job", timespan);
}
}
}
- 添加 CloudEventInterceptor,提供 event 的拦截机制
//CloudEventInterceptor 与 CloudJobInterceptor 起到类型的作用
- 调整 Gateway 的缺省处理设定方式
- 调整 CloudJobHandler 为 job 的强制接口,之前 Handler 即可
- 调整 HttpUtils 增加短处理和长处理的切换支持
进一步了解 Solon
- 《想法与架构笔记》
- 《生态预览》
- 《与 Spring Boot 的区别?》
- 《与 Spring Cloud 的区别?》