日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

SpringBoot Admin2.0 集成Arthas的實(shí)現(xiàn)步驟

瀏覽:44日期:2023-03-17 17:54:50

項(xiàng)目最初使用 Arthas 主要有兩個(gè)目的:

通過(guò) arthas 解決實(shí)現(xiàn)測(cè)試環(huán)境、性能測(cè)試環(huán)境以及生產(chǎn)環(huán)境性能問(wèn)題分析工具的問(wèn)題。 通過(guò)使用 jad、mc、redefine 功能組合實(shí)現(xiàn)生產(chǎn)環(huán)境部分節(jié)點(diǎn)代碼熱更新的能力。 技術(shù)選型相關(guān)

因?yàn)楣具€未能建立起較為統(tǒng)一的生產(chǎn)微服務(wù)配置以及狀態(tài)管理的能力,各自系統(tǒng)的研發(fā)運(yùn)維較為獨(dú)立。現(xiàn)在項(xiàng)目使用了 Spring Cloud 以及 Eureka 的框架結(jié)構(gòu),和 SBA 的基礎(chǔ)支撐能力較為匹配,同時(shí),SBA 已經(jīng)可以提供服務(wù)感知,日志級(jí)別配置管理,以及基于 actuator 的 JVM、Spring 容器的眾多管理插件,可以滿(mǎn)足基礎(chǔ)使用的需求。

在調(diào)研期間,Arthas 整體版本為 3.4.5,提供了基于 Webconsole 的 Tunner Server 模式,通過(guò)前面鏈接文章已經(jīng)實(shí)踐,與SBA已經(jīng)可以實(shí)現(xiàn)集成。因?yàn)轫?xiàng)目本身沒(méi)有歷史包袱,在實(shí)際集成的過(guò)程中采用了 SBA 2.0 版本以提供更多的管理功能和圖形界面能力。其他優(yōu)點(diǎn):

web console 界面嵌入 SBA 整體密碼登錄和網(wǎng)頁(yè)權(quán)限管理,實(shí)現(xiàn)登陸 SBA 后才可以使用相關(guān) arthas web console 的功能。 基于SBA 客戶(hù)端依賴(lài)的 jolokia-core 開(kāi)放目標(biāo)服務(wù)進(jìn)程的 jmx 管理,通過(guò)實(shí)現(xiàn) jmx 接口復(fù)用 SBA 的相關(guān)操作界面,減少前端界面開(kāi)發(fā)能力的要求。整體結(jié)構(gòu)

SpringBoot Admin2.0 集成Arthas的實(shí)現(xiàn)步驟

幾個(gè)關(guān)鍵點(diǎn),使用 JVM 內(nèi)置 Arthas Spring Boot 插件,參考工商銀行的模式建立完善的客戶(hù)端下載以及修改腳本實(shí)現(xiàn)遠(yuǎn)程控制。內(nèi)置方案工作開(kāi)發(fā)量小,只需要集成相關(guān)的開(kāi)源組件即可實(shí)現(xiàn)相關(guān)的遠(yuǎn)程使用的模式并兼顧安全。工銀的方案大而全適合整體架構(gòu)規(guī)劃后配置專(zhuān)有研發(fā)團(tuán)隊(duì)之城。內(nèi)置方案同時(shí)包含通過(guò) JMX 的啟停操作(基于 3.4.5 的 Spring Boot 插件無(wú)法獲得相關(guān)句柄,暫時(shí)無(wú)法實(shí)現(xiàn)),默認(rèn)不啟動(dòng)。通過(guò)遠(yuǎn)程 JMX 開(kāi)通后,JVM 新增相關(guān)線(xiàn)程 8 個(gè),新增虛擬機(jī)內(nèi)存 30MB 左右,和本文參考的 SBA1.0 方案相同,需要考慮在線(xiàn)開(kāi)啟前 JVM 內(nèi)存是否可以支持。

實(shí)現(xiàn)效果

SBA 2.0 最大的方便就是提供了配置化鏈接外部網(wǎng)頁(yè)的能力,同時(shí)如果網(wǎng)頁(yè)實(shí)現(xiàn)在當(dāng)前 JVM 進(jìn)程,可以實(shí)現(xiàn) Spring-Security 的本地權(quán)限管理,在生產(chǎn)環(huán)境下只有在登錄 SBA 后才能使用相關(guān)集成的 arthas 功能。

登錄界面

SpringBoot Admin2.0 集成Arthas的實(shí)現(xiàn)步驟

外嵌連接位置

SpringBoot Admin2.0 集成Arthas的實(shí)現(xiàn)步驟

JMX 的使用

SpringBoot Admin2.0 集成Arthas的實(shí)現(xiàn)步驟

SpringBoot Admin2.0 集成Arthas的實(shí)現(xiàn)步驟

跳轉(zhuǎn) arthas web console

SpringBoot Admin2.0 集成Arthas的實(shí)現(xiàn)步驟

改造方案1. 整體工程結(jié)構(gòu)

SpringBoot Admin2.0 集成Arthas的實(shí)現(xiàn)步驟

整體工程修改自 SBA 開(kāi)源項(xiàng)目的 example 工程,具體使用 custom-ui 的工程鏈接為:[spring-boot-admin-sample-custom-ui]_,_紅色框的部分是 arthas web console 的全部靜態(tài)文件,通過(guò) Maven Resource 的指定配置打入指定目錄,實(shí)現(xiàn) SBA 啟動(dòng)時(shí)的自定義加載。maven resource 配置--下:

<resource><directory>static</directory><targetPath>${project.build.directory}/classes/META-INF/spring-boot-admin-server-ui/extensions/arthas</targetPath><filtering>false</filtering> </resource>2. 外部鏈接配置

SBA 2.0 開(kāi)始已經(jīng)使用 vue 全家桶了,擴(kuò)展集成均比較方便。其中,官方文檔給出了外嵌連接的配置方式:[Linking / Embedding External Pages]。

參考 sba example 工程的 application.yml 配置即可:

# tag::customization-external-views[] spring: boot:admin: ui: external-views: - label: 'Arthas Console'url: http://21.129.49.153:8080/order: 1900 # end::customization-external-views[]3. 對(duì)應(yīng) Spring MVC controller 實(shí)現(xiàn)

參考引用原實(shí)現(xiàn)的 SBA 集成部分,該部分主要修改實(shí)現(xiàn)如下功能:

實(shí)現(xiàn) tunnel server 已經(jīng)加載實(shí)例列表的刷新并展示到前段 AgentID 框供選擇點(diǎn)擊鏈接。 實(shí)現(xiàn)自定義 IP 地址的刷新(解決生產(chǎn)環(huán)境雙生產(chǎn) IP 和運(yùn)維段 IP 不一致的問(wèn)題)。 4. Arthas Spring Boot 插件修改和配置

參考引用原實(shí)現(xiàn)的 SBA 集成中插件修改以及客戶(hù)端配置 application.yml。

對(duì)原版 Spring boot 插件修改主要在于原有插件是通過(guò) Spring的@ConditionalOnMissingBean 實(shí)現(xiàn)自動(dòng)加載。

修改主要是通過(guò)修改這部分實(shí)現(xiàn)通過(guò)配置文件默認(rèn)不啟動(dòng),然后使用時(shí)通過(guò)遠(yuǎn)程啟動(dòng)相關(guān) agent 線(xiàn)程。

5. 基于 Spring Actuator 的 JMX 實(shí)現(xiàn)

SBA client 在 maven 引入中會(huì)默認(rèn)引入 jolokia-core.jar,如果沒(méi)有因?yàn)?SBA client 依賴(lài)可以自行引入該包,可以實(shí)現(xiàn)通過(guò) actuator 開(kāi)放基于 http 的 jmx 操作能力和 SBA 控制臺(tái)的相關(guān)功能無(wú)縫配合。

application.yml 中開(kāi)放 management 相關(guān)配置,根據(jù)自身環(huán)境情況,也可以開(kāi)在客戶(hù)端側(cè)開(kāi)啟 Spring security 認(rèn)證,SBA 也可以很好的支持通過(guò)服務(wù)發(fā)現(xiàn)實(shí)現(xiàn)密碼保護(hù) actuator 端點(diǎn)的訪(fǎng)問(wèn)。

#放開(kāi)management management: endpoints:web: exposure: # 這里用* 代表暴露所有端點(diǎn)只是為了觀(guān)察效果,實(shí)際中按照需進(jìn)行端點(diǎn)暴露 include: '*' exclude: env endpoint:health: # 詳細(xì)信息顯示給所有用戶(hù)。 show-details: ALWAYS health:status: http-mapping: # 自定義健康檢查返回狀態(tài)碼對(duì)應(yīng)的 http 狀態(tài)碼 FATAL: 503

JMX 實(shí)現(xiàn)參考原文中 EnvironmentChangeListener 的實(shí)現(xiàn)思路,基于 Spring 的 JMX 注解實(shí)現(xiàn)即可。

@Component @ManagedResource(objectName = 'com.ArthasAgentManageMbean:name=ArthasMbean', description = 'Arthas遠(yuǎn)程管理Mbean') public class ArthasMbeanImpl { @Autowired private Map<String, String> arthasConfigMap; @Autowired private ArthasProperties arthasProperties; @Autowired private ApplicationContext applicationContext; /*** 初始化** @return*/ private ArthasAgent arthasAgentInit() { arthasConfigMap = StringUtils.removeDashKey(arthasConfigMap); // 給配置全加上前綴 Map<String, String> mapWithPrefix = new HashMap<String, String>(arthasConfigMap.size()); for (Map.Entry<String, String> entry : arthasConfigMap.entrySet()) { mapWithPrefix.put('arthas.' + entry.getKey(), entry.getValue()); } final ArthasAgent arthasAgent = new ArthasAgent(mapWithPrefix, arthasProperties.getHome(), arthasProperties.isSlientInit(), null); arthasAgent.init(); return arthasAgent; } @ManagedOperation(description = '獲取配置Arthas Tunnel Server地址') public String getArthasTunnelServerUrl() { return arthasProperties.getTunnelServer(); } @ManagedOperation(description = '設(shè)置Arthas Tunnel Server地址,重新attach后生效') @ManagedOperationParameter(name = 'tunnelServer', description = 'example:ws://127.0.0.1:7777/ws') public Boolean setArthasTunnelServerUrl(String tunnelServer) { if (tunnelServer == null || tunnelServer.trim().equals('') || tunnelServer.indexOf('ws://') < 0) { return false; } arthasProperties.setTunnelServer(tunnelServer); return true; } @ManagedOperation(description = '獲取AgentID') public String getAgentId() { return arthasProperties.getAgentId(); } @ManagedOperation(description = '獲取應(yīng)用名稱(chēng)') public String getAppName() { return arthasProperties.getAppName(); } @ManagedOperation(description = '獲取ArthasConfigMap') public HashMap<String, String> getArthasConfigMap() { return (HashMap) arthasConfigMap; } @ManagedOperation(description = '返回是否已經(jīng)加載Arthas agent') public Boolean isArthasAttched() { DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory(); String bean = 'arthasAgent'; if (defaultListableBeanFactory.containsBean(bean)) { return true; } return false; } @ManagedOperation(description = '啟動(dòng)Arthas agent') public Boolean startArthasAgent() { DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory(); String bean = 'arthasAgent'; if (defaultListableBeanFactory.containsBean(bean)) { ((ArthasAgent) defaultListableBeanFactory.getBean(bean)).init(); return true; } defaultListableBeanFactory.registerSingleton(bean, arthasAgentInit()); return true; } @ManagedOperation(description = '關(guān)閉Arthas agent,暫未實(shí)現(xiàn)') public Boolean stopArthasAgent() { // TODO 無(wú)法獲取自定義tmp文件夾加載的classLoader,因此無(wú)法獲取到com.taobao.arthas.core.server.ArthasBootstrap類(lèi)并調(diào)用destroy方法 DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory(); String bean = 'arthasAgent'; if (defaultListableBeanFactory.containsBean(bean)) { defaultListableBeanFactory.destroySingleton(bean); return true; } else { return false; } } }實(shí)際使用

管理工程投產(chǎn)后,多次在生產(chǎn)環(huán)境用于問(wèn)題排查和代碼熱修復(fù)。性能問(wèn)題主要用于性能流控組件以及灰度發(fā)布相關(guān)配置參數(shù)的在線(xiàn)驗(yàn)證和 debug。

代碼熱加載相關(guān)初期通過(guò) jad+mc 的方式進(jìn)行操作,后續(xù)發(fā)現(xiàn) jad 在部分代碼上因環(huán)境配置以及 jvm 問(wèn)題產(chǎn)生反編譯代碼不一致的情況,后續(xù)通過(guò) maven 打包部署應(yīng)用程序 source 壓縮包的方式解決,直接使用和應(yīng)用 jar 同版本構(gòu)建的 source 進(jìn)行修改更加可靠。整體方案在管理較為嚴(yán)格的生產(chǎn)環(huán)境提供了有效的性能分析以及熱修復(fù)的能力。

遺留問(wèn)題

現(xiàn)有官方提供的 com.taobao.arthas.agent.attach.ArthasAgent 中啟動(dòng) arthas agent 的客戶(hù)端使用的 arthasClassLoader 和 bootstrapClass 均為方法內(nèi)的臨時(shí)變量,外部無(wú)法獲取相關(guān)句柄實(shí)現(xiàn)通過(guò) bootstrapClass 關(guān)閉 arthas agent 的功能;臨時(shí)解決方案為通過(guò) JMX 啟動(dòng)后,在 web console 連接使用后,使用 stop 命令實(shí)現(xiàn)目標(biāo)進(jìn)程中 arthas agent 的關(guān)閉。

現(xiàn)有字節(jié)碼加載工具可以很好的實(shí)現(xiàn)內(nèi)部類(lèi),私有類(lèi)的在線(xiàn)熱部署替換,同時(shí)經(jīng)測(cè)試可以兼容 SkyWalk8.x 版本的 javaagent 插件,但是在測(cè)試環(huán)境因?yàn)榕渲糜?jacoco 覆蓋度采集插件與 Arthas 字節(jié)碼產(chǎn)生了不兼容的情況,在部分環(huán)境使用時(shí)需要先關(guān)閉對(duì)應(yīng)的 agent 后才能正常使用 arthas 的相關(guān)功能。

歡迎登陸 start.aliyun.com 知行動(dòng)手實(shí)驗(yàn)室體驗(yàn) Arthas 57 個(gè)動(dòng)手實(shí)驗(yàn):

SpringBoot Admin2.0 集成Arthas的實(shí)現(xiàn)步驟

以上就是SpringBoot Admin2.0 集成Arthas的實(shí)現(xiàn)步驟的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Admin2.0 集成Arthas的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
91成人精品观看| 日韩欧美三区| 美国三级日本三级久久99| 久久国产精品久久w女人spa| 在线一区免费| 亚洲精品日本| 亚洲一区黄色| 在线综合欧美| 亚洲色诱最新| 日本va欧美va精品发布| 国产精品调教| 麻豆极品一区二区三区| 欧美国产偷国产精品三区| 婷婷激情一区| 伊人精品视频| 四虎精品永久免费| 国产精品国产三级在线观看| 美女久久精品| 香蕉视频亚洲一级| 伊人成人在线视频| 日韩精品亚洲专区| 国产精品hd| 成人片免费看| 欧美一级专区| 国产精品亚洲综合久久| а√天堂8资源中文在线| 99久久婷婷这里只有精品| 中文在线不卡| 国产探花在线精品一区二区| 成人在线视频中文字幕| 国精品一区二区| 日韩黄色av| 麻豆精品91| 欧美少妇精品| 精品九九在线| 日韩美女精品| 免费看的黄色欧美网站| 久久成人av| 国产高清视频一区二区| 综合激情五月婷婷| 日韩av中文字幕一区二区三区| 欧美成人亚洲| 日韩一区二区三免费高清在线观看 | 一区二区电影在线观看| 夜夜精品视频| 黄色亚洲在线| 男人的天堂久久精品| 国产在线日韩| 不卡在线一区| 国产一区二区三区亚洲综合| 久久伊人亚洲| 久久亚洲精精品中文字幕| 国产精品1区| 日韩综合精品| 秋霞影院一区二区三区| 久久人人88| caoporn视频在线| 九九精品调教| 国产精品蜜月aⅴ在线| 精品国产不卡一区二区| 欧美羞羞视频| 日韩av一区二区三区| 中文字幕在线视频久| 亚洲毛片一区| 国产精品精品国产一区二区| 亚洲国产不卡| 麻豆精品少妇| 在线精品观看| 久久久久免费av| 国产精品亚洲四区在线观看| 极品日韩av| 精品日韩一区| 亚洲综合色婷婷在线观看| 9999国产精品| 国产亚洲高清一区| 奇米亚洲欧美| 日韩美女国产精品| 91精品一区二区三区综合| 你懂的国产精品永久在线| 91亚洲一区| 欧美一区自拍| 激情91久久| 国产在视频一区二区三区吞精| 亚洲综合日韩| 九九久久国产| 久久国产三级| 亚洲丝袜美腿一区| 免费精品国产的网站免费观看| 美女av一区| 久久精品99久久久| 91精品精品| 久久国产精品免费精品3p| 色狠狠一区二区三区| 亚洲免费一区二区| 一区二区高清| 欧美性感美女一区二区| 老牛国内精品亚洲成av人片| 综合五月婷婷| 久久精品不卡| 久久久一本精品| 成人污污视频| 久久亚洲人体| 国产黄色精品| 国产精品一区二区免费福利视频 | 免费日韩视频| 午夜欧美精品久久久久久久| 久久97视频| 国产精品久久777777毛茸茸| 久久精品超碰| 欧美亚洲人成在线| 少妇精品在线| 欧美日韩国产综合网| 亚洲成人国产| 九九色在线视频| 欧美久久天堂| 麻豆理论在线观看| 日韩欧美精品| 黄色aa久久| 久久久天天操| 久久在线电影| 99国产精品| 日韩一级网站| 亚洲精品黄色| 日韩欧美久久| 欧美久久一区二区三区| 国产精品久久乐| 狠狠久久伊人| 92国产精品| japanese国产精品| 黄色日韩在线| 亚洲精品在线国产| 日韩av一二三| 久久成人高清| 日产精品一区二区| 久久久精品久久久久久96 | 午夜久久美女| 久久亚洲人体| 日本高清不卡一区二区三区视频| 婷婷综合社区| 日韩国产精品久久久久久亚洲| 国内一区二区三区| 中文字幕一区二区av| 成人黄色av| 亚洲一区久久| 丝袜脚交一区二区| 五月亚洲婷婷 | 婷婷色综合网| 日本伊人午夜精品| 日韩在线免费| 西西人体一区二区| 精品一区视频| 色狠狠一区二区三区| 久久久久久色| 国产中文在线播放| 欧美特黄一级| 亚洲一级高清| 亚洲精品国模| 精品中文字幕一区二区三区四区| 日韩欧美三区| 日韩精品中文字幕一区二区| 日本国产精品| 日韩在线卡一卡二| 免费观看亚洲| 日韩久久精品| 婷婷综合成人| 精品国产不卡一区二区| 久久婷婷亚洲| 亚洲三级观看| 国产suv精品一区二区四区视频| 国产精品毛片久久| 亚洲少妇诱惑| 久久超级碰碰| 婷婷亚洲五月| 日本久久一区| 国产黄大片在线观看| 免费精品视频| 精品国产一区二| 丝瓜av网站精品一区二区 | 激情偷拍久久| 91麻豆精品| 精品中文一区| 欧美久久香蕉| 午夜久久免费观看| 美腿丝袜在线亚洲一区| 在线国产一区二区| 国产精品mv在线观看| 欧美va天堂在线| 欧美天堂一区二区| 亚洲一级高清| 久久不卡日韩美女| 午夜宅男久久久| 麻豆理论在线观看| 青青草国产精品亚洲专区无| 久久人人精品| 久久爱www成人| 午夜欧美精品| 麻豆国产精品视频| 亚洲日本国产| 黄色不卡一区| 国产美女高潮在线|