Solon 1.8.0 釋出,雲原生微服務開發框架

劉之西東發表於2022-05-27

相對於 Spring Boot 和 Spring Cloud 的專案

  • 啟動快 5 ~ 10 倍
  • qps 高 2~ 3 倍
  • 執行時記憶體節省 1/3 ~ 1/2
  • 打包可以縮小到 1/2 ~ 1/10(比如,90Mb 的變成了 9Mb)
  • 基於 app.name 進行註冊發現 與 k8s svc 相互對應
  • 支援 Service Mesh 架構部署方案

關於 Solon

Solon 是一個更現代感的應用開發框架,輕量、開放生態型的。支援 Web、Data、Job、Remoting、Cloud 等任何開發場景。

  • 強調,剋制 + 簡潔 + 開放 + 生態的原則
  • 力求,更小、更少、更快、更自由的體驗

目前有近130個生態外掛,含蓋了日常開發的各種需求:

Solon 1.8.0 釋出,雲原生微服務開發框架

本次主要更新內容

  • 新增 solon.extend.hotplug 外掛(提供業務外掛 '熱插撥' 和 '熱管理' 支援)
public class DemoApp {
    public static void main(String[] args) {
        Solon.start(App.class, args, app -> {
            //新增待管理的外掛
            PluginManager.add("add1", "/x/x/x.jar");
            PluginManager.add("add2", "/x/x/x2.jar");
     
            app.get("start", ctx -> {
                //啟動外掛
                PluginManager.start("add1");
                ctx.output("OK");
            });
            
            app.get("stop", ctx -> {
                //停止外掛
                PluginManager.stop("add1");
                ctx.output("OK");
            });
        });
    }
}

更多介紹看官網的:solon.extend.hotplug

  • 調整 AopContext ,更具隔離性
  • 調整 AopContext::beanOnloaded 引數由 Runnable 改為:Consumer
  • 調整 Plugin::start 引數由 SolonApp 改為:AopContext
public class Plugin1Impl implements Plugin {
    @Override
    public void start(AopContext context) {
        //通過當前上下文掃描,具有隔離性
        context.beanScan(Plugin1Impl.class);
        
        context.beanOnloaded(ctx->{
            //回撥有上下文資訊,方便做多外掛可複用的設計
        });
    }
}
  • 修復 @Cache 在函式裡有逗號時無法刪除快取的問題
@Controller
public class DemoController {
    /**
     * 執行結果快取10秒,使用 key=test_${label} 並新增 test 標籤
     * */
    @Cache(key="test_${label}", tags = "test" , seconds = 10)
    @Mapping("/cache/")
    public Object test(int label) {
        return new Date();
    }

    /**
     * 執行後,清除 標籤為 test  的所有快取
     * */
    @CacheRemove(tags = "test")
    @Mapping("/cache/clear")
    public String clear() {
        return "清除成功(其實無效)-" + new Date();
    }

    /**
     * 執行後,更新 key=test_${label}  的快取
     * */
    @CachePut(key = "test_${label}")
    @Mapping("/cache/clear2")
    public Object clear2(int label) {
        return new Date();
    }
}
  • 修復 Gateway 對預設介面識別失效的問題
@Mapping("/api/v3/app/**")
@Component
public class ApiGatewayV3 extends UapiGateway {
    @Override
    protected void register() {
        filter(new BreakerFilter()); //融斷

        before(new StartHandler()); //開始計時
        before(new ParamsParseHandler()); //引數解析
        before(new ParamsSignCheckHandler(new Md5Encoder())); //引數簽名較驗
        before(new ParamsRebuildHandler(new AesDecoder())); //引數重構

        after(new OutputBuildHandler(new AesEncoder())); //輸出構建
        after(new OutputSignHandler(new Md5Encoder())); //輸出簽名
        after(new OutputHandler()); //輸出
        after(new EndBeforeLogHandler()); //日誌
        after(new EndHandler("v3.api.app")); //結束計時

        //新增一批具體的介面處理Bean
        addBeans(bw -> "api".equals(bw.tag()));
    }
}
  • 修復 rocketmq-solon-plugin ,消費異常時仍返回成功的問題
  • 優化 rabbitmq-solon-plugin ,消費異常時的處理

專案地址

相關文章