Solon 1.7 重要釋出,更現代感的應用開發框架

劉之西東發表於2022-04-26

相對於 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個生態外掛,含蓋了日常開發的各種需求。

本次主要更新內容

  • 新增 hasordb-solon-plugin 外掛
@Service
public class DemoService{
    @Db("db1")
    JdbcTemplate jdbcTemplate;
    
    @Db("db1")
    LambdaTemplate lambdaTemplate;
    
    public void test(){
        var dtoList = jdbcTemplate.queryForList("select * from test_user", TestUser.class);
        var dtoList2 = lambdaTemplate.lambdaQuery(TestUser.class).queryForList();
    }
}
  • 新增 solon.cache.redisson 外掛
#完整配置示例
demo.cache1:
  driverType: "redisson" #快取驅動型別
  server: "localhost:6379"
  password: "1234"
  db: 0 #預設為 0,可不配置
  defSeconds: 30 #預設為 30秒,可不配置
//配置快取服務
@Configuration
public class Config {
    //通過 CacheServiceSupplier ,可根據 driverType 自動構建快取服務
    @Bean(name = "cache2s")
    public CacheService cache2(@Inject("${demo.cache2}") CacheServiceSupplier supplier){
        return supplier.get();
    }
}
  • 新增 solon.sessionstate.redisson 外掛
  • 新增 solon.sessionstate.jedis 外掛(替代舊的 solon.extend.sessionstate.redis)
  • 新增 solon.sessionstate.local 外掛(替代舊的 solon.extend.sessionstate.local)
  • 外掛 httputils-solon-plugin 增加對服務上游和地址的檢測
  • 外掛 beetlsql-solon-plugin 升級 beetlsql 為 3.14.0
  • 外掛 water-solon-plugin 升級 water 為:2.6.2 新增 ak/sk 和 多語言包 適配
  • 外掛 mybatis-plus-solon-plugin 增加對 globalConfig 的配置支援
  • 外掛 weed3-solon-plugin 升級 weed3 為:3.4.25
@Service
public class DemoService{
    @Db("db1")
    DbContext db1;
    
    public void test(){
        var dtoList = db1.table("test_user").limit(10).selectList("*", TestUser.class);
    }
}
  • 外掛 sqltoy-solon-plugin 升級 sqltoy 為:5.1.31
  • 新增 配置注入支援 字串值 按需轉換為 object(bean)
mybatis.db1:
    typeAliases:    
        - "demo4031.model"
    mappers:        
        - "demo4031.dso.mapper"
    configuration:
        cacheEnabled: false
        logImpl: "org.apache.ibatis.logging.nologging.NoLoggingImpl"
    globalConfig:
        metaObjectHandler: "demo4031.dso.MetaObjectHandlerImpl" #新增的支援
        dbConfig:
            logicDeleteField: "deleted"
  • 新增 Solon Cloud 國際化介面規範
@Configuration
public class DemoConfig {
    @Bean
    public I18nBundleFactory i18nBundleFactory(){
        //將國際化服務,切換為雲端介面
        return new CloudI18nBundleFactory();
    }
}
  • 新增 SessionStateBase 提供會話狀護的基礎能力支援
  • 新增 CloudBreakerService /root 配置支援(可支援動態建立)
solon.cloud.local:
  breaker:
    root: 100 #預設100 (Qps100 或 訊號量為100;視外掛而定)
    main: 150 
    
#此配置可以放到配置中心,例:
#solon.cloud.water:
#    server: "waterapi:9371"
#    config.load: "breaker.yml"
  • 新增 MethodWrap::getArounds() 介面
public class DemoApp {
    public static void main(String[] args) {
        Solon.start(DemoApp.class, args, app -> {
            //除錯模式下,增加請求包圍攔截器的列印
            if (Solon.cfg().isDebugMode()) {
                app.after(ctx -> {
                    Action action = ctx.action();
                    if (action != null && action.method().getArounds().size() > 0) {
                        StringBuilder buf = new StringBuilder();
                        
                        buf.append("path: ").append(ctx.path()).append(": ");
                        for (InterceptorEntity ie : action.method().getArounds()) {
                            buf.append(ie.getReal().getClass().getName()).append(",");
                        }
                        buf.setLength(buf.length() - 1);
                        
                        System.out.println(buf);
                    }
                });
            }
        });
    }
}
  • 新增 NamiBuilder::timeout 介面
HelloService rpc = Nami.builder().url("tcp://localhost:28080/demoe/rpc")
                                   .encoder(SnackTypeEncoder.instance)
                                   .timeout(60 * 60) //單位:秒
                                   .create(HelloService.class);
  • 調整 session-id-key 可配置 "server.session.cookieName"
#設定會話超時秒數(單位:秒)
server.session.timeout: 3600 
#設定會話id的cookieName
server.session.cookieName: "E52Ou8sV"
  • 調整 Action::bean() 更名為 controller()
public class DemoApp {
    public static void main(String[] args) {
        Solon.start(DemoApp.class, args);

        //列印所有路由記錄裡的控制器名
        Collection<Routing<Handler>> routings = Solon.global().router().getAll(Endpoint.main);
        for(Routing<Handler> routing : routings){
            if(routing.target() instanceof Action){
                Action action = (Action) routing.target();
                System.out.println(action.controller().name());
            }
        }
    }
}
  • 調整 Gateway 內部路由改為 RoutingTable 介面,支援 method(之前為 Map)
  • 調整 屬性注入的異常透傳機制
  • 調整 CloudConfigHandler:handler 更名為:handle
  • 調整 CloudDiscoveryHandler:handler 更名為:handle
  • 調整 CloudEventHandler:handler 更名為:handle
  • 調整 CloudEventInterceptor:doInterceptor 更名為:doIntercept
  • 調整 CloudJobInterceptor:doInterceptor 更名為:doIntercept
  • snack3 升級為:3.2.21
  • redisx 升級為:1.4.3

進一步瞭解 Solon

專案地址

相關文章