Solon 是一個微型的Java開發框架。項目從2018年啟動以來,參考過大量前人作品;歷時兩年,4000多次的commit;內核保持0.1m的身材,超高的跑分,良好的使用體驗。支持:RPC、REST API、MVC、WebSocket、Socket 等多種開發模式。
Solon 強調:克制 + 簡潔 + 開放的原則;力求:更小、更快、更自由的體驗。
替代?那有什么差別!
Solon 特性簡集,相較於 Springboot 有什么區別?
所謂更小:
內核0.1m,最小開發單位0.2m(相比Dubbo、Springboot項目包,小到可以乎略不計)
所謂更快:
本機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);
本次版本重大變更:
1、增加過濾器(Filter),之前由觸發器替代
所謂觸發器,例:
//::在"/demo/"處理之前觸發
app.before("/demo/", c-> System.out.println("我是請求之前觸發的..."+ctx.path()) );
//::在"/demo/"處理之后觸發
app.after("/demo/", c-> System.out.println("我是請求之后觸發的..."+ctx.path()) );
“觸發器”聽起來像是數據庫的東西,在Solon里的特性與數據庫的觸發特性確實也沒什么區別。。。算是借用了。
Solon 之前的設計中僅有觸發器和攔截器兩種概念,也覺很夠用。但某些場景下,過濾器會更合適。相對於觸發器,過濾器的好處是把后續的處理完整的包圍起來,擁有更強的控制性(比如,融斷或並發限制)。
來看下Solon的過濾器,注解模式:
//通過注解,申明一個過濾器
@Component
public class FilterDemo implements Filter {
@Override
public void doFilter(Context ctx, FilterChain chain) throws Throwable {
System.out.println("我是好人過濾器!!!path="+ctx.path());
chain.doFilter(ctx);
}
}
純手寫模式
//通過手動為應用添加一個過濾器
app.filter((ctx, chain)->{
System.out.println("我是過濾器!!!path="+ctx.path());
chain.doFilter(ctx);
});
//Solon.global() 即為全局app對象...
用法上,與Servlet的過濾器幾首一樣。。。(注:Solon 不是 Servlet 框架。它可以適配各種不同的Http容器)
2、強化自帶網關的通用性、組裝性
同一份接口實現,不同的協議輸出:
簡單版輸出輸入:
@Mapping("/api/v1/**")
@Controller
public class ApiGateway1x extends ApiGatewayBase {
@Override
protected void register() {
before(new StartInterceptor()); //開始
after(new OutputBuildInterceptor()); //輸出構建
after(new OutputInterceptor()); //輸出
after(new LogInterceptor()); //日志
after(new EndInterceptor("v1")); //結束
//加載bean,做為接口
addBeans(bw -> "api".equals(bw.tag()));
}
}
復雜版輸入輸出:
@Mapping("/api/v3/**")
@Component
public class ApiGateway3x extends ApiGatewayBase {
@Override
protected void register() {
filter(new SentryFilter()); //添加融斷過濾器
before(new StartTrigger()); //開始
before(new ParamsParseTrigger()); //參數解析
before(new ParamsSignCheckTrigger(new Md5Encoder())); //參數簽名較驗,用MD5編碼簽名
before(new ParamsRebuildTrigger(new AesDecoder())); //參數重構
after(new OutputBuildTrigger(new AesEncoder())); //輸出構建,用AES編碼加載輸出內容
after(new OutputSignTrigger(new Md5Encoder())); //輸出簽名,用MD5編碼簽名
after(new OutputTrigger()); //輸出
after(new LogTrigger()); //日志
after(new EndTrigger("v3")); //結束
//加載bean,做為接口
addBeans(bw -> "api".equals(bw.tag()));
}
}