Spring Boot 輕量替代框架 Solon 1.3.29 發布

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

//手動為容器添加組件
Aop.wrapAndPut(DemoService.class);

本次版本主要變化:

1、Solon cloud event 增加通道概念,以支援不同消息隊列產品共用

例如一個IoT項目的應用場景:業務消息用RabbitMQ,設備消息用 MQTT。

配置

solon.app:
  group: demo       #配置服務使用的默認組
  name: helloproducer    #發現服務使用的應用名

solon.cloud.mqtt:
  server: "tcp://localhost:41883"   #mqtt服務地址(默認通道不用命名)

solon.cloud.rabbitmq:
  server: localhost:5672   #rabbitmq 服務地址
  username: root           #rabbitmq 鏈接帳號
  password: 123456         #rabbitmq 鏈接密碼
  event:
    channel: "biz"      #對事件服務進行通道命名

生產端程式碼

@Controller
public class TestController {
    @Mapping("/test")
    public Object test(String msg) {
        //發送默認通道
        return CloudClient.event().publish(new Event("hello.demo", msg).qos(1).retained(true));
    }

    @Mapping("/test2")
    public Object test2(String msg) {
        //發送到biz通道(發送時,增加 channel 資訊即可)
        return CloudClient.event().publish(new Event("hello.demo2", msg).channel("biz"));
    }
}

消費端程式碼

//訂閱並消費默認通道的事件(為了演示把mqtt的消息訂閱過來了)
@CloudEvent("hello.demo")
public class EVENT_hello_demo implements CloudEventHandler {
    @Override
    public boolean handler(Event event) throws Throwable {
        System.out.println(LocalDateTime.now() + ONode.stringify(event));
        return true;
    }
}

//訂閱並消費biz通道的事件
@CloudEvent(value = "hello.demo2", channel = "biz")
public class EVENT_hello_demo2 implements CloudEventHandler {
    @Override
    public boolean handler(Event event) throws Throwable {
        System.out.println(LocalDateTime.now() + ONode.stringify(event));
        return true;
    }
}

2、Solon cloud breaker 斷路器增加動態配置支援

配置

solon.cloud.local:
  breaker:
    hello: 1   #斷路器名稱與閥值

演示程式碼

@Controller
public class DemoController {

    //此處安排了個斷路器(即限流器),如果斷路時,會返回HTTP 403狀態
    @CloudBreaker("hello")
    @Mapping("/hello")
    public String hello() {
        return "hello";
    }


    @Mapping("/reset")
    public void reset() {
        //重新設置斷路器的閥值(此配置,也可能過配置服務管理;動態更新)
        Solon.cfg().setProperty("solon.cloud.local.breaker.hello", "10");
    }
}

3、Solon logging 增加支援有格式化或無格式化的異常列印

Solon logging 是基於 slf4j 的個實現方案,內部對接 Solon cloud log service 介面,從而將日誌寫到分散式日誌服務。


//無格式化場景
log.error("Error: ", e);

//格式化場景
log.error("Error: {}", e);

4、增加路由組件切換支援


public class Demo10App {
    public static void main(String[] args) {
        Solon.start(Demo10App.class, args, app -> {
            Router router = new RouterCustom();

            //替換路由器
            app.routerSet(router);
        });
    }
}

5、@Init 增加延時處理機制,並默認為 true


@Component
public class Demo {
    @Init
    public void init(){
        //...
    }
}

6、優化session.jwt組件內部機制

附:入門示例