這個開源組織里的項目都是精品
前言
在開源中國里,不知道大家有沒有留意到一個Java開源組織——Dromara?
這個組織是由Apache ShenYu(前身是Soul網關)的作者創立,多位Java開源作者參與的一個Java開源組織。
在開源中國社區,很多Java開源作者都是各自為戰,獨立運營項目。Domara組織的誕生就是為了聯合Java開源的力量,共建社區,資源共享,共同推行中國Java開源事業的發展。
目前Dromara社區擁有9個GVP項目,和一些Star數量很高的項目。這些開源項目社區都很活躍,每一個都是能提高工作效率的精品開源作品。下面就來盤點下Dromara組織其中的4個開源項目。都是非常實用的工具,用好這些將會讓你的生產效率大大提升!
Sa-Token
首先我要介紹的是Sa-Token,可能是史上功能最全的輕量級 Java 許可權認證框架。
簡單的使用方式,豐富的特性,強大的功能,你有什麼理由拒絕?
官方網站://sa-token.dev33.cn/
Gitee託管倉庫://gitee.com/dromara/sa-token
Github託管倉庫://github.com/dromara/Sa-Token
Sa-Token 是一個輕量級 Java 許可權認證框架,主要解決:登錄認證
、許可權認證
、Session會話
、單點登錄
、OAuth2.0
、微服務網關鑒權
等一系列許可權相關問題。
Sa-Token 的 API 設計非常簡單,有多簡單呢?以登錄認證為例,你只需要:
// 在登錄時寫入當前會話的帳號id
StpUtil.login(10001);
// 然後在需要校驗登錄處調用以下方法:
// 如果當前會話未登錄,這句程式碼會拋出 `NotLoginException` 異常
StpUtil.checkLogin();
至此,我們已經藉助 Sa-Token 完成登錄認證!
此時的你小腦袋可能飄滿了問號,就這麼簡單?自定義 Realm 呢?全局過濾器呢?我不用寫各種配置文件嗎?
沒錯,在 Sa-Token 中,登錄認證就是如此簡單,不需要任何的複雜前置工作,只需這一行簡單的API調用,就可以完成會話登錄認證!
當你受夠 Shiro、SpringSecurity 等框架的三拜九叩之後,你就會明白,相對於這些傳統老牌框架,Sa-Token 的 API 設計是多麼的簡單、優雅!
許可權認證示例(只有具備 user:add
許可權的會話才可以進入請求)
@SaCheckPermission("user:add")
@RequestMapping("/user/insert")
public String insert(SysUser user) {
// ...
return "用戶增加";
}
將某個帳號踢下線(待到對方再次訪問系統時會拋出NotLoginException
異常)
// 使帳號id為 10001 的會話強制註銷登錄
StpUtil.logoutByLoginId(10001);
在 Sa-Token 中,絕大多數功能都可以 一行程式碼 完成:
StpUtil.login(10001); // 標記當前會話登錄的帳號id
StpUtil.getLoginId(); // 獲取當前會話登錄的帳號id
StpUtil.isLogin(); // 獲取當前會話是否已經登錄, 返回true或false
StpUtil.logout(); // 當前會話註銷登錄
StpUtil.logoutByLoginId(10001); // 讓帳號為10001的會話註銷登錄(踢人下線)
StpUtil.hasRole("super-admin"); // 查詢當前帳號是否含有指定角色標識, 返回true或false
StpUtil.hasPermission("user:add"); // 查詢當前帳號是否含有指定許可權, 返回true或false
StpUtil.getSession(); // 獲取當前帳號id的Session
StpUtil.getSessionByLoginId(10001); // 獲取帳號id為10001的Session
StpUtil.getTokenValueByLoginId(10001); // 獲取帳號id為10001的token令牌值
StpUtil.login(10001, "PC"); // 指定設備標識登錄,常用於「同端互斥登錄」
StpUtil.logoutByLoginId(10001, "PC"); // 指定設備標識進行強制註銷 (不同端不受影響)
StpUtil.openSafe(120); // 在當前會話開啟二級認證,有效期為120秒
StpUtil.checkSafe(); // 校驗當前會話是否處於二級認證有效期內,校驗失敗會拋出異常
StpUtil.switchTo(10044); // 將當前會話身份臨時切換為其它帳號
即使不運行測試,相信您也能意會到絕大多數 API 的用法。
想要了解更多請參考://gitee.com/dromara/sa-token
Forest
一款極大程度解放你的Http接入工作的強大Http客戶端框架。
Http協議很複雜嗎?那是因為你還沒有使用過Forest,雖然業內有很多其他優秀的Http客戶端,但是你錯過了Forest,將會錯過一大片優雅美麗的森林。
官方網站://forest.dtflyx.com
Gitee託管倉庫://gitee.com/dromara/forest
Github託管倉庫://github.com/dromara/forest
Forest 是一個開源的 Java HTTP 客戶端框架,用來訪問第三方服務 RESTful 介面。
它能夠將 HTTP 的請求參數綁定到 Java 介面上,之後調用 Java 介面就等於在發送 HTTP 請求。一切面向於介面。
很多公司需要在 Java 後台調用許多第三方 HTTP 介面,比如微信支付、友盟等等第三方平台。
公司內部還有很多服務是用世界最好語言寫的,介面自然也只能通過 HTTP 介面來調用。於是日積月累下來,在 Java 程式碼中就有許許多多各式各樣的 HTTP 調用介面,而且調用方式也不統一,有 HttpClient 寫的、有 OkHttp 寫的、有自己包裝的,光公司內部不同人包裝的 HTTP 工具類就有兩三種。
而且 url 基本寫死在程式碼中,很難維護,不同介面又有不同的參數傳輸方式,有 GET 、有 POST,有 JSON 傳輸的、有 XML 傳輸的。 當有一個介面需要修改,完了,光找到程式碼在什麼地方就要花半天時間。
而 Forest 能幫助我很好地將 HTTP 程式碼和業務程式碼解耦開來,請求調用者不必關心 HTTP 相關的細節。
自動拼接 HTTP 的各種參數
包括 URL、Header、Body 等等參數都能依靠 Java 註解來聲明。
這裡就舉一個高德地圖的栗子,來看看 Forest 是如何優雅的聲明 HTTP 請求介面的:
/**
* 高德地圖服務客戶端介面
*/
@BaseRequest(baseURL = "//ditu.amap.com")
public interface Amap {
/**
* 根據經緯度獲取詳細地址
* @param longitude 經度
* @param latitude 緯度
* @return 詳細地址資訊
*/
@Get("/service/regeo")
Map getLocation(@Query("longitude") String longitude, @Query("latitude") String latitude);
}
... ...
Amap amp = Forest.client(Amap.class);
// 發送請求查詢經緯度
Map locationInfo = amp.getLocation("32.1242832", "56.3290434");
自動 JSON 和 XML 轉換
其實,我們處理 HTTP 的工作時,除了浪費在組裝各種請求參數外,大部分時間都花了在序列化和反序列化各種格式的數據上,如 JSON 和 XML。
以前用 HttpClient,這些重複的機械性工作都要自己來搞,很是麻煩。
用 Forest 就方便多了,比如要 POST 一個 JSON 對象,直接掛個 @JSONBody 就好了,就是這麼清爽。
// 直接將 MyUserInfo 轉換成 JSON
// 將服務端響應返回的 JSON 數據轉換成 Result<Boolean> 類對象
@Post("//localhost:8080/user")
Result<Booelean> createUser(@JSONBody MyUserInfo user);
和 Retrofit 以及 Feign 的比較
之前也用過這兩塊開源框架,都很強大,但各有優缺點。
Retrofit 的主要的問題時和 OkHttp 綁的太死,有些功能被 OkHttp 限制住了,比如我想處理 Get 請求傳輸 Body 數據這種非標準的 HTTP 請求就很難辦到,而 Forest 可以隨意切換 OkHttp 和 HttpClient 作為後端,需要用哪個時用哪個。
Retrofit 註解的豐富性也不如 Forest,比如要實現 HTTP 網路代理就要自己去寫程式碼,而 Forest 提供了 @HTTPProxy 註解,設置一下就完事了。
如果要擴展自定義註解都是基於 OkHttp 的攔截器,不是特別方便,而 Forest 攔截器要比 OkHttp 的方便很多,提供 onInvoke, beforeExecute, onSccuess, onError 等回調方法,等於把一個請求的生老病死都涵蓋了。
而 Feign 的問題則是和 Spring 綁的太緊,很多功能需要依賴 Spring 去做,太加了 Spring 相關包又太重了。
Forest 的核心包基本涵蓋了所有 HTTP 所需功能和註解,不依賴 Spring,要輕量許多,但又不失方便性。
想要了解更多請參考://gitee.com/dromara/forest
LiteFlow
一款超輕量,快速,穩定,可編排的組件式流程引擎/規則引擎。
解耦複雜系統的神器!如果你正在為設計一個複雜系統感到頭痛,那麼LiteFlow是是你不二的選擇,超低的學習成本,強大的編排功能,讓你的系統變得更優雅!
Gitee託管倉庫://gitee.com/dromara/liteFlow
Github託管倉庫://github.com/dromara/liteflow
Liteflow為解耦複雜邏輯而生,如果你要對複雜業務邏輯進行新寫或者重構,用liteflow最合適不過。它是一個輕量,快速的組件式流程引擎框架,組件編排,幫助解耦業務程式碼,讓每一個業務片段都是一個組件。
使用Liteflow,你需要去把複雜的業務邏輯按程式碼片段拆分成一個個小組件,並定義一個規則流程配置。這樣,所有的組件,就能按照你的規則配置去進行複雜的流轉。同時Liteflow支援規則文件的熱載入,即時完成修改生效。並提供多種持久化規則的方式的擴展。
使用LiteFLow,三大核心概念是組件,規則和上下文。
你需要這麼像這樣去定義你的組件
//這裡普通組件
@LiteflowComponent(id = "a", name = "組件A描述")
public class ACmp extends NodeComponent {
@Override
public void process() {
//do your business
}
}
//這是條件組件
@LiteflowComponent(id = "b", name = "組件B描述")
public class BCondCmp extends NodeCondComponent {
@Override
public String processCond() {
//do your business
return "e";
}
}
然後去定義你的規則,LiteFlow支援xml,yml,json三種格式,這裡以xml形式為例
<?xml version="1.0" encoding="UTF-8"?>
<flow>
<chain name="chain1">
<then value="a,b(c|d|e)"/> <!-- c為路由組件,用來路由到c,d,e -->
<then value="sub_chain"/> <!-- 子流程 -->
</chain>
<chain name="sub_chain">
<when value="f,g,h"/> <!-- when代表並行 -->
<then value="j,k" /> <!-- then代表串列 -->
</chain>
</flow>
這樣你的系統就會按照規則文件定義的方式,去執行你的業務組件。是不是很簡單。
那規則文件定義在哪呢,LiteFlow並不限定你的規則文件來源,可以是本地文件,可以是註冊中心,可以是任何資料庫。LiteFlow提供了非常自由的介面供你擴展,你想存儲在哪裡都行。改變規則文件,即可實時刷新你的規則流程!如果你想做一個靈活度高,伸縮性強的系統,LiteFlow是不是非常適合呢。
LiteFlow為每一個請求都去開闢申請了一個Slot,你可以理解為上下文,所有的組件共享這個Slot。你可以在任意組件里通過對Slot的訪問來獲得任意數據,也可以存放任意數據。你也可以擴展Slot,自定義這個slot的屬性。
@LiteflowComponent(id = "a", name = "組件A描述")
public class ACmp extends NodeComponent {
@Override
public void process() {
Slot slot = this.getSlot();
//通過對slot的getData,setData,或者存取你自己擴展的slot屬性
}
}
正因為有Slot的存在,才抹平了組件與組件之間的差異性,使得每一個業務組件之間無強依賴。這樣的設計,就可以讓你的系統高度自由化,組件復用,組件調換順序得以方便的實現!
LiteFlow還支援2種腳本語言的接入,目前支援Groovy和QLExpress兩種腳本語言。你可以在xml/yml/json定義腳本,以下以xml為例:
<?xml version="1.0" encoding="UTF-8"?>
<flow>
<nodes>
<node id="s1" name="普通腳本" type="script">
<![CDATA[
def a=3;
def b=2;
slot.setData("s1",a*b);
]]>
</node>
<node id="s2" name="條件腳本" type="cond_script">
<![CDATA[
count = slot.getData("count");
if(count > 100){
return "a";
}else{
return "b";
}
]]>
</node>
</nodes>
<chain name="chain1">
<then value="a,b,c,s1"/>
</chain>
<chain name="chain2">
<then value="d,s2(a|b)"/>
</chain>
</flow>
那麼在什麼地方定義是哪種語言的腳本呢,LiteFlow的腳本功能是一個SPI機制的實現,你依賴了哪個腳本包,就以哪種腳本的方式執行。
有了腳本語言的支援,連業務程式碼是不是都可以熱部署了?香不香?
LiteFlow的功能遠不止這些,想了解更多,請到官網文檔去查看了解。相信LiteFlow會讓你感到優雅和驚艷。
想要了解更多請參考://yomahub.com/liteflow
JPom
一款簡而輕的低侵入式在線構建、自動部署、日常運維、項目監控軟體
中小公司團隊DevOps的福音!輕量且強大,你不試試?
官方網站://jpom.io/
Gitee託管倉庫://gitee.com/dromara/Jpom
Github託管倉庫://github.com/dromara/Jpom
Jpom 是一款簡而輕的低侵入式在線構建、自動部署、日常運維、項目監控軟體
在中小公司或者團隊
中傳統項目部署、運維流程通用的方法是登錄伺服器上傳新的項目包,執行相應命令管理,如果管理多個項目則重複操作上述步驟。
市面上有很許多 DevOps 軟體但是這些軟體基本都會是難上手,重依賴。Jpom 則是針對中小公司或者團隊
設計的一款低侵入
,輕依賴
的一款輕量級
的 DevOps 軟體。
項目主要功能及特點
- 創建、修改、刪除項目、Jar包管理
- 實時查看控制台日誌、備份日誌、刪除日誌、導出日誌
- 在線構建項目發布項目一鍵搞定
- 多節點管理、多節點自動分發
- 在線 SSH 終端,並且有終端日誌和禁用命令
- 實時監控項目狀態異常自動報警
- cpu、ram 監控、導出堆棧資訊、查看項目進程埠、伺服器狀態監控
- 多用戶管理,用戶項目許可權獨立(上傳、刪除許可權可控制),完善的操作日誌
- 系統路徑白名單模式,杜絕用戶誤作業系統文件
- 在線管理 Nginx 配置文件、ssl 證書文件
一鍵安裝(Linux)(推薦)
插件端
如果服務端也需要被管理,在服務端上也需要安裝插件端
安裝的路徑位於執行命令目錄(數據、日誌存放目錄默認位於安裝路徑,如需要修改參考配置文件:
extConfig.yml
)
yum install -y wget && wget -O install.sh //dromara.gitee.io/jpom/docs/install.sh && bash install.sh Agent
備用地址
yum install -y wget && wget -O install.sh //cdn.jsdelivr.net/gh/dromara/Jpom/docs/install.sh && bash install.sh Agent
支援自動安裝jdk環境
yum install -y wget && wget -O install.sh //dromara.gitee.io/jpom/docs/install.sh && bash install.sh Agent jdk
啟動成功後,插件端的埠為 2123
服務端
安裝的路徑位於執行命令目錄(數據、日誌存放目錄默認位於安裝路徑,如需要修改參考配置文件:
extConfig.yml
)如果需要修改數據、日誌存儲路徑請參照
extConfig.yml
文件中jpom.path
配置屬性
yum install -y wget && wget -O install.sh //dromara.gitee.io/jpom/docs/install.sh && bash install.sh Server
備用地址
yum install -y wget && wget -O install.sh //cdn.jsdelivr.net/gh/dromara/Jpom/docs/install.sh && bash install.sh Server
支援自動安裝jdk環境
yum install -y wget && wget -O install.sh //dromara.gitee.io/jpom/docs/install.sh && bash install.sh Server jdk
支援自動安裝jdk和maven環境
yum install -y wget && wget -O install.sh //dromara.gitee.io/jpom/docs/install.sh && bash install.sh Server jdk+mvn
啟動成功後,服務端的埠為 2122
訪問管理頁面 例如//localhost:2122/
特別提醒:一鍵安裝的時候注意執行命令不可在同一目錄下,即Server端和Agent端不可安裝在同一目錄下
如無法訪問,檢查下是否開啟了防火牆
systemctl status firewalld
,如狀態顯示為綠色Active: active (running)
可臨時關閉防火牆systemctl stop firewalld
,然後重啟防火牆firewall-cmd --reload
(建議僅測試環境下使用,生產環境下慎用)
如關閉防火牆後仍無法訪問,並且使用的是雲伺服器,還需要到雲伺服器管理後台中關閉防火牆
想要了解更多請參考://gitee.com/dromara/Jpom
最後
以上推薦的開源項目,僅僅是Dromara Java社區里其中4個,Dromara社區還有很多更為優秀的開源項目。每一個項目都凝結著每個作者日日夜夜的心血和付出,他們用開放的心態去擁抱這個世界,用技術的力量為中國的開源事業添磚加瓦。
我們努力發著光,為了照亮別人,也為了明亮自我。
同時也希望有更多的Java開源作者能加入Dromara社區,凝聚吾輩之力,匯聚諸君之績,披荊斬棘,同舟共濟。
最後,看到這的童鞋,點贊,分享,在看點起來啊!