Solon 1.2.12 釋出,新的驚喜

劉之西東發表於2020-12-25

Solon 一個類似Springboot的微型開發框架。專案從2018年啟動以來,參考過大量前人作品;歷時兩年,3500多次的commit;核心保持0.1m的身材,超高的Web跑分,良好的使用體驗。

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

所謂更小:

核心0.1m,最小Web開發單位0.2m(相比Springboot專案包,小到可以乎略不計了)

所謂更快:

本機helloworld測試,Qps可達12萬之多。可參考:《helloworld_wrk_test

所謂更自由:

  • 程式碼操控自由:
// 除了注入模式之外,還可以按需手動
//
//手動獲取配置
Map<String,String> db = Solon.cfg().getMap("db");
//手動獲取容器裡的Bean
UserService userService = Aop.get(UserService.class);
//手動監聽http post請求
Solon.global().post("/user/update", x-> userService.updateById(x.paramMap()));
  • 框架選擇自由:

可以用solon-web這樣的快速開發整合包。也可以按專案需要選擇不同的外掛組裝,比如:為非Solon專案新增solon.boot.jlhttp,0.1m即可讓專案實現http+mvc支援;還可以用MVC開發Socket應用。

也可以用快餐方案:solon-web 這個組合包。

本次版本重大變更:

1、增加程式碼親和度,降低學習成本;去掉各種類的X字首

  • 新的Helloworld效果
@Controller
public class App{
    public static void main(String[] args){
        Solon.start(App.class, args);
    }
  
    @Mapping("/")
    public Object home(Context c){
        return "Hello world!";  
    }
}

2、增加 BeanWrap 語義特性支援

  • 通過語義特性,為Bean增加元資訊描述
//
// 這是一個資料主從庫的示例
//
@Configuration
public class Config {
    //申明 db2 是 db1 為的從庫
    @Bean(value = "db1", attrs = { "slaves=db2" })
    public DataSource db1(@Inject("${test.db1}") HikariDataSource dataSource) {
        return dataSource;
    }

    @Bean("db2")
    public DataSource db2(@Inject("${test.db2}") HikariDataSource dataSource) {
        return dataSource;
    }
}

3、釋出新元件:SockeD,為服務開發而生的Socket框架。

  • 支援MVC+RPC開發模式
//[服務端]
@Mapping(value = "/demoe/rpc", method = MethodType.SOCKET)
@Component(remoting = true)
public class HelloRpcServiceImpl implements HelloRpcService {
    public String hello(String name) {
        return "name=" + name;
    }
}

//[客戶端] 
var rpc = SocketD.create("tcp://localhost:28080", HelloRpcService.class);
System.out.println("RPC result: " + rpc.hello("noear"));
  • 支援單連結雙向RPC開發模式(基於上例擴充套件)
//[服務端]
@Mapping(value = "/demoe/rpc", method = MethodType.SOCKET)
@Component(remoting = true)
public class HelloRpcServiceImpl implements HelloRpcService {
    public String hello(String name) {
        //
        //[服務端] 呼叫 [客戶端] 的 rpc,從而形成單連結雙向RPC
        //
        NameRpcService rpc = SocketD.create(Context.current(), NameRpcService.class);
        name = rpc.name(name);
        
        
        return "name=" + name;
    }
}
  • 支援訊息傳送+監聽開發模式
//[服務端]
@ServerEndpoint
public class ServerListener implements Listener {
    @Override
    public void onMessage(Session session, Message message) {
        if(message.flag() == MessageFlag.heartbeat){
            System.out.println("服務端:我收到心跳");
        }else {
            System.out.println("服務端:我收到:" + message);
            //session.send(Message.wrapResponse(message, "我收到了"));
        }
    }
}

//[客戶端]
var session = SocketD.createSession("tcp://localhost:28080");
session.send("noear");
//session.sendAndCallback("noear", (rst)->{});   //傳送並異常回撥
//var rst = session.sendAndResponse("noear");   //傳送並等待響應

System.out.println(rst);
  • 支援訊息訂閱開發模式
//[客戶端]
@ClientEndpoint(uri = "tcp://localhost:28080")
public class ClientListener implements Listener {
    @Override
    public void onMessage(Session session, Message message) {
        //之後,就等著收訊息
        System.out.println("客戶端2:我收到了:" + message);
    }
}

附:Solon專案地址

相關文章