1. 程式人生 > >深入理解Java SOA 架構Dubbo系列—— 第一回 結緣

深入理解Java SOA 架構Dubbo系列—— 第一回 結緣

一年半以前,我在一家創業公司從事伺服器端開發工作,雖然當時公司已經拿到了6000w的A輪融資,並且App已經有超過百萬的日活,開發團隊已經有10幾個人。但是看一眼伺服器的程式碼,卻感覺和筆者本科時候做的“學生管理”系統沒什麼兩樣。所有的伺服器程式碼,都在一個JavaWeb工程裡,然後被打包成War,使用Tomcat部署。為了應對增長的活躍使用者,使用Haproxy做了負載均衡,同樣的war包會在5-10臺左右的高效能機器上部署,感覺應對當時的日活並沒有太大問題。

當時公司的業務分大概幾個模組:
1. 一個是廣告分發業務,使用者會定期收到推過來的廣告,當然有一些複雜的機制來決定使用者看到什麼廣告。
2. 積分系統,使用者通過瀏覽廣告,可以賺取積分。
3. 商場系統,使用者可以用積分換取商場裡的物品。

雖然業務聽起來不是很多,但是因為業務模式比較複雜,程式碼也是極為龐大,而所有的一切都在一個工程中。雖然程式碼也是按照Controller, Service,DAO這樣橫向拆分,也按照Package做了很好的分割。但是依然維護和繼續開發這一坨東西,讓我日漸有一種忍無可忍的感覺。

1. 從開發角度說,面對這麼一坨龐大的程式碼,維護成本和新人學習成本都是特別高的。
2. 程式碼保護性很差,如果公司來了一個實習生,我不想讓他看到所有程式碼,但是又想讓他做一些相關的功能,都幾乎不太可能。
3. 程式碼構建的時間越來越長,每一個小小的改動,都會觸發所有程式碼的構建,程式設計師如此貴的今天,如果讓老闆知道,肯定眼淚掉下來。
4. 釋出成本也很高,先不說龐大的war包重啟需要更長時間,每次一個小改動就要重新部署所有功能,也是非常頭疼的事情。因為有些核心功能,需要全天服務使用者,所以白天幾乎不可能重啟服務。而釋出一個無關緊要的功能,也要守候到凌晨,真是覺得這個世界充滿惡意。
5. 即使可以通過 LBS 增強伺服器響應,但是確完全不能根據不同的業務做擴容,每次增加機器都要考慮整個War的感受,額外提高的裝置成本。

經過大量調查和探索,我們走上了微服務架構這條路。

簡而言之,微服務架構就是按照業務,將服務拆分到不同的程式(程序),單獨部署,釋出。
可以看圖,曾經的架構-單塊架構,可以這樣理解:

所有的程式都是在一個war包中,是一個單獨的程序。
而微服務則可以表現為:


其中每個Service可以理解成針對不同的業務做的拆分,每個 Service 單獨部署,執行為獨立的程式。

在我們當時的系統中,就把整個系統拆分成,廣告服務,商城服務,積分服務,賬號服務。 而和App做互動的部分-對應圖中的WebUI,這個工程是一個 Java Web 工程,打包成 war 用來處理 App 請求。
實際中,我們的部署要遠遠比圖中所畫複雜,部署服務的機器超過6臺,每臺伺服器執行2-3個服務,而這些服務通過註冊中心註冊自己的存在,服務消費者(consumer, 圖中的web ui)可以發現並呼叫這些服務。當某些服務,訪問日漸變多(例如商城最近生意越來越好),我們可以直接增加機器,多部署一些商城服務,就可以直接提高系統的處理能力。

那標題裡的Dubbo到底在哪,根據上面筆者的描述,你會發現,部署成微服務需要額外的通訊手段,連線服務提供者,和服務消費者。在單塊架構中,服務的呼叫是通過程式呼叫。而在微服務架構中,呼叫是通過Http請求的方式來執行程式呼叫。那麼問題來了,對於服務消費者,如何發現服務的存在,如何呼叫服務,呼叫服務的協議如何規定,沒有得到返回如何重試。 這就是Dubbo所解決的問題,也是她可以作為框架的原因。

當這套方案Work以後,我們覺得很興奮,架構的升級後,帶來的效果還是立竿見影的。當然也在實踐中遇到額外問題,例如mybatis本地快取在不同服務的不一致問題,處理資料一致性需要的額外代價等問題,後面我會一一探討採用微服務遇到的問題和我們的解決方案。

長篇大論的介紹微服務的優勢,並不是本系列文章的目的,因為這樣的文章很多。筆者更希望提供一些可實施的乾貨,無論從理論基礎,還是從實踐部署中,遠離群眾的空談,我覺得不適合我寫系列文章的目的。在這系列的文章裡,我會呈現下面的內容:

1. 首先會給出一份真實的程式碼,搭建出一份基於本地呼叫的Dubbo微服務框架。
2. 使用Zookeeper,使程式支援註冊中心,支援熱拓展。搭建Dubbo monitor,讓你更直觀的理解所有服務,消費者的關係。
你會發現用了這套方案,你可以瞬間提高你的伺服器對併發對處理能力。
3. 從整體架構上,理解Dobbo。
4. 閱讀程式碼,研究Dubbo 服務提供者(Provider)的實現原理
5. 閱讀程式碼,研究Dubbo 服務消費者(Consumer)的實現原理

當然,這是規劃的最核心內容,也可能呈現更多內容!
傳送門:http://sunrising.me/?p=111

相關推薦

深入理解Java SOA 架構Dubbo系列—— 第一 結緣

一年半以前,我在一家創業公司從事伺服器端開發工作,雖然當時公司已經拿到了6000w的A輪融資,並且App已經有超過百萬的日活,開發團隊已經有10幾個人。但是看一眼伺服器的程式碼,卻感覺和筆者本科時候做的“學生管理”系統沒什麼兩樣。所有的伺服器程式碼,都在一個JavaWeb

深入理解Java集合框架》系列文章

stack 數據結構 tro www. rpe ack 不能 一個 標準 https://www.cnblogs.com/CarpenterLee/p/5545987.html Introduction 關於C++標準模板庫(Standard Template Libr

深入理解javascript選擇器API系列第一篇——4種元素選擇器

前面的話   說到最常見的DOM應用,恐怕就要數取得特定的某個或某組元素的引用了。DOM定義了許多方式來選取元素,包括getElementById()、getElementsByTagName()、getElementsByName()和document.all4種。接下來,將對這4種方法進行詳細介紹

(重點)深入理解Java分散式架構

什麼是分散式架構 分散式系統(distributed system)是建立在網路之上的軟體系統。 內聚性是指每一個數據庫分佈節點高度自治,有本地的資料庫管理系統。 透明性是指每一個數據庫分佈節點對使用者的應用來說都是透明的,看不出是本地還是遠端。 在分散式資料庫系統中,使用者感覺不到資料是分佈的,即使用者

深入理解Java記憶體模型之系列

確保對記憶體的讀-改-寫操作原子執行。在Pentium及Pentium之前的處理器中,帶有lock字首的指令在執行期間會鎖住匯流排,使得其他處理器暫時無法通過匯流排訪問記憶體。很顯然,這會帶來昂貴的開銷。從Pentium 4,Intel Xeon及P6處理器開始,intel在原有匯流排鎖的基礎上做了一個很有意

深入理解Java併發框架AQS系列(三):獨佔鎖(Exclusive Lock)

[深入理解Java併發框架AQS系列(一):執行緒](https://www.cnblogs.com/xijiu/p/14396061.html) [深入理解Java併發框架AQS系列(二):AQS框架簡介及鎖概念](https://www.cnblogs.com/xijiu/p/14522224.html)

深入理解JAVA集合系列四:ArrayList源碼解讀

結束 了解 數組下標 size new 數組元素 開始 ini rem 在開始本章內容之前,這裏先簡單介紹下List的相關內容。 List的簡單介紹 有序的collection,用戶可以對列表中每個元素的插入位置進行精確的控制。用戶可以根據元素的整數索引(在列表中的位置)訪

深入理解JAVA集合系列三:HashMap的死循環解讀

現在 最新 star and 場景 所有 image cap 時也 由於在公司項目中偶爾會遇到HashMap死循環造成CPU100%,重啟後問題消失,隔一段時間又會反復出現。今天在這裏來仔細剖析下多線程情況下HashMap所帶來的問題: 1、多線程put操作後,get操作導

深入理解JAVA I/O系列三:字符流詳解

buffer 情況 二進制文件 感到 復制代碼 使用範圍 轉換 fileread 方式 字符流為何存在 既然字節流提供了能夠處理任何類型的輸入/輸出操作的功能,那為什麽還要存在字符流呢?容我慢慢道來,字節流不能直接操作Unicode字符,因為一個字符有兩個字節,字節流一次只

java內存模型(二)深入理解java內存模型的系列好文

總結 nal href ola down 深入理解 ati markdown vol 深入理解java內存模型(一)——基礎深入理解java內存模型(二)——重排序深入理解java內存模型(三)——順序一致性深入理解java內存模型(四)——volatile深入理解java

分散式系統的架構思路 深入理解java:5. Java分散式架構

原文來源:https://www.cnblogs.com/chulung/p/5653135.html 一、前言 在計算機領域,當單機效能達到瓶頸時,有兩種方式可以解決效能問題,一是堆硬體,進一步提升配置,二是分散式,水平擴充套件。當然,兩者都是一樣的燒錢。今天聊聊我所理解的分散式系統的架構思路。

深入理解Java函數語言程式設計》系列文章

Introduction 本系列文將幫助你理解Java函數語言程式設計的用法、原理。 Java 8已經發行兩年多,但很多人仍然在使用JDK7。對企業來說,技術上謹慎未必是壞事,但對個人學習而言,不去學習新技術就很可能被技術拋棄。Java 8一個重要的變更是引入函數語言程式設計和Lambda表示式(lambd

深入理解Java的Annotation系列-第四部分 註解的應用-使用註解實現許可權管理

一、整體思路 1、先自定義一個用於許可權管理的註解 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Authority {      String modu

深入理解java虛擬機器系列(一):java記憶體區域與記憶體溢位異常

文章主要是閱讀《深入理解java虛擬機器:JVM高階特性與最佳實踐》第二章:Java記憶體區域與記憶體溢位異常 的一些筆記以及概括。 好了開始。如果有什麼錯誤或者遺漏,歡迎指出。 一、概述 先上一張圖 這張圖主要列出了Java虛擬機器管理的記憶體的幾個區域。 常有人

深入理解Java虛擬機器系列——JVM的GC理論詳解

GC的概念    GC:Garbage Collection 垃圾收集。這裡所謂的垃圾指的是在系統執行過程當中所產生的一些無用的物件,這些物件佔據著一定的記憶體空間,如果長期不被釋放,可能導致OOM(堆溢位)。記憶體區域中的程式計數器、虛擬機器棧、本地方法棧這3個區域隨著執行

深入理解Java的Annotation系列-第五部分 使用註解編寫ORM框架

一、什麼是ORM? 物件關係對映(英語:(Object Relational Mapping,簡稱ORM,或O/RM,或O/Rmapping),是一種程式技術,隨著面向物件的發展而產生的。用來把物件模型表示的物件對映到基於S Q L 的關係模型資料庫結構中去,或者把表中的

夯實Java基礎系列10:深入理解Java中的異常體系

目錄 為什麼要使用異常 異常基本定義 異常體系 初識異常 異常和錯誤 異常的處理方式 "不負責任"的throws 糾結的finally throw : JRE也使用的關鍵字 異常呼叫鏈 自定義異常 異常的注意事項 當finally遇上return JAVA異常常見面試題 參考文章 微信公眾號 Java技術

夯實Java基礎系列11:深入理解Java中的撥機制

目錄 模組間的呼叫 多執行緒中的“回撥” Java回撥機制實戰 例項一 : 同步呼叫 例項二:由淺入深 例項三:Tom做題 參考文章

夯實Java基礎系列12:深入理解Java中的反射機制

本系列文章將整理到我在GitHub上的《Java面試指南》倉庫,更多精彩內容請到我的倉庫裡檢視 https://github.com/h2pl/Java-Tutorial 喜歡的話麻煩點下Star哈 文章首發於我的個人部落格: www.how2playlife.com 列舉(enum)型別是Java

深入理解java虛擬機器系列初篇(一):為什麼要學習JVM?

前言 本來想著關於寫JVM這個專欄,直接寫知識點乾貨的,但是想著還是有必要開篇講一下為什麼要學習JVM,這樣的話讓一些學習者心裡有點底的感覺比較好... 原因一:面試 不得不說,隨著網際網路門檻越來越高,JVM知識也是中高階程式設計師階段必問的一個話題!現在不像以前了,以前會點html都好找工作,現在由於學習