sumk移動(dòng)互聯(lián)網(wǎng)架構(gòu)神器
sumk是一款輕量級(jí)的互聯(lián)網(wǎng)框架。擁有開(kāi)發(fā)速度快、性能好、易于橫向擴(kuò)展等特點(diǎn)。并且集成了一些互聯(lián)網(wǎng)中常見(jiàn)功能,sumk入門(mén)文檔點(diǎn)這里
主要功能特點(diǎn)簡(jiǎn)單介紹如下:
-
配置管理:sumk默認(rèn)的配置是app.properties,同時(shí)內(nèi)置了http、zookeeper兩種統(tǒng)一配置中心。所有這些配置,都支持熱變更,而不需要重啟應(yīng)用。并且提供了配置變更的通知機(jī)制。大多數(shù)配置都能兼容半角和全角符號(hào)。
-
微服務(wù):服務(wù)注冊(cè)、自動(dòng)發(fā)現(xiàn)、故障轉(zhuǎn)移、負(fù)載均衡等常見(jiàn)功能這里也都提供,并且使用更簡(jiǎn)單。服務(wù)器端只要在方法上添加@Soa注解,就能被其它實(shí)例調(diào)用,并且它還能在調(diào)用鏈上自動(dòng)傳遞userId參數(shù)。客戶端提供了同步、異步兩種調(diào)用方式。
-
Web服務(wù):主要針對(duì)移動(dòng)端訪問(wèn)(PC端也可以使用),也可以用作微服務(wù)的網(wǎng)關(guān)。只要在方法上添加@Web注解就可以被html訪問(wèn),比spring mvc更方便(spring mvc還需要在參數(shù)上添加注解)。本模塊可以不使用tomcat,因?yàn)閟umk內(nèi)置了jetty服務(wù)器。還內(nèi)置了通信加密,參數(shù)的簽名驗(yàn)證等功能,可以在http模式下享受https的安全性
-
IOC:類似于spring的IOC功能,但擁有自己的特色。比如支持?jǐn)?shù)組、集合方式的注入
-
ORM:類似于Hibernate的ORM,支持分表。它的特點(diǎn)是可以結(jié)合redis做準(zhǔn)實(shí)時(shí)緩存,它跟hibernate二級(jí)緩存的顯著區(qū)別就在于準(zhǔn)實(shí)時(shí)。開(kāi)發(fā)人員在操作數(shù)據(jù)庫(kù)的時(shí)候,默認(rèn)情況下,他并不關(guān)心數(shù)據(jù)來(lái)自緩存還是數(shù)據(jù)庫(kù)。整個(gè)sumk框架,只有ORM功能有使用門(mén)檻。點(diǎn)這里看它的幫助文檔。
-
事務(wù):支持讀寫(xiě)分離、權(quán)重、多數(shù)據(jù)源
-
數(shù)據(jù)庫(kù)事件監(jiān)聽(tīng):通過(guò)ORM修改數(shù)據(jù)表的內(nèi)容,在事務(wù)提交后,可以獲取到它的通知。代碼示例在這里
-
mybatis支持:sumk有自己的sql執(zhí)行工具:RawUtil和NamedUtil。它們可以執(zhí)行sql文件中的sql,但不支持if等標(biāo)簽。如果需要更靈活的操作,請(qǐng)使用mybatis。sumk提供了對(duì)mybatis的內(nèi)置支持。
-
redis封裝:封裝了redis的連接獲取與關(guān)閉、失敗重試、多數(shù)據(jù)源路由等。
-
分布式session:只要在redis.properties里配置了session的地址,就實(shí)現(xiàn)了分布式session。否則就是單機(jī)運(yùn)行。切換就是這么簡(jiǎn)單
-
異常體系:異常處理很考驗(yàn)開(kāi)發(fā)者的基本功。許多應(yīng)用的異常體系都是一團(tuán)糟。sumk可以讓開(kāi)發(fā)者從異常中解脫出來(lái),開(kāi)發(fā)人員不需要去catch異常,也不需要做太多的校驗(yàn),比如空指針之類。
-
線程管理:sumk將應(yīng)用的線程管理起來(lái),使得系統(tǒng)的線程不至于暴漲,讓線程可以更有效的被利用,并提供工具方法,使得開(kāi)發(fā)人員可以很方便的執(zhí)行異步任務(wù)。此外還提供了限流功能,當(dāng)線程緊張的時(shí)候,低優(yōu)先級(jí)的任務(wù)會(huì)被直接拒絕。
-
分布式鎖:因?yàn)樵S多應(yīng)用是分布式部署的,需要用到分布式鎖。sumk內(nèi)置了一套分布式鎖,只要有redis就可以運(yùn)行,不需要開(kāi)發(fā)任何額外的代碼。它的原理是基于redis的lua腳本。
-
日志體系:在高并發(fā)應(yīng)用中,接口調(diào)用量很高,很難定位日志是哪個(gè)請(qǐng)求打印的。sumk將會(huì)記錄日志所屬的用戶或訪問(wèn),便于日志跟蹤。并且會(huì)提供統(tǒng)一日志擴(kuò)展,不需要額外使用logstash等日志工具。具體參見(jiàn)這里
-
測(cè)試框架:數(shù)據(jù)庫(kù)和微服務(wù)的單元測(cè)試一向是痛點(diǎn)。sumk提供了測(cè)試接口,在測(cè)試模式下,所有的數(shù)據(jù)庫(kù)操作都會(huì)被回滾。它發(fā)起的微服務(wù)調(diào)用,如果被調(diào)用方允許被測(cè)試,它所做的數(shù)據(jù)庫(kù)修改也會(huì)被還原。ORM的redis緩存也會(huì)被清理,但是手工修改的redis無(wú)法被清理。
-
其它功能:sumk還提供了web的第三方應(yīng)用登陸、web的多端互踢、攔截器等功能。它的功能遠(yuǎn)不止上述那些。它是一個(gè)百寶箱,如果你掌握了,開(kāi)發(fā)速度將會(huì)大大提升
-
使用方式:通過(guò)maven引入sumk-log、sumk.jar及其依賴包(最新版慘叫maven中央庫(kù))。可以通過(guò)sumk-log引入,也可以直接引入sumk.jar,sumk-log是可選的。
<dependency> <groupId>com.github.youtongluan</groupId> <artifactId>sumk-log</artifactId> <version>2.2.1</version> </dependency>
sumk的四大模塊為:數(shù)據(jù)庫(kù)操作、微服務(wù)、web請(qǐng)求、IOC。除了sumk-db,其它使用很簡(jiǎn)單。
數(shù)據(jù)庫(kù)操作方面,sumk提供了sumk-db、RawDB(RawDBUtil)、NamedDB(NamedDBUtil)和Mybatis4種方式,以下是代碼示例:
@Box //@Box表示啟用sumkDB的事務(wù)管理,類似于spring的@Transaction
public void test() {
//sumk-db類似于hibernate,以下是示例
DemoUser user = new DemoUser();
user.setAge(30);
user.setName("張三");
user.setLastUpdate(new Date());
DB.insert(user).execute(); //插入對(duì)象
//多條件查詢,sumk不好入門(mén)的也就只有這個(gè)。這個(gè)功能是可選的,不用也沒(méi)關(guān)系
List list=DB.select().tableClass(DemoUser.class)
.lessThan("lastupdate", new Date())
.orderByAsc("lastupdate")
.offset(10)
.limit(10)
.queryList();
//sumk-db例子結(jié)束
// RawDB使用的是原生的sql,后面跟的是要注入的參數(shù)。參數(shù)個(gè)數(shù)與sql中的?的個(gè)數(shù)一致
RawDB.list("select * from demouser where name=? and age=?", "登陸",12);
//NamedDB類似于mybatis,目前只支持#{}方式,不支持等標(biāo)簽。
NamedDB.count("select count(1) from demouser where name=#{name}", SBuilder.map("name", "登陸").toMap());
}
微服務(wù)(sumk-soa)代碼示例:
/////////////////////////////////////服務(wù)器端:
@Soa
public List echo(String echo,List names){
............
return list;
}
//////////////////////// 客戶端調(diào)用
List names=Arrays.asList("游夏","游俠");
String echo=",how are you";
String result=Rpc.call("groupId.appId.echo", echo,names); //返回是json格式的List對(duì)象
sumk-http代碼示例:
@Web
public List echo(String echo,List names){
List list=new ArrayList();
for(String name:names){
list.add(echo+" "+name);
}
return list;
}
//客戶端就是一般的http請(qǐng)求
//請(qǐng)求路徑是http://localhost/intf/rest/echo
//請(qǐng)求實(shí)體是data={"echo":"hi","name":["張三","李四"]}
sumk項(xiàng)目的搭建非常簡(jiǎn)單,只要app.properties、sumk.jar及其它依賴包,您就自動(dòng)擁有了架構(gòu)圖中的那些功能。啟動(dòng)方式是調(diào)用SumkServer.start()。需要jdk1.8。搭建示例參見(jiàn)文檔
使用入門(mén):
只需要引入sumk包,并添加配置文件app.properties,你就能運(yùn)行sumk應(yīng)用了。具體步驟參見(jiàn)sumk框架入門(mén).docx。
接口壓測(cè):
運(yùn)行org.test.Main,在這個(gè)類的相同目錄下,有HttpPressTest和RpcPressTest兩個(gè)文件,分別是http和微服務(wù)的壓測(cè)用例。2個(gè)用例的壓測(cè)結(jié)果大概都在2萬(wàn)次每秒(根據(jù)機(jī)器環(huán)境的不同而不同)。
聯(lián)系方式:
QQ:3205207767
