對標 Spring Boot & Cloud ,輕量框架 Solon 1.4.12 釋出

劉之西東 發表於 2021-06-08

Solon 是一個輕量的Java基礎開發框架。強調,剋制 + 簡潔 + 開放的原則;力求,更小、更快、更自由的體驗。支援:RPC、REST API、MVC、Job、Micro service、WebSocket、Socket 等多種開發模式。短小而精悍!

Solon Cloud 是一系列的介面標準和配置規範,算是 Solon 的分散式開發套件方案。

快速瞭解Solon的材料:

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

《Solon Cloud 分散式服務開發套件清單,感覺受與 Spring Cloud 的不同》

《Solon 的想法與架構筆記》

《Solon 生態外掛清單》,目前已有100多個生態外掛

《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);

//手動為容器新增元件
Aop.wrapAndPut(DemoService.class);

本次版本主要變化:

1、增加新的外掛適配

  • 新增 opentracing-solon-plugin 外掛。可快速對接所有支援 opentracing 的鏈路跟蹤產品。下面以 Jaeger 對接為例:
@Configuration
public class Config {
    @Bean
    public Tracer tracer() throws TTransportException {
        Reporter reporter = new RemoteReporter.Builder()
                .withSender(new UdpSender(AGENT_HOST, AGENT_PORT, 0))
                .withFlushInterval(10)
                .build();

        return new JaegerTracer.Builder(Solon.cfg().appName())
                .withReporter(reporter)
                .withExpandExceptionLogs()
                .withSampler(new ConstSampler(true)).build();
    }
}

2、優化 Nami 內部結構(不影響外部呼叫)

  • 優化 Nami Filter;改為鏈式過濾;並新增 Invocation 做為配套
  • 拆分 Nami.Builder 為獨立的 NamiBuilder 類
  • 取消 Decoder, Encoder, Channel 對 Filter 的繼承;改為更明確的 pretreatment 預處理介面
  • 移動 Result 到 nami 一級包目錄
  • 簡化 Naimi 的附件模式。改由 NamiAttachment 直接操控

總體來說,是簡化和增強了 Nami 的過濾及附件能力。例:

//過濾能力
@Component
public class NamiFilterAdapter implements Filter {    //這是Nami的過濾器介面
    @Override
    public Result doFilter(Invocation inv) throws Throwable {
        inv.headers.put("token","1");
        System.out.println("我給 Nami 加了個頭資訊!");
        return inv.invoke();
    }
}

//附件能力
@Controller
public class Demo {
    @NamiClient
    HelloService helloService;

    @Mapping("/")
    public void test() {
        //新增附件:token=aaa (最終會做為 header 傳給 server)
        NamiAttachment.put("Token","5643c10c-87c3-4b7e-bd26-30cf2456aad8");
        
        //helloService 的 remoting server ,需要有 token 認證
        helloService.hello("noear");
    }
}

3、增強部分介面及相關配置能力

  • 增加 Solon Filter 序號位支援
  • 增加 Solon Props::getByParse 介面,可應對組合配置需要。例:Hello ${user.name} 這樣的配置需求
  • 增加 CloudJobHandler 介面,讓 Job Handler 更清晰些
  • 增加 Solon Auth 新註解:@AuthIp, @AuthPath 支援
  • 增加 CloudConfig 的註解內容,支援 ${xx}yyy 風格配置
  • 增加 CloudEvent 的註解內容,支援 ${xx}yyy 風格配置
  • 增加 CloudJob 的註解內容,支援 ${xx}yyy 風格配置
  • 增加 CloudBreaker 的註解內容,支援 ${xx}yyy 風格配置
  • 增加 @Component 單例元件通過 EventBus 擴充套件的機制
  • 增加 env 啟動引數切換配置檔案;例:java -jar xxx.jar -env=test
  • 標註 Utils::throwableWrap 函式為棄用,並調整內部異常包裝處理
  • 限制 DataThrowable 被最終渲染
  • 取消 WarnThrowable

4、日誌對接進一步增加

Solon 的日誌體系,除自有 slf4j 實現之後;還適配有 Logback 的新增器;現增加 Log4j 新增器的適配。

附:專案地址

附:入門示例