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

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

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

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









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

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


[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

通過對日志打標(biāo)簽完成輕量級微服務(wù)日志追蹤; 提供三種接入方式:javaagent 完全無侵入接入,字節(jié)碼一行代碼接入,基于配置文件的接入; 對業(yè)務(wù)代碼無侵入式設(shè)計(jì)。使用簡單,10 分鐘即可接入; 支持常見的 log4j、log4j2、logback 三大日志框架,并提供自動檢測,完成適配; 支持 Dubbo、Dubbox、Spring Cloud 三大 RPC 框架; 支持 Spring Cloud Gateway 和 Soul 網(wǎng)關(guān); 適配 HttpClient 和 Okhttp 的 HTTP 調(diào)用標(biāo)簽傳遞; 支持三種任務(wù)框架,JDK 的 TimerTask、Quartz、XXL-JOB; 支持日志標(biāo)簽的自定義模板的配置,提供多個(gè)系統(tǒng)級埋點(diǎn)標(biāo)簽的選擇; 支持異步線程的追蹤,包括線程池,多級異步線程等場景; 幾乎無性能損耗,快速穩(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坐標(biāo),改為自動計(jì)算)
????????????.setColor(Color.Red)?//顏色
//執(zhí)行圖片合并
????????combiner.combine();
//可以獲取流(并上傳oss等)
????????InputStream?is?= combiner.getCombinedImageStream();
//也可以保存到本地
????????combiner.save("d://image.jpg");9. MaxKey



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




最后
【END】
如果看到這里,說明你喜歡這篇文章,請?轉(zhuǎn)發(fā)、點(diǎn)贊。同時(shí)?標(biāo)星(置頂)本公眾號可以第一時(shí)間接受到博文推送。
推薦閱讀:(點(diǎn)擊標(biāo)題可跳轉(zhuǎn))
基于 SpringBoot + Vue 的前后端分離的考試系統(tǒng)
干掉 XML Mapper,新出的 Fluent Mybatis 真香!
最牛逼的性能監(jiān)控系統(tǒng)!集強(qiáng)大功能于一身
編程·技術(shù)·經(jīng)驗(yàn)
歡迎掃碼關(guān)注
