在本章節你能夠學習到:前端
分佈式系統(distributed system)是創建在網絡之上的軟件系統。正是由於軟件的特性,因此分佈式系統具備高度的內聚性和透明性。所以,網絡和分佈式系統之間的區別更多的在於高層軟件(特別是操做系統),而不是硬件。java
在分佈式系統中,國內經常使用zookeeper+dubbo組合,而Spring Boot推薦使用全棧的Spring,Spring Boot+Spring Cloud。linux
分佈式系統能夠用下圖直觀的表示git
分佈式系統是若干獨立計算機的集合,這計算機對用戶來講就像單個相關係統。github
當網站流量很小時,只需一個應用,將全部功能都部署在一塊兒,以減小部署節點和成本。此時,用於簡化增刪改查工做量的數據訪問框架(ORM)是關鍵。web
當訪問量逐漸增大,單一應用增長機器帶來的加速度愈來愈小,將應用拆成互不相干的幾個應用,以提高效率。此時,用於加速前端頁面開發的Web框架(MVC)是關鍵。spring
當垂直應用愈來愈多,應用之間交互不可避免,將核心業務抽取出來,做爲獨立的服務,逐漸造成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。此時,用於提升業務複用及整合的分佈式服務框架(RPC)是關鍵。docker
當服務愈來愈多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增長一個調度中心基於訪問壓力實時管理集羣容量,提升集羣利用率。此時,用於提升機器利用率的資源調度和治理中心(SOA)是關鍵。apache
ZooKeeper 是一個分佈式的,開放源碼的分佈式應用程序協調服務。它是一個爲分佈式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分佈式同步、組服務等。服務器
Dubbo是Alibaba開源的分佈式服務框架,它最大的特色是按照分層的方式來架構,使用這種方式可使各個層之間解耦合(或者最大限度地鬆耦合)。從服務模型的角度來看,Dubbo採用的是一種很是簡單的模型,要麼是提供方提供服務,要麼是消費方消費服務,因此基於這一點能夠抽象出服務提供方(Provider)和服務消費方(Consumer)兩個角色。
docker pull zookeeper
docker run --name zk01 -p 2181:2181 --restart always -d d6f23d89fbee
d6f23d89fbee是zookeeper的鏡像ID,經過docker images查看你本身的鏡像id。
註冊應用的過程大體以下:
<dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.12.0</version> </dependency> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.2.1-SNAPSHOT</version> </dependency> <dependency> <groupId>com.zhaoyi</groupId> <artifactId>provider-ticket</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <!-- Dubbo --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.5</version> </dependency> <!-- Spring Context Extras --> <dependency> <groupId>com.alibaba.spring</groupId> <artifactId>spring-context-support</artifactId> <version>1.0.2</version> </dependency> <!-- https://mvnrepository.com/artifact/com.101tec/zkclient --> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency>
注意,zkclient請根據zookeeper版本進行適配,當前有0.11版本,但我使用以後常常會出現鏈接中斷的狀況,即
connnectionLoss
,若是您也遇到相似的問題,不妨換0.10版本的zkclient.
curator-framework是高版本的dubbo須要的一個依賴。
# 當前應用的名字 dubbo.application.name=provider-ticket # 註冊中心的地址 dubbo.registry.address=zookeeper://10.21.1.47:2181 # 哪一個包 dubbo.scan.base-packages=com.zhaoyi.providerticket.service
dubbo也提供了默認的註冊服務,咱們這樣作會覆蓋到默認的服務,詳情參考github官方文檔。
// 接口類 package com.zhaoyi.providerticket.service; public interface TicketService { public String getTicket(); }
// 服務類 package com.zhaoyi.providerticket.service; import com.alibaba.dubbo.config.annotation.Service; import org.springframework.stereotype.Component; @Service @Component // 將服務發佈出去 public class TicketServiceImpl implements TicketService { @Override public String getTicket(){ return "《sword art online!》"; } }
注意此處的
@service
是dubbo包的註解,而不是spring的。
<dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.12.0</version> </dependency> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.2.1-SNAPSHOT</version> </dependency> <dependency> <groupId>com.zhaoyi</groupId> <artifactId>provider-ticket</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <!-- Dubbo --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.5</version> </dependency> <!-- Spring Context Extras --> <dependency> <groupId>com.alibaba.spring</groupId> <artifactId>spring-context-support</artifactId> <version>1.0.2</version> </dependency> <!-- https://mvnrepository.com/artifact/com.101tec/zkclient --> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency> <!-- 引入服務類座標 --> <dependency> <groupId>com.zhaoyi</groupId> <artifactId>provider-ticket</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
相信您學過maven 的相關知識,這兩個模塊的公共部分你也能夠抽取到parent中編寫。
這裏,咱們引入provider的座標,這樣就能夠直接使用其服務類提供的便利了。
dubbo.application.name=consumer-user dubbo.registry.address=zookeeper://10.21.1.47:2181
package com.zhaoyi.consumeruser.service; import com.alibaba.dubbo.config.annotation.Reference; import com.zhaoyi.providerticket.service.TicketService; import org.springframework.stereotype.Service; @Service public class UserService { @Reference TicketService ticketService; public String buy(){ return ticketService.getTicket(); } }
Reference不作任何配置的狀況下,引用的是對應類路徑下的服務信息。
接下來咱們編寫一個controller,可視化咱們的服務返回結果
package com.zhaoyi.consumeruser.controller; import com.zhaoyi.consumeruser.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @Autowired UserService userService; @GetMapping("/") public String a(){ return userService.buy(); } }
啓動消費者服務,請確保provicer項目目前處於運行狀態,訪問首頁,咱們即可以看到返回
《sword art online!》
註冊成功!
不少狀況下,咱們須要查看咱們提供的服務到底有哪些。好比在以前的測試用例中,除了經過查看控制檯日誌,咱們根本沒法獲知註冊中心是否已經知曉或者正確的註冊了provicer提供的服務。
顯然須要一個可視化服務讓咱們能夠直觀的看到具體的服務信息是什麼、怎麼調用以及其調用日誌等等。
市面上仍是提供了很多的相關開源服務,咱們來看看最簡單易用的zkclient。
安裝zkclient很簡單,他其實就是一個監聽zookeeper服務端口的一個網站項目。下面列出linux的安裝步驟,在執行安裝以前,確保你的Linux服務器上安裝了git以及maven服務。
git clone https://github.com/DeemOpen/zkui.git
mvn clean install
cp config.cfg target/
vi config.cfg
nohup java -jar zkui-2.0-SNAPSHOT-jar-with-dependencies.jar > /dev/null &
相比較dubbo-admin,zkclient作的就比較簡陋了。dubbo-admin在dubbo 2.6版本之後再也不支持,當前已經更名爲Dubbo ops。
Dubbo ops應該是dubbo-admin的後浪項目,咱們來看看其安裝方式。
git clone https://github.com/apache/incubator-dubbo-ops.git
mvn clean install
該項目須要maven 3.1以上才能夠編譯成功。
mvn --projects dubbo-admin-backend spring-boot:run