相对于 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

项目地址

最新文章

  1. CSS特殊性值
  2. python2.1-原理之琐碎技巧
  3. (1)建立一个名叫Cat的类: 属性:姓名、毛色、年龄 行为:显示姓名、喊叫 (2)编写主类: 创建一个对象猫,姓名为“妮妮”,毛色为“灰色”,年龄为2岁,在屏幕上输 出该对象的毛色和年龄,让该对象调用显示姓名和喊叫两个方法。
  4. Matlab的GUI参数传递方式总结
  5. js,css 和 html 分离,见仁见智
  6. linux crontab 命令
  7. C#高级编程四十九天----队列
  8. JAVA循环结合标签使用,控制跳转
  9. 【Cocos2d-x】Mac 在 Cocos2d-x 3.X 打包Android
  10. DataTable.DataRow的复制
  11. Java对象的内存模型(一)
  12. 老李推荐:第2章4节《MonkeyRunner源码剖析》了解你的测试对象: NotePad窗口Activity之菜单简介
  13. [笔记]scanf的使用(主要是针对char)
  14. python下用OpenCV的圆形检测
  15. 3-学习GPRS_Air202(需要知道的关于Lua的一些基本的知识)
  16. 第一册:lesson1-2.
  17. Linux中输入输出重定向的问题
  18. JavaScript是如何工作的:事件循环和异步编程的崛起 + 5种使用 async/await 更好地编码方式!
  19. 填坑:Windows下使用OpenSSL生成自签证书(很简单,一个晚上搞明白的,让后来者少走弯路)
  20. HDU 2206

热门文章

  1. Golang 语言特性
  2. TTL、RS232、RS485、UART、串口的关系和常见半双工、全双工协议
  3. idea 下 Vue
  4. 什么是原子操作?在 Java Concurrency API 中有哪些原 子类(atomic classes)?
  5. Mysql的索引及优化
  6. spring-boot -缓存注解
  7. SQLyog创建用户并授权的过程
  8. 信号量,semaphore源代码之我见
  9. Unsafe Rust 能做什么
  10. 9_根轨迹_Part3_分离点/汇合点和根的性质