《分佈式系統原理與範型》定義:前端
「分佈式系統是若干獨立計算機的集合,這些計算機對於用戶來講就像單個相關係統」java
分佈式系統(distributed system)是創建在網絡之上的軟件系統。nginx
隨着互聯網的發展,網站應用的規模不斷擴大,常規的垂直應用架構已沒法應對,分佈式服務架構以及流動計算架構勢在必行,亟需一個治理系統確保架構有條不紊的演進。git
當網站流量很小時,只需一個應用,將全部功能都部署在一塊兒,以減小部署節點和成本。此時,用於簡化增刪改查工做量的數據訪問框架(ORM)是關鍵。程序員
適用於小型網站,小型管理系統,將全部功能都部署到一個功能裏,簡單易用。github
缺點: 算法
當訪問量逐漸增大,單一應用增長機器帶來的加速度愈來愈小,將應用拆成互不相干的幾個應用,以提高效率。此時,用於加速前端頁面開發的Web框架(MVC)是關鍵。spring
經過切分業務來實現各個模塊獨立部署,下降了維護和部署的難度,團隊各司其職更易管理,性能擴展也更方便,更有針對性。數據庫
缺點: 公用模塊沒法重複利用,開發性的浪費apache
當垂直應用愈來愈多,應用之間交互不可避免,將核心業務抽取出來,做爲獨立的服務,逐漸造成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。此時,用於提升業務複用及整合的分佈式服務框架(RPC)是關鍵。
當服務愈來愈多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增長一個調度中心基於訪問壓力實時管理集羣容量,提升集羣利用率。此時,用於提升機器利用率的資源調度和治理中心(SOA)[ Service Oriented Architecture]是關鍵。
RPC【Remote Procedure Call】是指遠程過程調用,是一種進程間通訊方式,他是一種技術的思想,而不是規範。它容許程序調用另外一個地址空間(一般是共享網絡的另外一臺機器上)的過程或函數,而不用程序員顯式編碼這個遠程調用的細節。即程序員不管是調用本地的仍是遠程的函數,本質上編寫的調用代碼基本相同。
其實在本人spring cloud模塊已經介紹過,下面再經過一個示例更好的解釋啥是rpc:
client須要調用server,按照傳統的寫法以下:
client端:
public xxx call() { http.post("server的服務地址", param); }
這樣寫會讓client與server綁定起來,好比生產環境中,server有n臺服務器集羣部署,固然可能會經過nginx去作負載均衡,使得client調用server的地址是同一個,可是耦合性很是高,基於rpc的設計方案,在client端放一個client-stub,在server端放一個server-stub,
當client須要從server端獲取數據時,調用步驟以下:
這麼作有啥好處?
不管之後server端作啥調整,client均可以保持不變,除非連client-stub也須要改動,client就跟調用本地方法同樣,下降耦合。而且從上述過程也能夠得出一個結論:RPC兩個核心模塊-----通信,序列化。
Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高性能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向接口的遠程方法調用,智能容錯和負載均衡,以及服務自動註冊和發現。
服務提供者(Provider):暴露服務的服務提供方,服務提供者在啓動時,向註冊中心註冊本身提供的服務。
服務消費者(Consumer): 調用遠程服務的服務消費方,服務消費者在啓動時,向註冊中心訂閱本身所需的服務,服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,若是調用失敗,再選另外一臺調用。
註冊中心(Registry):註冊中心返回服務提供者地址列表給消費者,若是有變動,註冊中心將基於長鏈接推送變動數據給消費者
監控中心(Monitor):服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心
調用關係說明
Zookeeper是 Apacahe Hadoop 的子項目,是一個樹型的目錄服務,支持變動推送,適合做爲 Dubbo 服務的註冊中心,工業強度較高,可用於生產環境,並推薦使用。
流程說明:
/dubbo/com.foo.BarService/providers
目錄下寫入本身的 URL 地址/dubbo/com.foo.BarService/providers
目錄下的提供者 URL 地址。並向 /dubbo/com.foo.BarService/consumers
目錄下寫入本身的 URL 地址/dubbo/com.foo.BarService
目錄下的全部提供者和消費者 URL 地址。支持如下功能:
<dubbo:registry check="false" />
時,記錄失敗註冊和訂閱請求,後臺定時重試<dubbo:registry username="admin" password="1234" />
設置 zookeeper 登陸信息<dubbo:registry group="dubbo" />
設置 zookeeper 的根節點,不設置將使用無根樹*
號通配符 <dubbo:reference group="*" version="*" />
,可訂閱服務的全部分組和全部版本的提供者在dubbo官網上,推薦使用zookeeper做爲註冊中心,下載地址:https://archive.apache.org/dist/zookeeper/zookeeper-3.4.13/
下載完成後須要注意一個問題,就是要將zoo_sample.cfg更改成zoo.cfg,不然啓動會報錯,說找不到zoo.cfg
zoo.cfg
#心跳基本時間單位,毫秒級,ZK基本上全部的時間都是這個時間的整數倍 tickTime=2000 #集羣中的follower服務器(F)與leader服務器(L)之間初始鏈接時能容忍的最多心跳數 initLimit=10 #集羣中的follower服務器與leader服務器之間請求和應答之間能容忍的最多心跳數 syncLimit=5 #內存數據庫快照存放地址,若是沒有指定事務日誌存放地址(dataLogDir),默認也是存放在這個 路徑 下,建議兩個地址分開存放到不一樣的設備上。 dataDir=E:/utils/zookeeper/zookeeper-3.4.12/data #指定端口 clientPort=2181
啓動效果以下:
啓動客戶端
效果以下:
而後作以下操做:
ls /:列出zookeeper根下保存的全部節點
create –e /taoyong 123:建立一個taoyong臨時節點,值爲123
get /taoyong:獲取/taoyong節點的值
結果以下:
[zk: localhost:2181(CONNECTED) 0] ls / [zookeeper] [zk: localhost:2181(CONNECTED) 1] create -e /taoyong 123 Created /taoyong [zk: localhost:2181(CONNECTED) 2] get /taoyong 123 cZxid = 0x4 ctime = Wed Jun 05 23:01:24 CST 2019 mZxid = 0x4 mtime = Wed Jun 05 23:01:24 CST 2019 pZxid = 0x4 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x100112bcb910000 dataLength = 3 numChildren = 0 [zk: localhost:2181(CONNECTED) 3]
後面對zookeeper,這裏只要知道zookeeper有各類節點便可。
dubbo自己並非一個服務軟件。它其實就是一個jar包可以幫你的java程序鏈接到zookeeper,並利用zookeeper消費、提供服務。因此你不用在Linux上啓動什麼dubbo服務。可是爲了讓用戶更好的管理監控衆多的dubbo服務,官方提供了一個可視化的監控程序,不過這個監控即便不裝也不影響使用。
下載地址:https://github.com/apache/incubator-dubbo-ops
進入dubbo-admin中,找到application.properties,打開
server.port=7001 spring.velocity.cache=false spring.velocity.charset=UTF-8 spring.velocity.layout-url=/templates/default.vm spring.messages.fallback-to-system-locale=false spring.messages.basename=i18n/message spring.root.password=root spring.guest.password=root dubbo.registry.address=zookeeper://127.0.0.1:2181
注意最後一行便可,只要zookeeper的地址正確就好(由於咱們是本地搭的zookeeper),用戶名密碼本身設置,不過用戶名貌似只能是root或guest。
打開,而後輸入
mvn clean package
打好包以後運行
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
當項目啓動以後,打開瀏覽器訪問
http://你機器的ip:7001/
啓動端口能夠在項目啓動日誌裏面看(springboot的項目)。而後根據本身設置的用戶名密碼登陸進去:
注意:在運行dubbo-admin以前,必定要打開zookeeper服務。