前言
在開源中國裡,不知道大家有沒有留意到一個Java開源組織——Dromara?
這個組織是由Apache ShenYu(前身是Soul閘道器)的作者創立,多位Java開源作者參與的一個Java開源組織。
在開源中國社群,很多Java開源作者都是各自為戰,獨立運營專案。Domara組織的誕生就是為了聯合Java開源的力量,共建社群,資源共享,共同推行中國Java開源事業的發展。
目前Dromara社群擁有9個GVP專案,和一些Star數量很高的專案。這些開源專案社群都很活躍,每一個都是能提高工作效率的精品開源作品。下面就來盤點下Dromara組織其中的4個開源專案。都是非常實用的工具,用好這些將會讓你的生產效率大大提升!
Sa-Token
首先我要介紹的是Sa-Token,可能是史上功能最全的輕量級 Java 許可權認證框架。
簡單的使用方式,豐富的特性,強大的功能,你有什麼理由拒絕?
官方網站:http://sa-token.dev33.cn/
Gitee託管倉庫:https://gitee.com/dromara/sa-...
Github託管倉庫:https://github.com/dromara/Sa...
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 的用法。
想要了解更多請參考:https://gitee.com/dromara/sa-...
Forest
一款極大程度解放你的Http接入工作的強大Http客戶端框架。
Http協議很複雜嗎?那是因為你還沒有使用過Forest,雖然業內有很多其他優秀的Http客戶端,但是你錯過了Forest,將會錯過一大片優雅美麗的森林。
Gitee託管倉庫:https://gitee.com/dromara/forest
Github託管倉庫:https://github.com/dromara/fo...
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 = "http://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("http://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,要輕量許多,但又不失方便性。
想要了解更多請參考:https://gitee.com/dromara/forest
LiteFlow
一款超輕量,快速,穩定,可編排的元件式流程引擎/規則引擎。
解耦複雜系統的神器!如果你正在為設計一個複雜系統感到頭痛,那麼LiteFlow是是你不二的選擇,超低的學習成本,強大的編排功能,讓你的系統變得更優雅!
官方網站:https://yomahub.com/liteflow
Gitee託管倉庫:https://gitee.com/dromara/lit...
Github託管倉庫:https://github.com/dromara/li...
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會讓你感到優雅和驚豔。
想要了解更多請參考:https://yomahub.com/liteflow
JPom
一款簡而輕的低侵入式線上構建、自動部署、日常運維、專案監控軟體
中小公司團隊DevOps的福音!輕量且強大,你不試試?
官方網站:https://jpom.io/
Gitee託管倉庫:https://gitee.com/dromara/Jpom
Github託管倉庫:https://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 https://dromara.gitee.io/jpom/docs/install.sh && bash install.sh Agent
備用地址
yum install -y wget && wget -O install.sh https://cdn.jsdelivr.net/gh/dromara/Jpom/docs/install.sh && bash install.sh Agent
支援自動安裝jdk環境
yum install -y wget && wget -O install.sh https://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 https://dromara.gitee.io/jpom/docs/install.sh && bash install.sh Server
備用地址
yum install -y wget && wget -O install.sh https://cdn.jsdelivr.net/gh/dromara/Jpom/docs/install.sh && bash install.sh Server
支援自動安裝jdk環境
yum install -y wget && wget -O install.sh https://dromara.gitee.io/jpom/docs/install.sh && bash install.sh Server jdk
支援自動安裝jdk和maven環境
yum install -y wget && wget -O install.sh https://dromara.gitee.io/jpom/docs/install.sh && bash install.sh Server jdk+mvn
啟動成功後,服務端的埠為 2122
訪問管理頁面 例如http://localhost:2122/
特別提醒:一鍵安裝的時候注意執行命令不可在同一目錄下,即Server端和Agent端不可安裝在同一目錄下
如無法訪問,檢查下是否開啟了防火牆
systemctl status firewalld
,如狀態顯示為綠色Active: active (running)
可臨時關閉防火牆systemctl stop firewalld
,然後重啟防火牆firewall-cmd --reload
(建議僅測試環境下使用,生產環境下慎用)
如關閉防火牆後仍無法訪問,並且使用的是雲伺服器,還需要到雲伺服器管理後臺中關閉防火牆
想要了解更多請參考:https://gitee.com/dromara/Jpom
最後
以上推薦的開源專案,僅僅是Dromara Java社群裡其中4個,Dromara社群還有很多更為優秀的開源專案。每一個專案都凝結著每個作者日日夜夜的心血和付出,他們用開放的心態去擁抱這個世界,用技術的力量為中國的開源事業添磚加瓦。
我們努力發著光,為了照亮別人,也為了明亮自我。
同時也希望有更多的Java開源作者能加入Dromara社群,凝聚吾輩之力,匯聚諸君之績,披荊斬棘,同舟共濟。
最後,看到這的童鞋,點贊,分享,在看點起來啊!