這 9 個 Java 開源項目 yyds
點擊下方“IT牧場”,選擇“設為星標”

在開源中國里,不知道大家有沒有留意到一個Java開源組織——Dromara?這個組織是由 Apache ShenYu(前身是Soul網(wǎng)關(guān))的作者創(chuàng)立,多位 Java 開源作者參與的一個Java開源組織。
1. Sa-Token
首先我要介紹的是 Sa-Token,可能是史上功能最全的輕量級 Java 權(quán)限認證框架。簡單的使用方式,豐富的特性,強大的功能,你有什么理由拒絕?
Sa-Token 是一個輕量級 Java 權(quán)限認證框架,主要解決:登錄認證、權(quán)限認證、Session會話、單點登錄、OAuth2.0、微服務網(wǎng)關(guān)鑒權(quán)等一系列權(quán)限相關(guān)問題。Sa-Token 的 API 設計非常簡單,有多簡單呢?以登錄認證為例,你只需要:
// 在登錄時寫入當前會話的賬號id
StpUtil.login(10001);
// 然后在需要校驗登錄處調(diào)用以下方法:
// 如果當前會話未登錄,這句代碼會拋出 `NotLoginException` 異常
StpUtil.checkLogin();沒錯,在 Sa-Token 中,登錄認證就是如此簡單,不需要任何的復雜前置工作,只需這一行簡單的API調(diào)用,就可以完成會話登錄認證!
當你受夠 Shiro、SpringSecurity 等框架的三拜九叩之后,你就會明白,相對于這些傳統(tǒng)老牌框架,Sa-Token 的 API 設計是多么的簡單、優(yōu)雅!
權(quán)限認證示例(只有具備?user:add?權(quán)限的會話才可以進入請求
@SaCheckPermission("user:add")
@RequestMapping("/user/insert")
public?String?insert(SysUser user) {
// ...
return?"用戶增加";
}// 使賬號id為 10001 的會話強制注銷登錄
StpUtil.logoutByLoginId(10001);
在 Sa-Token 中,絕大多數(shù)功能都可以?一行代碼?完成:
StpUtil.login(10001);?// 標記當前會話登錄的賬號id
StpUtil.getLoginId();?// 獲取當前會話登錄的賬號id
StpUtil.isLogin();?// 獲取當前會話是否已經(jīng)登錄, 返回true或false
StpUtil.logout();?// 當前會話注銷登錄
StpUtil.logoutByLoginId(10001);?// 讓賬號為10001的會話注銷登錄(踢人下線)
StpUtil.hasRole("super-admin");?// 查詢當前賬號是否含有指定角色標識, 返回true或false
StpUtil.hasPermission("user:add");?// 查詢當前賬號是否含有指定權(quán)限, 返回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();?// 校驗當前會話是否處于二級認證有效期內(nèi),校驗失敗會拋出異常
StpUtil.switchTo(10044);?// 將當前會話身份臨時切換為其它賬號即使不運行測試,相信您也能意會到絕大多數(shù) API 的用法。想要了解更多請參考:https://gitee.com/dromara/sa-token。
一款極大程度解放你的 HTTP 接入工作的強大 HTTP 客戶端框架。HTTP 協(xié)議很復雜嗎?那是因為你還沒有使用過 Forest,雖然業(yè)內(nèi)有很多其他優(yōu)秀的HTTP 客戶端,但是你錯過了 Forest,將會錯過一大片優(yōu)雅美麗的森林。

它能夠?qū)?HTTP 的請求參數(shù)綁定到 Java 接口上,之后調(diào)用 Java 接口就等于在發(fā)送 HTTP 請求。一切面向于接口。
很多公司需要在 Java 后臺調(diào)用許多第三方 HTTP 接口,比如微信支付、友盟等等第三方平臺。
公司內(nèi)部還有很多服務是用世界最好語言寫的,接口自然也只能通過 HTTP 接口來調(diào)用。于是日積月累下來,在 Java 代碼中就有許許多多各式各樣的 HTTP 調(diào)用接口,而且調(diào)用方式也不統(tǒng)一,有 HttpClient 寫的、有 OkHttp 寫的、有自己包裝的,光公司內(nèi)部不同人包裝的 HTTP 工具類就有兩三種。
而且 url 基本寫死在代碼中,很難維護,不同接口又有不同的參數(shù)傳輸方式,有 GET 、有 POST,有 JSON 傳輸?shù)摹⒂?XML 傳輸?shù)摹.斢幸粋€接口需要修改,完了,光找到代碼在什么地方就要花半天時間。
/**
?* 高德地圖服務客戶端接口
?*/
@BaseRequest(baseURL =?"http://ditu.amap.com")
public?interface?Amap {
/**
?????* 根據(jù)經(jīng)緯度獲取詳細地址
?????* @param longitude 經(jīng)度
?????* @param latitude 緯度
?????* @return 詳細地址信息
?????*/
@Get("/service/regeo")
????Map getLocation(@Query("longitude")?String?longitude,?@Query("latitude")?String?latitude);
}
......
Amap amap = Forest.client(Amap.class);
// 發(fā)送請求查詢經(jīng)緯度
Map locationInfo = amap.getLocation("32.1242832",?"56.3290434");其實,我們處理 HTTP 的工作時,除了浪費在組裝各種請求參數(shù)外,大部分時間都花了在序列化和反序列化各種格式的數(shù)據(jù)上,如 JSON 和 XML。
以前用 HttpClient,這些重復的機械性工作都要自己來搞,很是麻煩。
// 直接將 MyUserInfo 轉(zhuǎn)換成 JSON
// 將服務端響應返回的 JSON 數(shù)據(jù)轉(zhuǎn)換成 Result 類對象
@Post("http://localhost:8080/user")
Result createUser(@JSONBody?MyUserInfo user); 之前也用過這兩款開源框架,都很強大,但各有優(yōu)缺點。
Retrofit 的主要的問題時和 OkHttp 綁的太死,有些功能被 OkHttp 限制住了,比如我想處理 Get 請求傳輸 Body 數(shù)據(jù)這種非標準的 HTTP 請求就很難辦到,而 Forest 可以隨意切換 OkHttp 和 HttpClient 作為后端,需要用哪個時用哪個。
3. 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";
????}
}xml version="1.0"?encoding="UTF-8"?>
<flow>
<chain?name="chain1">
<then?value="a,b(c|d|e)"/>?
<then?value="sub_chain"/>?
chain>
<chain?name="sub_chain">
<when?value="f,g,h"/>?
<then?value="j,k"?/>?
chain>
flow>這樣你的系統(tǒng)就會按照規(guī)則文件定義的方式,去執(zhí)行你的業(yè)務組件。是不是很簡單?
LiteFlow 為每一個請求都去開辟申請了一個 Slot,你可以理解為上下文,所有的組件共享這個 Slot。你可以在任意組件里通過對 Slot 的訪問來獲得任意數(shù)據(jù),也可以存放任意數(shù)據(jù)。你也可以擴展 Slot,自定義這個 Slot 的屬性。
@LiteflowComponent(id =?"a", name =?"組件A描述")
public?class?ACmp?extends?NodeComponent?{
@Override
public?void?process()?{
????????Slot slot =?this.getSlot();
//通過對slot的getData,setData,或者存取你自己擴展的slot屬性
????}
}xml version="1.0"?encoding="UTF-8"?>
<flow>
<nodes>
<node?id="s1"?name="普通腳本"?type="script">
????????????????????????????def a=3;
????????????????def b=2;
????????????????slot.setData("s1",a*b);
????????????]]>
node>
<node?id="s2"?name="條件腳本"?type="cond_script">
????????????????????????????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>有了腳本語言的支持,連業(yè)務代碼是不是都可以熱部署了?香不香?
4. JPom
一款簡而輕的低侵入式在線構(gòu)建、自動部署、日常運維、項目監(jiān)控軟件。中小公司團隊 DevOps 的福音!輕量且強大,你不試試?

市面上有很許多 DevOps 軟件但是這些軟件基本都會是難上手,重依賴。Jpom 則是針對中小公司或者團隊設計的一款低侵入,輕依賴的一款輕量級的 DevOps 軟件。
項目主要功能及特點:
創(chuàng)建、修改、刪除項目、Jar 包管理; 實時查看控制臺日志、備份日志、刪除日志、導出日志; 在線構(gòu)建項目發(fā)布項目一鍵搞定; 多節(jié)點管理、多節(jié)點自動分發(fā); 在線 SSH 終端,并且有終端日志和禁用命令; 實時監(jiān)控項目狀態(tài)異常自動報警; CPU、內(nèi)存監(jiān)控、導出堆棧信息、查看項目進程端口、服務器狀態(tài)監(jiān)控; 多用戶管理,用戶項目權(quán)限獨立(上傳、刪除權(quán)限可控制),完善的操作日志; 系統(tǒng)路徑白名單模式,杜絕用戶誤操作系統(tǒng)文件; 在線管理 Nginx 配置文件、SSL 證書文件。
一鍵安裝(Linux)(推薦)
插件端
如果服務端也需要被管理,在服務端上也需要安裝插件端。安裝的路徑位于執(zhí)行命令目錄(數(shù)據(jù)、日志存放目錄默認位于安裝路徑,如需要修改參考配置文件: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 環(huán)境 yum install -y?wget && wget -O install.sh?https://dromara.gitee.io/jpom/docs/install.sh?&& bash install.sh?Agent jdk
啟動成功后,插件端的端口為 2123。
安裝的路徑位于執(zhí)行命令目錄(數(shù)據(jù)、日志存放目錄默認位于安裝路徑,如需要修改參考配置文件:extConfig.yml )。
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 環(huán)境。
yum install -y?wget && wget -O install.sh?https://dromara.gitee.io/jpom/docs/install.sh?&& bash install.sh?Server jdk
支持自動安裝 JDK 和 Maven 環(huán)境。 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/
5. Cubic

兼容性:整體監(jiān)控不管你是 IDC、ECS、Docker 部署,都可完美兼容; 易用:無需任何配置,開箱即用,基于 agent 無侵入接入,升級應用端無感知; 強大:支持對應用的基礎(chǔ)監(jiān)控、堆棧監(jiān)控、線程池監(jiān)控等等; 高擴展:提供良好的擴展接口,給你自主選擇。









6. Sureness
丟掉 Shiro 吧,也別再用 Spring Security了。簡單易用多語言多框架支持,基于 RESTAPI 的強大國產(chǎn)鑒權(quán)框架,效率神器!

于是乎 Sureness 誕生了,我們希望能解決這些問題。提供一個面向 REST API、無框架依賴、可以動態(tài)修改權(quán)限、多認證策略、更快速度、易用易擴展的認證鑒權(quán)框架。
面向 REST API 的認證鑒權(quán),基于 RBAC(用戶-角色-資源)主要關(guān)注于對 API 的安全保護。無特定 Web 框架依賴,開箱即用(已有 SpringBoot、Quarkus、Javalin、Ktor、Micronaut、Jfinal、Solon 等集成樣例); 支持動態(tài)修改權(quán)限配置(動態(tài)修改配置每個?API 的訪問權(quán)限)
支持 Websocket 、主流 HTTP 容器 Servlet、JAX-RS、Spring Reactive;支持多種認證策略 JWT、Basic Auth、Digest Auth ... 可擴展自定義認證方式; 基于改進的字典匹配樹擁有的高性能; 良好的擴展接口、樣例和文檔,幫助急速理解、擴展與使用 Sureness 的低配置; 易擴展,不耦合其他框架,希望能對系統(tǒng)多場景快速安全的保護。


[x] Sureness 集成 Spring Boot 樣例(配置文件方案)sample-bootstrap [x] Sureness 集成 Spring Boot 樣例(數(shù)據(jù)庫方案)sample-tom [x] Sureness 集成 Quarkus 樣例 sample-quarkus [x] Sureness 集成 Javalin 樣例 sample-javalin [x] Sureness 集成 Ktor 樣例 sample-ktor [x] Sureness 集成 Spring Webflux 樣例 sample-spring-webflux [x] Sureness 集成 Micronau t樣例 sample-micronaut [x] Sureness 集成 MicroProfile 樣例 sample-microProfile [x] Sureness 集成 Jfinal 樣例 sample-jfinal [x] Sureness 集成 Solon 樣例 sample-solon [x] Sureness 集成 Spring Gateway 樣例 sample-spring-gateway [x] Sureness 集成 Zuul 樣例 sample-zuul [x] Sureness 集成 Session 樣例 sureness-session [x] Sureness 集成分布式緩存 Session 樣例 sureness-redis-session [x] More samples todo
7. TLog

通過對日志打標簽完成輕量級微服務日志追蹤; 提供三種接入方式:javaagent 完全無侵入接入,字節(jié)碼一行代碼接入,基于配置文件的接入; 對業(yè)務代碼無侵入式設計。使用簡單,10 分鐘即可接入; 支持常見的 log4j、log4j2、logback 三大日志框架,并提供自動檢測,完成適配; 支持 Dubbo、Dubbox、Spring Cloud 三大 RPC 框架; 支持 Spring Cloud Gateway 和 Soul 網(wǎng)關(guān); 適配 HttpClient 和 Okhttp 的 HTTP 調(diào)用標簽傳遞; 支持三種任務框架,JDK 的 TimerTask、Quartz、XXL-JOB; 支持日志標簽的自定義模板的配置,提供多個系統(tǒng)級埋點標簽的選擇; 支持異步線程的追蹤,包括線程池,多級異步線程等場景; 幾乎無性能損耗,快速穩(wěn)定。經(jīng)過壓測,損耗在0.01%。




最簡單的例子:
public?void?simpleDemo() throws Exception?{
//合成器
????????ImageCombiner combiner =?new?ImageCombiner("http://xxx.com/image/bg.jpg", OutputFormat.JPG);
//加圖片元素
????????combiner.addImageElement("http://xxx.com/image/product.png",?0,?300)
????????????.setAlpha(.8?f)?//透明度(0.0~1.0)
????????????.setRotate(45)?//旋轉(zhuǎn)(0~360)
????????????.setBlur(20);?//高斯模糊(1~100);
//加文本元素
????????combiner.addTextElement("周末大放送",?0,?150,?1400)
????????????.setCenter(true)?//居中繪制(會忽略x坐標,改為自動計算)
????????????.setColor(Color.Red)?//顏色
//執(zhí)行圖片合并
????????combiner.combine();
//可以獲取流(并上傳oss等)
????????InputStream?is?= combiner.getCombinedImageStream();
//也可以保存到本地
????????combiner.save("d://image.jpg");9. MaxKey



提供標準的認證接口以便于其他應用集成?SSO,安全的移動接入,安全的 API、第三方認證和互聯(lián)網(wǎng)認證的整合; 提供用戶生命周期管理,支持 SCIM 2 協(xié)議,基于 Apache Kafka 代理,通過連接器(Connector)實現(xiàn)身份供給同步; 認證中心具有平臺無關(guān)性、環(huán)境多樣性。支持 Web、手機、移動設備等。如 Apple iOS、Andriod 等。將認證能力從 B/S 到移動應用全面覆蓋; 多種認證機制并存,各應用系統(tǒng)可保留原有認證機制,同時集成認證中心的認證;應用具有高度獨立性,不依賴認證中心,又可用使用認證中心的認證,實現(xiàn)單點登錄; 基于 Java EE 平臺,采用 Spring、MySQL、Tomcat、Redis、Apache Kafka 等開源技術(shù),微服務架構(gòu),擴展性強; 開源、安全、自主可控,許可證 Apache 2.0 License & MaxKey 版權(quán)聲明。




最后
干貨分享
最近將個人學習筆記整理成冊,使用PDF分享。關(guān)注我,回復如下代碼,即可獲得百度盤地址,無套路領(lǐng)取!
?001:《Java并發(fā)與高并發(fā)解決方案》學習筆記;?002:《深入JVM內(nèi)核——原理、診斷與優(yōu)化》學習筆記;?003:《Java面試寶典》?004:《Docker開源書》?005:《Kubernetes開源書》?006:《DDD速成(領(lǐng)域驅(qū)動設計速成)》?007:全部?008:加技術(shù)群討論
加個關(guān)注不迷路
喜歡就點個"在看"唄^_^
