別再說你不會JVM性能監控和調優了,2021華為Java高級面試題及答案,

程序小茉莉 2021-09-15 06:17:21
jvm 性能 java 答案


策略 1——停止挖掘

Law of Holes 是說當自己進洞就應該停止挖掘。對於單體式應用不可管理時這是最佳建議。換句話說,應該停止讓單體式應用繼續變大,也就是說當開發新功能時不應該為舊單體應用添加新代碼,最佳方法應該是將新功能開發成獨立微服務。如下圖所示:

別再說你不會JVM性能監控和調優了,2021華為Java高級面試題及答案,_Java

除了新服務和傳統應用,還有兩個模塊,其一是請求路由器,負責處理入口(http)請求,有點像之前提到的 API 網關。路由器將新功能請求發送給新開發的服務,而將傳統請求還發給單體式應用。

另外一個是膠水代碼(glue code),將微服務和單體應用集成起來,微服務很少能獨立存在,經常會訪問單體應用的數據。膠水代碼,可能在單體應用或者為服務或者二者兼而有之,負責數據整合。微服務通過膠水代碼從單體應用中讀寫數據。

微服務有三種方式訪問單體應用數據:

  • 換氣單體應用提供的遠程 API
  • 直接訪問單體應用數據庫
  • 自己維護一份從單體應用中同步的數據

膠水代碼也被稱為容灾層(anti-corruption layer),這是因為膠水代碼保護微服務全新域模型免受傳統單體應用域模型污染。膠水代碼在這兩種模型間提供翻譯功能。術語 anti-corruption layer 第一次出現在 Eric Evans 撰寫的必讀書 Domain Driven Design,隨後就被提煉為一篇白皮書。開發容灾層可能有點不是很重要,但卻是避免單體式泥潭的必要部分。

將新功能以輕量級微服務方式實現由很多優點,例如可以阻止單體應用變的更加無法管理。微服務本身可以開發、部署和獨立擴展。采用微服務架構會給開發者帶來不同的切身感受。

然而,這方法並不解决任何單體式本身問題,為了解决單體式本身問題必須深入單體應用做出改變。我們來看看這麼做的策略。

策略 2——將前端和後端分離

减小單體式應用複雜度的策略是講錶現層和業務邏輯、數據訪問層分開。典型的企業應用至少有三個不同元素構成:

  1. 錶現層——處理 HTTP 請求,要麼響應一個 RESTAPI 請求,要麼是提供一個基於 HTML 的圖形接口。對於一個複雜用戶接口應用,錶現層經常是代碼重要的部分。

  2. 業務邏輯層——完成業務邏輯的應用核心。

  3. 數據訪問層——訪問基礎元素,例如數據庫和消息代理。

在錶現層與業務數據訪問層之間有清晰的隔離。業務層有由若幹方面組成的粗粒度(coarse-grained)的 API,內部包含了業務邏輯元素。API 是可以將單體業務分割成兩個更小應用的天然邊界,其中一個應用是錶現層,另外一個是業務和數據訪問邏輯。分割後,錶現邏輯應用遠程調用業務邏輯應用,下圖錶示遷移前後架構不同:

別再說你不會JVM性能監控和調優了,2021華為Java高級面試題及答案,_Java_02

單體應用這麼分割有兩個好處,其一使得應用兩部分開發、部署和擴展各自獨立,特別地,允許錶現層開發者在用戶界面上快速選擇,進行 A/B 測試;其二,使得一些遠程 API 可以被微服務調用。

然而,這種策略只是部分的解决方案。很可能應用的兩部分之一或者全部都是不可管理的,因此需要使用第三種策略來消除剩餘的單體架構。

策略 3——抽出服務

第三種遷移策略就是從單體應用中抽取出某些模塊成為獨立微服務。每當抽取一個模塊變成微服務,單體應用就變簡單一些;一旦轉換足够多的模塊,單體應用本身已經不成為問題了,要麼消失了,要麼簡單到成為一個服務。

排序那個模塊應該被轉成微服務

一個巨大的複雜單體應用由成十上百個模塊構成,每個都是被抽取對象。决定第一個被抽取模塊一般都是挑戰,一般最好是從最容易抽取的模塊開始,這會讓開發者積累足够經驗,這些經驗可以為後續模塊化工作帶來巨大好處。

轉換模塊成為微服務一般很耗費時間,一般可以根據獲益程度來排序,一般從經常變化模塊開始會獲益最大。一旦轉換一個模塊為微服務,就可以將其開發部署成獨立模塊,從而加速開發進程。

將資源消耗大戶先抽取出來也是排序標准之一。例如,將內存數據庫抽取出來成為一個微服務會非常有用,可以將其部署在大內存主機上。同樣的,將對計算資源很敏感的算法應用抽取出來也是非常有益的,這種服務可以被部署在有很多 CPU 的主機上。通過將資源消耗模塊轉換成微服務,可以使得應用易於擴展。

查找現有粗粒度邊界來决定哪個模塊應該被抽取,也是很有益的,這使得移植工作更容易和簡單。例如,只與其他應用异步同步消息的模塊就是一個明顯邊界,可以很簡單容易地將其轉換為微服務。

如何抽取模塊

抽取模塊第一步就是定義好模塊和單體應用之間粗粒度接口,由於單體應用需要微服務的數據,反之亦然,因此更像是一個雙向 API。因為必須在負責依賴關系和細粒度接口模式之間做好平衡,因此開發這種 API 很有挑戰性,尤其對使用域模型模式的業務邏輯層來說更具有挑戰,因此經常需要改變代碼來解决依賴性問題,如圖所示:

一旦完成粗粒度接口,也就將此模塊轉換成獨立微服務。為了實現,必須寫代碼使得單體應用和微服務之間通過使用進程間通信(IPC)機制的 API 來交換信息。如圖所示遷移前後對比:

別再說你不會JVM性能監控和調優了,2021華為Java高級面試題及答案,_程序員_03

此例中,正在使用 Y 模塊的 Z 模塊是備選抽取模塊,其元素正在被 X 模塊使用,遷移第一步就是定義一套粗粒度 APIs,第一個接口應該是被 X 模塊使用的內部接口,用於激活 Z 模塊;第二個接口是被 Z 模塊使用的外部接口,用於激活 Y 模塊。

遷移第二步就是將模塊轉換成獨立服務。內部和外部接口都使用基於 IPC 機制的代碼,一般都會將 Z 模塊整合成一個微服務基礎框架,來出來割接過程中的問題,例如服務發現。

抽取完模塊,也就可以開發、部署和擴展另外一個服務,此服務獨立於單體應用和其它服務。可以從頭寫代碼實現服務;這種情况下,將服務和單體應用整合的 API 代碼成為容灾層,在兩種域模型之間進行翻譯工作。每抽取一個服務,就朝著微服務方向前進一步。隨著時間推移,單體應用將會越來越簡單,用戶就可以增加更多獨立的微服務。 將現有應用遷移成微服務架構的現代化應用,不應該通過從頭重寫代碼方式實現,相反,應該通過逐步遷移的方式。有三種策略可以考慮:將新功能以微服務方式實現;將錶現層與業務數據訪問層分離;將現存模塊抽取變成微服務。隨著時間推移,微服務數量會增加,開發團隊的彈性和效率將會大大增加。

最後

Java架構學習技術內容包含有:Spring,Dubbo,MyBatis, RPC, 源碼分析,高並發、高性能、分布式,性能優化,微服務 高級架構開發等等。

 CodeChina開源項目:【一線大廠Java面試題解析+核心總結學習筆記+最新講解視頻】

還有Java核心知識點+全套架構師學習資料和視頻+一線大廠面試寶典+面試簡曆模板可以領取+阿裏美團網易騰訊小米愛奇藝快手嗶哩嗶哩面試題+Spring源碼合集+Java架構實戰電子書+2021年最新大廠面試題。
別再說你不會JVM性能監控和調優了,2021華為Java高級面試題及答案,_Java_04

版权声明
本文为[程序小茉莉]所创,转载请带上原文链接,感谢
https://javamana.com/2021/09/20210915060755585b.html

  1. Vous apprendrez à construire un serveur d'applet Wechat (https) à la main
  2. 作为一名程序员我不忘初心,Java最新实习面试经验总结,
  3. 作为一名Java面试者你应该知道的,2021最新Java常用开源库总结,
  4. 作为一个程序员,你觉得最大的悲哀是什么,2021年大厂Java岗面试必问,
  5. Configuration de l'environnement Java du système win10
  6. 作為一個程序員,你覺得最大的悲哀是什麼,2021年大廠Java崗面試必問,
  7. En tant que programmeur, quelle est la plus grande tristesse que vous ressentez? L'entrevue d'emploi Java de 2021 dans une grande usine vous demandera:
  8. Comme vous devriez le savoir en tant qu'intervieweur Java, 2021 dernier résumé des bibliothèques open source couramment utilisées pour Java,
  9. En tant que programmeur, je n'oublie pas le dernier résumé de mon expérience d'entrevue de stage en Java.
  10. 作為一名Java面試者你應該知道的,2021最新Java常用開源庫總結,
  11. New feature of Java 8. Stream (). Map (general programming method: collect. Groupingby)
  12. Computer graduation project java + SSM hospital registration system
  13. 作為一名程序員我不忘初心,Java最新實習面試經驗總結,
  14. 使用Docker部署Spring-Boot项目,论程序员成长的正确姿势,
  15. Conseils pour améliorer l'efficacité du Code Java mille fois
  16. 全网首发,我在华为做Java外包的真实经历!
  17. 全套Java视频百度云,终于找到一个看得懂的JVM内存模型了,
  18. 入职3个月的Java程序员面临转正,字节跳动 京东 360 网易面试题整理,
  19. Docker tutorial series (I) introduction to docker tutorial spring cloud mybatis distributed microservice Cloud Architecture
  20. 全網首發,我在華為做Java外包的真實經曆!
  21. Lancement de l'ensemble du réseau, je fais l'expérience réelle de l'externalisation Java à Huawei!
  22. Run around with money? Li Weijia fell into the storm of endorsement! In the face of collective hot discussion, personal attitude has become the focus of attention
  23. 全套Java視頻百度雲,終於找到一個看得懂的JVM內存模型了,
  24. Un ensemble complet de vidéos Java Baidu Cloud a finalement trouvé un modèle de mémoire JVM compréhensible.
  25. Déployez le projet Spring Boot avec docker, et parlez de la bonne posture pour que les programmeurs grandissent.
  26. 关于网络优化你必须要知道的重点,GC 堆排 Tomcat 算法题,
  27. 关于电商秒杀系统中防超卖处理方案简述,Java开发热门前沿知识,
  28. Les programmeurs Java qui sont entrés dans l'entreprise pendant trois mois ont dû faire face à une correction d'échelle, et les octets ont sauté dans le traitement des questions d'entrevue de JD 360 Netease.
  29. What is the new syntax of XX ≠ null in Java?
  30. Spring scheduled task cron expression (@ scheduled)
  31. Une brève description du plan de traitement anti - surproduction dans le système d'arrêt du commerce électronique et les connaissances de pointe du développement Java.
  32. Ce que vous devez savoir sur l'optimisation du réseau, c'est que le problème de l'algorithme Tomcat de gerbage GC,
  33. 凭借这份Java面试题集,成体系化的神级Java进阶笔记,
  34. 凭借这份Java面试题集,BAT大厂面试基础题集合,
  35. Docker Knowledge point collation
  36. Redis sur la réalisation élégante des tâches retardées
  37. 憑借這份Java面試題集,BAT大廠面試基礎題集合,
  38. Avec cet ensemble de questions d'entrevue Java, l'ensemble de questions de base d'entrevue de bat,
  39. Avec cet ensemble de questions d'entrevue Java, les notes avancées Java de niveau divin sont systématisées,
  40. Opérateurs arithmétiques et opérateurs de comparaison pour JavaScript, Introduction classique au développement web
  41. MySQL + +: slow query log analysis (I)
  42. Android Architect path 21 Responsive Programming RX Java thread transformation Principles
  43. Explorer le cadre open source Android - 1. Okhttp Source Analysis
  44. 分布式宝典:限流 缓存 通讯,Java开发中常见的一些问题面试专题,
  45. 分享面试经历的网站,腾讯大牛教你自己写Java框架!
  46. Expliquer les six principes de base du modèle de conception par des exemples réels
  47. Site Web pour partager vos expériences d'entrevue, Tencent Bull vous apprend à écrire votre propre cadre Java!
  48. Dictionnaire distribué: communication de cache limitée par le courant, sujets d'entrevue pour certaines questions courantes dans le développement Java,
  49. Another uncle circle man is angry! The high-quality acting skills make people admire and achieve the highlight of the ending of spring in Jade House
  50. 10. MySQL database import, export and authorization
  51. 9. MySQL data query
  52. 8. MySQL data operation DML
  53. 7. MySQL database table engine and character set
  54. 分享面試經曆的網站,騰訊大牛教你自己寫Java框架!
  55. Les points de connaissance de Java Real - time Video Download, Byte Jumping Java R & D post ont été divulgués à l'intérieur.
  56. Introduction au JavaScript chapitre 15 (objets, clairvoyance)
  57. 前方高能,Java程序员最大的悲哀是什么?
  58. Tencent private cloud MySQL solution tdsql
  59. 前方高能,Java程序員最大的悲哀是什麼?
  60. Quelle est la plus grande tristesse des programmeurs Java à l'avenir?