女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Java項目有可能做到所有的代碼邏輯均可熱部署嗎?

OSC開源社區 ? 來源: OSCHINA 社區 ? 作者:鉑賽東 ? 2022-11-23 11:47 ? 次閱讀

前言

首先我們明確下什么叫做熱部署,熱部署是在不重啟 java 虛擬機的前提下,自動更新 class 的行為,從而更新整個運行時的邏輯。 在 java 開發領域,熱部署一直是一個難以解決的問題,java 虛擬機理論上只能實現方法體的修改熱部署,對于整個類結構的更改,仍然需要重啟虛擬機,對類重新加載才能完成更新操作。

OSGI

其實 java 業界有一些解決方案,比如 osgi 架構,這玩意時間比較長了,但一直沒火起來。osgi 架構的出現,可以讓 java 系統變成模塊化的形式,讓模塊重啟成為可能。從一定程度上也算是個熱部署的方案。可惜這玩意以前開發起來就覺得很反人類,配置文件一大堆不說,學習成本也很大。和 spring 結合起來,居然是一個模塊一個 spring 上下文體系。并且如果模塊之間有調用關系的話,重啟相關的模塊會讓應用出現短暫的功能性休克,也就說,整個熱啟動過程不平滑。 這項技術現在估計很多小伙伴都沒聽說過,目前也漸漸的退出歷史舞臺,用的企業估計很少。

ASM

ASM 是一款修改字節碼的框架,同類型的框架還有 Cglib。這些框架能加載一個 class 信息,用戶可以按照自己的需求增強修改這些信息,最后輸出成一個新的 class。 具體實現過程,這里就不展開了。大家可以百度下,相關技術實現文章不少。 但單純修改字節碼一般要和其他技術結合起來,單靠這個也無法完成熱更新,雖然 ASM 類的框架能夠修改類,但是這些 ASM 的修改邏輯也是用 java 寫的,這段代碼也需要執行的。如果你把 ASM 的代碼寫在 java 里,也無法實現從外部來熱更新。

Javaagent&Attach API 結合 ASM

這就是上面一段說的 ASM 要結合其他技術才能實現熱更新的方案,也是目前很多開源框架采用的方案。 比如大名鼎鼎的 Arthas,就是利用 javaagent 通過 Attach API 運行時加載目標 Java 程序,最終利用 Instrumention API 或者 ASM 增強 class,來實現代碼跟蹤,以及代碼熱修改的特性。 但筆者認為用 Arthas 來完成線上代碼的熱更新,只能用于一些很緊急的場景。不能替代日常業務邏輯修改。而且操作起來也挺復雜。 你需要先修改 java 代碼,然后把 java 代碼放到服務器上,在 arthas 里查找這個類的類加載器的 hashcode,然后利用 arthas 提供的命令編譯 java 代碼輸出成新的 class 文件,最用利用redefine命令進行熱更新。 試想下,如果大量邏輯的更改。這得有多麻煩。 所以更多的是利用 arthas 對線上應用進行診斷,追蹤,熱更改代碼其實就是 arthas 眾多功能中其中一個,并不是主要功能。

換一種思路

以上方案都是基于修改 class 本身,然后讓 JVM 的類加載器重新加載來實現的。 那么有沒有更好的方案呢? 其實 java 代碼可以運行一些腳本的,jdk 本身就支持調用腳本,從 JDK 1.6 開始,java 就支持 JSR223,可以用一致的形式在 JVM 上執行一些腳本語言,而且可實時編譯,運行的效率和 java 不相上下的。 有的同學看到這里可能會拍磚了:利用腳本只能更改部分邏輯,不可能把所有的邏輯都用腳本寫吧,你這篇文章探討的不是 “有沒有可能所有的邏輯都可熱更新” 么? 別急,首先我們來確定一個事情。你的 java 應用系統需不需要所有的邏輯都是可以熱更新的?很多代碼都是大致固定不變的,比如 util 類,一些 vo 的定義也不大變更的,一些固定的業務也不需要熱更新需求的。只有一些經常變更的決策部分,可能需要熱更新。 那么我們只要把需要經常變的部分用腳本來定義不就可以了么。 業界有沒有類似的開源框架呢? 還真有,而且是高 star 的熱門開源項目,能夠幫你做到用腳本進行熱更新業務。

開源編排規則引擎

可能有小伙伴又要說了:你不是介紹 java 代碼熱部署么,怎么話題轉到規則引擎上去了? 這里要說下,規則引擎的一大特性就是把決策部分邏輯剝離到外面,能夠實現邏輯的變動快速熱變更。 而這次介紹的規則引擎框架則更為強大,除了能剝離邏輯,還能解耦系統,讓你的所有的邏輯塊均可隨意變更。理論上能實現所有的邏輯都可變更,不是部分哦。 這就是業界現在 很火的編排式規則引擎框架:LiteFlow。 LiteFlow 的理念很簡單,就是把系統中的各個邏輯切分成一小塊一小塊的,稱之為組件,這些組件可以由 java 代碼來寫,也可以用腳本來寫。然后一個完整業務就是把各個組件組搭一起,形成一個完整業務鏈。

3c90e9e4-667d-11ed-8abf-dac502259ad0.png


這種模式的好處就是,不需要熱更新的部分可以用 java 組件來寫,需要經常變的部分可以用腳本來寫。所有的組件均可混搭成為一個業務。如何編排這些組件,LiteFlow 獨創了 ELF 語法,擁有非常好上手的編排語法。程序員的話,十分鐘就可以上手。上圖粉色部分就是最簡單的一種串聯形式。 業務鏈路中組件可實時更換,也可實時增加,形成一個新的業務鏈。同時定義好的組件也可復用在其他的鏈路中。

3cb80c68-667d-11ed-8abf-dac502259ad0.png


LiteFlow 的腳本方案也是利用 JSR223 來實現的,目前已經實現的腳本有三種:

3ce1f2c6-667d-11ed-8abf-dac502259ad0.png


為什么說利用 LiteFlow 編排引擎框架,你的所有邏輯都是可以變更的呢。因為你完全可以把所有的邏輯都用腳本組件來實現,LiteFlow 提供了非常強大的腳本支持,完全和 Java 底層打通,你可以在腳本中 import java 的類,也可以調用 java 的類方法,甚至于可以在腳本中去定義方法,定義類,一切寫法和 java 中完全一樣。 更夸張的是,LiteFlow 允許你在腳本中調用 spring 上下文的 bean,你可以在腳本中調用 DAO 取數據,可以在腳本中發送 rpc 給其他微服務。只要你愿意,你可以一行 java 業務代碼不寫,完全把業務搬到腳本組件中去。 而且連邏輯塊的順序你也可以隨意變動,因為 LiteFlow 的編排規則和腳本均可實現熱變更。 LiteFlow 為經常用的存儲中間件也提供了原生支持:

3d196af8-667d-11ed-8abf-dac502259ad0.png


LiteFlow 支持所有的關系型數據庫,另外 zk,etcd,nacos 均可支持,還提供了額外的擴展接口,供你自己擴展成其他的存儲方式。 有想過么,你所有的邏輯和規則編排語法,都是存在于系統之外的。只要更改其腳本和邏輯,你所有節點的系統不需要做任何事,實時的進行熱變更。 而這一切,LiteFlow 做到了非常平滑,所謂平滑的意思是,不用擔心在熱變更的時候你的業務會受到任何的中斷,也不會因為熱變更造成正在執行的鏈路產生任何的異常。 LiteFlow 編排能力有多強大呢,簡單的幾個關鍵字就可以編排出超乎想象的效果:

3d3eb9a2-667d-11ed-8abf-dac502259ad0.png

3d5fac7a-667d-11ed-8abf-dac502259ad0.png

結語

在 java 的業務熱部署領域,LiteFlow 作為一款規則引擎,給出了一種新的解決思路。 除以上文中介紹的之外,LiteFlow 框架還擁有眾多的高級特性,從各個方位提升你系統的靈活性。 并且作為開源軟件,LiteFlow 擁有國內非常好的社區氛圍和文化。 最后放出 LiteFlow 的官網和倉庫地址,如果你覺得這款開源框架對你的業務有幫助,趕緊來了解一下吧 。

項目官網: https://liteflow.yomahub.com gitee

托管倉庫: https://gitee.com/dromara/liteFlow github

托管倉庫: https://github.com/dromara/liteflow

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    20

    文章

    2984

    瀏覽量

    106786
  • 代碼
    +關注

    關注

    30

    文章

    4886

    瀏覽量

    70216
  • 虛擬機
    +關注

    關注

    1

    文章

    962

    瀏覽量

    28996

原文標題:Java項目有可能做到所有的代碼邏輯均可熱部署嗎?

文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    SpringBoot 如何實現部署

    SpringBoot 如何實現部署? 1、部署的優點 開發周期通常包括編寫代碼、編譯、部署
    的頭像 發表于 09-30 10:16 ?985次閱讀
    SpringBoot 如何實現<b class='flag-5'>熱</b><b class='flag-5'>部署</b>

    [轉帖]JAVA私塾關于實訓項目的總結

    :絕對要指導學生親自動手做,而不是看和聽,所以盡量不要選擇現成代碼項目,演示用的項目也最好不配發代碼,讓學生能夠跟著做出來才是真的掌握了
    發表于 01-03 12:04

    Java工程師必須掌握的技術哪些?

    )spirngMvc 等等的其他一些相似的框架,還有項目架構中經常會用到的緩存框架例如memcached ,ehcache,oscache等Java緩存框架,需要掌握基本使用,部署,性能調優,配置4. 數據庫基礎數據庫
    發表于 02-09 16:18

    詳解java代碼優化方法

    Java代碼優化是Java編程開發很重要的一個步驟,Java代碼優化要注重細節優化,一個兩個的細節的優化,產生的效果不大,但是如果處處都能注
    發表于 04-02 15:43

    用AD8367做音頻AGC不能做到AGC

    上面的解法 CAGC電容也換過 CHP與C4都換過 RB改為電位器也只能改變放大倍數不能做到AGC求解是還有什么地方需要修改還是哪里問題謝謝
    發表于 08-22 10:18

    docker中java環境的部署

    docker 部署java環境以及常用應用(持續更新)
    發表于 05-24 15:44

    linux的java項目部署

    b.因為tomcat的安裝依賴于Java jdk,所以我們需要在判斷linux系統下面是否安裝jdk
    發表于 07-25 08:41

    是否可能通過引導加載器從sd卡下載可執行代碼的閃存程序?

    大家好,我一個項目,包括一個串行tft顯示器+觸摸屏+sd卡,圖18F46K22我的問題是:是否可能通過引導加載器,從sd卡下載可執行代碼
    發表于 09-10 14:16

    是否可能通過配置寄存器關閉所有的LED?

    只是想知道,是否可能通過配置寄存器關閉所有的LED?我問的原因是…Led非常適合于設置和運行,但是在一些應用中,每天運行很少閃爍的LED會非常煩人。如果通過軟件他們可以關閉,這將是美妙的…我試圖找出如果其中一種模式可以
    發表于 10-22 11:59

    如何避免在每次部署部署到RAM時閃爍代碼

    每次部署都需要很長時間的編程和驗證。我們想加快部署過程。到目前為止,我們所有的 IDE 都允許將圖像部署到 RAM。MCUxpresso
    發表于 03-27 06:51

    Java遠程部署插件的使用方法

    ,長則幾十分鐘都有可能,漫長的打包流程浪費了我們大量的青春,市面上有很多 java 部署的插件,要么是只能修改方法體而不能新增字段和方法,要么就是只能在本地熱
    的頭像 發表于 09-07 10:43 ?866次閱讀
    <b class='flag-5'>Java</b>遠程<b class='flag-5'>熱</b><b class='flag-5'>部署</b>插件的使用方法

    jrebel和idea部署優勢

    開發效率: JRebel 和 IntelliJ IDEA 的部署可以快速將代碼變更應用于運行中的應用程序,節省了反復重啟服務器的時間。開發人員可以即時看到代碼變更的結果,無需等待應用
    的頭像 發表于 12-03 15:16 ?1041次閱讀

    eclipse怎么運行java項目

    代碼添加到項目中。您可以通過右鍵單擊項目名稱,然后選擇“New” > “Class”來創建一個新的Java類。在彈出的對話框中,輸入類的名稱和
    的頭像 發表于 12-06 11:25 ?2412次閱讀

    idea怎么創建Java項目

    (Integrated Development Environment)是開發Java項目的必備工具。常見的Java IDEEclipse、IntelliJ IDEA和NetBea
    的頭像 發表于 12-06 14:09 ?1221次閱讀

    java反編譯的代碼可以修改么

    Java反編譯是一種將編譯后的Java字節碼(.class文件)轉換回源代碼的過程。反編譯后的代碼可以進行修改,但是需要注意,反編譯代碼的質
    的頭像 發表于 09-02 11:00 ?1139次閱讀