Spring Boot 輕量替代框架 Solon 1.3.20 發布
- 2021 年 4 月 12 日
- 筆記
- JAVA, RPC, solon, springboot
Solon 是一個微型的Java開發框架。項目2018年啟動,參考過大量前人作品;內核0.1m的身材,超高的跑分,以及良好的使用體驗。支援:RPC、REST API、MVC、WebSocket、Socket 等多種開發模式。
Solon 強調:剋制 + 簡潔 + 開放的原則;力求:更小、更快、更自由的體驗。
替代?那有什麼異同之處?
《Solon 特性簡集,相較於 Springboot 有什麼區別?》
所謂更小:
內核0.1m,最小的介面開發單位0.2m(相較於 Dubbo、Springboot 的依賴包,小到可以乎略不計)
所謂更快:
本機http helloworld測試,Qps可達12萬之多。可參考:《helloworld_wrk_test》
所謂更自由:(程式碼操控自由)
// 除了註解模式之外,還可以按需手動
//
//手動獲取配置(Props 為 Properties 增強版)
Props db = Solon.cfg().getProp("db");
//手動獲取容器里的Bean
UserService userService = Aop.get(UserService.class);
//手動監聽http post請求
Solon.global().post("/user/update", x-> userService.updateById(x.paramMap()));
//手動添加個RPC服務
Solon.global().add("/rpc/", HelloService.class, true);
//手動獲取一個RPC服務消費端
HelloService helloService = Nami.builder().create(HelloService.class);
本次版本主要變化:
1、Solon Cloud 增加分散式文件服務定義: CloudFileService
public interface CloudFileService {
InputStream getStream(String bucket, String key) throws CloudFileException;
Result putStream(String bucket, String key, InputStream stream, String streamMime) throws CloudFileException;
InputStream getText(String bucket, String key) throws CloudFileException;
Result putText(String bucket, String key, String text) throws CloudFileException;
...
}
2、Solon Cloud 增加適配組件:aliyun-oss-solon-plugin、aws-s3-solon-plugin(適配 CloudFileService)
以 aliyun-oss-solon-plugin 使用為例:
- 配置:
solon.cloud.aliyun.oss: # 亞馬遜則為:solon.cloud.aws.s3
file:
bucket: aaa
endpoint: bbb.xxx.xxx
accessKey: ccc
secretKey: ddd
#可以通過配置服務動態載入,以靈活切換不同的配置
#solon.cloud.water:
# server: water
# config:
# load: xxx_hdfs_cfg
- 程式碼:
public class DemoService {
public void test() {
String key = "test/" + Utils.guid();
String val = "Hello world!";
//寫入數據
Result result = CloudClient.file().putText(key, val);
System.out.println(ONode.stringify(result));
assert result.getCode() == Result.SUCCEED_CODE;
//讀取數據
String tmp = CloudClient.file().getText(key);
assert val.equals(tmp);
}
}
3、Solon Cloud 增加適配組件:mqtt-solon-plugin(適配 CloudEventService)
配置示例:
solon.app:
group: demo
name: consumer
solon.cloud.mqtt:
server: "tcp://localhost:41883" #mqtt服務地址
程式碼示例:
@Controller
public class TestController {
@Mapping("/test")
public Object test(String msg) {
if(Utils.isEmpty(msg)){
msg = "demo2";
}
Event event = new Event("hello.demo", msg).qos(1).retained(true);
return CloudClient.event().publish(event);
}
}
4、增加應用啟動事件:AppInitEndEvent
Solon 啟動處理順序:
- 1.實例化 Solon.global() 並載入配置
- 2.載入擴展文件夾
- 3.掃描插件並排序
- 4.運行 initialize 函數
- 5.推送 AppInitEndEvent 事件(新增)
- 6.運行插件
- 7.推送 PluginLoadEndEvent 事件
- 8.導入java bean(@Import)
- 9.掃描並載入java bean
- a.推送 BeanLoadEndEvent 事件
- b.載入渲染印映關係
- c.執行bean加完成事件
- d.推送 AppLoadEndEvent 事件
- e.結束
//訂閱示例(通過Solon事件匯流排提前訂閱)
EventBus.subscribe(AppInitEndEvent.class, event->{
System.out.println("app init end...");
});
Solon.start(App.class, args);
5、取消 HandlerLink 類,增加 HandlerPipeline 類
- 此例程式碼摘自組件 solon.extend.staticfiles :
//切換處理(讓靜態文件優先)
HandlerPipeline pipeline = new HandlerPipeline();
pipeline.next(new StaticResourceHandler()).next(app.handlerGet());
app.handlerSet(pipeline);
- 此例程式碼摘自組件 srww.base
SolonServletFilter.onFilterEnd = new HandlerPipeline().next(new BaseLogHandler()).next(new BaseEndHandler());
附:入門示例
- 項目地址://gitee.com/noear/solon
- 入門教程示例://gitee.com/noear/solon_demo
- RPC入門教程示例://gitee.com/noear/solon_rpc_demo
- 進階教程示例://gitee.com/noear/solon_advance_demo