Spring Boot 輕量替代框架 Solon 1.3.20 釋出

劉之西東發表於2021-04-12

Solon 是一個微型的Java開發框架。專案2018年啟動,參考過大量前人作品;核心0.1m的身材,超高的跑分,以及良好的使用體驗。支援:RPC、REST API、MVC、WebSocket、Socket 等多種開發模式。

Solon 強調:剋制 + 簡潔 + 開放的原則;力求:更小、更快、更自由的體驗。

替代?那有什麼異同之處?

《Solon 特性簡集,相較於 Springboot 有什麼區別?》

《Solon 的架構筆記》

所謂更小:

核心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);
  • 此例程式碼摘自元件 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());

附:入門示例

相關文章