【Spring Boot】26.分佈式

簡介

在本章節你能夠學習到:前端

  1. dubbo和zookeeper的基本特性
  2. 一個簡單的集成項目
  3. zookeeper可視化工具和dubbo可視化工具
  4. 分佈式和集羣的特色

分佈式系統(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

ZooKeeper(註冊中心)

ZooKeeper 是一個分佈式的,開放源碼的分佈式應用程序協調服務。它是一個爲分佈式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分佈式同步、組服務等。服務器

Dubbo(分佈式服務的調用框架)

Dubbo是Alibaba開源的分佈式服務框架,它最大的特色是按照分層的方式來架構,使用這種方式可使各個層之間解耦合(或者最大限度地鬆耦合)。從服務模型的角度來看,Dubbo採用的是一種很是簡單的模型,要麼是提供方提供服務,要麼是消費方消費服務,因此基於這一點能夠抽象出服務提供方(Provider)和服務消費方(Consumer)兩個角色。

Duboo工做圖

Dubbo關係示意圖

安裝Zookeeper

  1. docker pull zookeeper
  2. 啓動zookeeper。咱們只開放2181端口便可,不作集羣,也不作選舉,所以另外2個端口不予映射
docker run --name zk01 -p 2181:2181 --restart always -d d6f23d89fbee

d6f23d89fbee是zookeeper的鏡像ID,經過docker images查看你本身的鏡像id。

集成Zookeeper、Duboo

註冊服務(provider)

註冊應用的過程大體以下:

  1. 引入duboo和zookeeper的相關依賴
<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須要的一個依賴。

  1. 配置dubood的掃描包和中心地址,注意消費者模塊也會配置應用id,不要與此處相同便可。
# 當前應用的名字
dubbo.application.name=provider-ticket
# 註冊中心的地址
dubbo.registry.address=zookeeper://10.21.1.47:2181
# 哪一個包
dubbo.scan.base-packages=com.zhaoyi.providerticket.service

dubbo也提供了默認的註冊服務,咱們這樣作會覆蓋到默認的服務,詳情參考github官方文檔。

  1. 使用@service發佈服務
// 接口類
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的。

消費服務(consumer)

  1. 引入相關依賴
<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的座標,這樣就能夠直接使用其服務類提供的便利了。

  1. 配置zookeeper註冊中心地址
dubbo.application.name=consumer-user
dubbo.registry.address=zookeeper://10.21.1.47:2181
  1. 編寫一個服務類service/UserService,咱們在其中引用遠程服務
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!》

註冊成功!

可視化zookeeper

不少狀況下,咱們須要查看咱們提供的服務到底有哪些。好比在以前的測試用例中,除了經過查看控制檯日誌,咱們根本沒法獲知註冊中心是否已經知曉或者正確的註冊了provicer提供的服務。

顯然須要一個可視化服務讓咱們能夠直觀的看到具體的服務信息是什麼、怎麼調用以及其調用日誌等等。

市面上仍是提供了很多的相關開源服務,咱們來看看最簡單易用的zkclient。

zkclient

安裝zkclient很簡單,他其實就是一個監聽zookeeper服務端口的一個網站項目。下面列出linux的安裝步驟,在執行安裝以前,確保你的Linux服務器上安裝了git以及maven服務。

  1. 從git克隆zkclient項目
git clone https://github.com/DeemOpen/zkui.git
  1. 經過maven工具打包
mvn clean install
  1. 複製根目錄文件到打包目錄
cp config.cfg target/
  1. 修改配置信息,若是您安裝zkclient的服務器和zookeeper在同一臺服務器,而且zookeeper使用的服務端口是默認的2181,則無需修改:
vi config.cfg
  1. 後臺啓動網站(zkclient)
nohup java -jar zkui-2.0-SNAPSHOT-jar-with-dependencies.jar > /dev/null &
  1. 經過IP:9090(默認,你也能夠從配置文件中修改此端口號)就能夠訪問到zkclient服務網站了。

dubbo-admin

相比較dubbo-admin,zkclient作的就比較簡陋了。dubbo-admin在dubbo 2.6版本之後再也不支持,當前已經更名爲Dubbo ops。

Dubbo ops

Dubbo ops應該是dubbo-admin的後浪項目,咱們來看看其安裝方式。

  1. 從git克隆zkclient項目
git clone https://github.com/apache/incubator-dubbo-ops.git
  1. 經過maven工具打包
mvn clean install

該項目須要maven 3.1以上才能夠編譯成功。

  1. 啓動網站
mvn --projects dubbo-admin-backend spring-boot:run

訪問地址:http://localhost:8080

相關文章
相關標籤/搜索