天天看點

solr的叢集部署及dubbox基本使用娛樂頭條_search_solrCLoud

娛樂頭條_search_solrCLoud

solr的叢集

  • 什麼是solrCLoud: 什麼時候需要使用solrCloud
  • solrCloud的結構 :
  • solrCloud叢集的資料的讀取和分裂的流程
  • solrCloud的部署 : 能夠參考文檔搭建成功
    • zookeeper叢集
    • solrCLoud的叢集
  • solrCloud的管理指令 : 将其記錄好, 用的時候打開複制
  • 使用solrj完成對solrCloud的操作 : 會操作
  • dubbox:
    • 為什麼要使用dubbox, 基本概念 : 了解
    • dubbox基本使用 : dubbox的功能的體驗

1. solrCloud基本概念

1.1 什麼是solrCloud

​ SolrCloud(solr 雲)是Solr提供的分布式搜尋方案,當你需要大規模,容錯,分布式索引和檢索能力時使用 SolrCloud。當一個系統的索引資料量少的時候是不需要使用SolrCloud,當索引量很大,搜尋請求并發很高,這時需要使用SolrCloud來滿足這些需求。

1.2 solrCloud的結構

​ SolrCloud為了降低單機的處理壓力,需要由多台伺服器共同來完成索引和搜尋任務。實作的思路是将索引資料進行Shard(分片)拆分,每個分片由多台的伺服器共同完成,當一個索引或搜尋請求過來時會分别從不同的Shard的伺服器中操作索引。

​ SolrCloud需要Solr基于Zookeeper部署,Zookeeper是一個叢集管理軟體,由于SolrCloud需要由多台伺服器組成,由zookeeper來進行協調管理。

下圖是一個SolrCloud應用的例子:

[外鍊圖檔轉存失敗(img-458NjGTK-1563685245938)(assets/1533630926299.png)]

  • 實體結構:
    • 指定就是三台solr伺服器(直白一點就是三個部署了solr的tomcat)
      • 每個tomcat中都有兩個core(索引庫)
  • 邏輯結構
    • 我們把整個叢集看做了一個整體(一個大的索引庫), 在這個索引庫下有兩個分片(也就是把索引庫分成兩部分), 每一個分片都有三個節點(對應就是實體結果中各個tomcat的索引庫),其中一個為主節點,兩個備份節點

整體部署的結構圖:

[外鍊圖檔轉存失敗(img-DVZrA4pX-1563685245939)(assets/1533649208319.png)]

1.3 solr叢集中資料的讀取及分裂流程(了解)

  • 寫資料的流程

[外鍊圖檔轉存失敗(img-4DLGk2b8-1563685245939)(assets/1533632765477.png)]

[外鍊圖檔轉存失敗(img-42Zaed51-1563685245939)(assets/1558141754746.png)]

寫入的流程中: 寫入索引的節點是每個分片的主節點

請問: 如果能夠讓分片中資料儲存均衡呢?

​ 1) 你一下我一下

​ 2) hash取模計算法 : 先對資料進行hash取值, 得到一個int類型的hash值, 除于目前分片的數量, 對其取餘: 0~分片的數量-1 , 得到那個結果, 将其儲存在對應編号的分片中即可

​ 随着數量量越大, 均勻配置設定越好

  • 讀資料

[外鍊圖檔轉存失敗(img-Gfm2lUSl-1563685245939)(assets/1533632801565.png)]

[外鍊圖檔轉存失敗(img-kVx4S9o8-1563685245940)(assets/1558142487391.png)]

讀資料過程, 不需要master程式參與的, 由slave節點完成讀的操作

在solrCloud中, 讀寫是分離的

  • 副本分裂

[外鍊圖檔轉存失敗(img-4oaiNXht-1563685245942)(assets/1533634314219.png)]

[外鍊圖檔轉存失敗(img-TwqlYD0h-1563685245942)(assets/1558144177890.png)]

如果想要删除一個分片, 必須要将這個分片進行分裂, 因為如果不分裂, 那麼這個分片中是有整個索引庫中一部分的資料的, 不允許删除

2. zookeeper

​ ZooKeeper是一個分布式的,開放源碼(apache)的分布式應用程式協調服務,是Google的Chubby一個開源的實作,是Hadoop和Hbase、dubbox、kafka的重要元件。它是一個為分布式應用提供一緻性服務的軟體,提供的功能包括:配置維護、域名服務、分布式同步、組服務等。zookeeper管理工具,管理叢集和分布式項目

  • zookeeper在solrCloud中的作用
    • 主要用來管理solr叢集中的相關配置資訊和叢集的運作狀态, 協助solr進行主節點的選舉

準備工作

​ 三台虛拟機: 安裝好 jdk1.8 64位即可

vi /etc/hosts
添加如下内容:
192.168.72.141 node01
192.168.72.142 node02
192.168.72.143 node03
注意: 添加時, 前面ip位址一定是自己的三台linux的ip位址 切記不要搞錯了
           

3. zookeeper叢集搭建

3.1 上傳zookeeper的壓縮包(上傳其中一台141即可)

cd /export/software/
rz          //此時選擇zookeeper的壓縮包進行上傳
           

3.2 解壓zookeeper到指定的目錄

tar -zxf zookeeper-3.4.9.tar.gz -C /export/servers/
cd /export/servers/
           

3.3 修改zookeeper的配置檔案

cd /export/servers/zookeeper-3.4.9/conf
mv zoo_sample.cfg  zoo.cfg
vi zoo.cfg
           

[外鍊圖檔轉存失敗(img-fccpa6Zs-1563685245943)(assets/1533615525110.png)]

修改後, 在配置檔案的底部, 添加如下内容
server.1=node01:2887:3887
server.2=node02:2887:3887
server.3=node03:2887:3887

更改後配置檔案整體内容如下:(如果擔心修改錯誤, 可以直接将zoo.cfg中的内容全部删除, 複制以下内容即可)

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/export/data/zk
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

#zookeeper叢集配置
server.1=node01:2887:3887
server.2=node02:2887:3887
server.3=node03:2887:3887
           

**** 處理完成後儲存退出即可

3.4 将配置好的zookeeper發送到其他兩台主機上

cd /export/servers/
scp -r zookeeper-3.4.9/ [email protected]:$PWD   //将zookeeper複制到node02的同級目錄下
scp -r zookeeper-3.4.9/ [email protected]:$PWD   //将zookeeper複制到node03的同級目錄下
           

[外鍊圖檔轉存失敗(img-WHgYnVfp-1563685245944)(assets/1533616702239.png)]

發送完成後,在其他兩台主機檢視, 是否已經成功接收到
cd /export/servers
ll
           

[外鍊圖檔轉存失敗(img-BeYGGeRp-1563685245944)(assets/1533616837430.png)]

3.5 分别在三台主機輸入如下指令

注意: 在執行下列的指令的時候, 一定要看準了, 那一台是server.1,就在那一台寫1
node01:執行的指令
mkdir -p  /export/data/zk
echo "1" > /export/data/zk/myid 
cat /export/data/zk/myid             //此指令用于檢視此檔案有沒有正确寫入 1

node02:執行的指令
mkdir -p  /export/data/zk
echo "2" > /export/data/zk/myid 
cat /export/data/zk/myid             //此指令用于檢視此檔案有沒有正确寫入 2

node03:執行的指令
mkdir -p  /export/data/zk
echo "3" > /export/data/zk/myid 
cat /export/data/zk/myid            //此指令用于檢視此檔案有沒有正确寫入 3
           

3.6 分别啟動三台zookeeper(建議啟動順序 node1>>node2>>node3 依次啟動)

# 每一台都得進行啟動: 一下每一台執行的指令
cd /export/servers/zookeeper-3.4.9/bin/
./zkServer.sh start
           
  • node01: follower

[外鍊圖檔轉存失敗(img-bHNShocl-1563685245944)(assets/1533634913807.png)]

  • node02: 為leader

[外鍊圖檔轉存失敗(img-nGRkSCQb-1563685245944)(assets/1533634953701.png)]

  • node03: follower

[外鍊圖檔轉存失敗(img-yVoQBxWD-1563685245946)(assets/1533635021308.png)]

3.7 zookeeper的選舉機制(了解)

  • 初始化叢集: 采取投票機制, 選舉過半即為leader
1. 當第一台(id=1),啟動後, 由于目前自有自己,故會把票投給自己
2. 當第二台(id=2),啟動後, 由于目前已經又二台啟動, 這時候會将票投給id最大的機器, 此時三台中已經有二台啟動, 數量過半, 第二台理所應當的成為了leader
3. 當第三台(id=3),啟動後, 雖然id=3為最大, 但是由于leader已經産生, 故隻能擔任follower
           
  • 當下一次在重新啟動時, 又會恢複選舉,此時誰的資料多, 誰為leader, 如果資料都一樣, 那麼看id誰最大,同時一般選舉過半,就會産生leader

4. solrCloud搭建

準備工作: 需要将原有在Windows中的solr的伺服器移植到linux中運作, 在移植之前, 需要将本地的solr伺服器中schema檔案替換成資料中提供的schema檔案

務必要進行替換, 否則後續内容将無法進行…

在替換的時候, 隻需要将collection1中的schema進行替換即可

4.1 将在window中部署的單機版solr上傳到node01中

cd /export/software/
rz               //選擇資料中的solr.zip進行上傳(此zip就是solr當天部署後的内容,包含solr-home和tomcat)
           

4.2 将zip進行解壓到指定目錄中

yum -y install unzip
cd /export/software/
unzip solr.zip 
mv solr /export/servers/
           

4.3 修改tomcat的Catalina.sh的配置檔案

cd /export/servers/solr/apache-tomcat-8.5.31/bin
vi catalina.sh             //注意此時修改的.sh的檔案 并非.bat

添加如下内容:(此處後期還會進行修改, 目前隻是為了測試單機版本能否在linux中運作)
export "JAVA_OPTS=-Dsolr.solr.home=/export/servers/solr/solr-home"
           

***** 添加後儲存退出即可

4.4 啟動tomcat測試單機版本能否在linux中運作

注意: 由于是解壓的是zip檔案, tomcat中的.sh檔案都沒有任何的執行缺陷, 需要進行賦權限:
chmod 755 /export/servers/solr/apache-tomcat-8.5.31/bin/*.sh

啟動tomcat:
cd /export/servers/solr/apache-tomcat-8.5.31/bin/
./startup.sh 
           

[外鍊圖檔轉存失敗(img-7fODUWFW-1563685245946)(assets/1533622017690.png)]

**** 看到此頁面,說明單機版本配置成功

成功後:将tomcat務必關機操作
./shutdown.sh 
           

**** 務必執行以上指令, 關閉tomcat (出現了403這個錯誤, 那麼說明, 當時tomcat忘記關閉了)

4.5 将solr-home中的data目錄全部清空, 并且隻保留一個索引庫即可

cd /export/servers/solr/solr-home/
 rm -rf collection2/                    //删除多餘的索引庫, 隻保留一個collection1即可
 rm -rf collection1/data/
           

[外鍊圖檔轉存失敗(img-Db0gqHbQ-1563685245947)(assets/1533622385753.png)]

4.6 将solr的配置檔案交給zookeeper進行管理

solr已經提供了将配置檔案送出給zookeeper的指令了, 這個上傳配置檔案的指令就在solr的安裝包中
1. 需要先上傳solr的安裝包
 cd /export/software/
 rz
2. 解壓solr的安裝包
	unzip solr-4.10.2.zip 
3. 将solr安裝包複制到/export/servers下
	mv solr-4.10.2 /export/servers/
4. 開始執行上傳
	cd /export/servers/solr-4.10.2/example/scripts/cloud-scripts/
	//注意: 以下指令是一行
	./zkcli.sh -zkhost node01:2181,node02:2181,node03:2181 -cmd upconfig -confdir /export/servers/solr/solr-home/collection1/conf/ -confname solrconf
           

[外鍊圖檔轉存失敗(img-KAhLenGv-1563685245947)(assets/1533623258127.png)]

以下指令主要用于檢視zookeeper中是否存在solr的配置檔案: 可以不執行跳過
cd /export/servers/zookeeper-3.4.9/bin
./zkCli.sh
ls /configs/solrconf
           

[外鍊圖檔轉存失敗(img-KQBKPyDp-1563685245947)(assets/1533623647891.png)]

4.7 修改solr.xml配置檔案

solr.xml是solr叢集管理檔案

cd /export/servers/solr/solr-home/
vi solr.xml
           

[外鍊圖檔轉存失敗(img-pXBTpicC-1563685245948)(assets/1533629738781.png)]

4.8 修改tomcat的Catalina.sh配置檔案

cd /export/servers/solr/apache-tomcat-7.0.77/bin/
vi catalina.sh 
*** 修改如下内容
export "JAVA_OPTS=-Dsolr.solr.home=/export/servers/solr/solr-home   //原來的内容

//以下為替換後的内容  注意: 這是一行内容, 複制時一起複制即可
export "JAVA_OPTS=-Dsolr.solr.home=/export/servers/solr/solr-home -DzkHost=node01:2181,node02:2181,node03:2181"      
           

4.9 将solr目錄發送到其他兩台linux上(node02,node03)

cd /export/servers/
scp -r solr [email protected]:$PWD
scp -r solr [email protected]:$PWD
           

在其他兩台主機上檢視, 是否接收成功:

[外鍊圖檔轉存失敗(img-pY82WnG0-1563685245948)(assets/1533624320892.png)]

4.10 依次啟動三台solr即可

cd /export/servers/solr/apache-tomcat-7.0.77/bin/
./startup.sh
           

[外鍊圖檔轉存失敗(img-miVh4kwf-1563685245949)(assets/1533636231218.png)]

4.11 自動化腳本編寫與啟動

一共需要四個shell腳本:

1)  啟動 和 關閉  zookeeper叢集的腳本   (2個)
2)  啟動 和 關閉  solrCloud叢集的腳本   (2個)
           
    1. zookeeper叢集的啟動和關閉腳本
    • 腳本的放置位置: /export/servers/zookeeper-3.4.9/bin
zookeeper的關閉腳本 :  shutdownZKCloud.sh
腳本内容如下: 
#!/bin/sh
echo "關閉zookeeper中...."
for host in node01 node02 node03
do
	ssh -q $host "source /etc/profile; /export/servers/zookeeper-3.4.9/bin/zkServer.sh stop"
done
echo "關閉zookeeper完成..."


zookeeper的啟動腳本 :  startZKCloud.sh
腳本内容如下: 
#!/bin/sh
echo "啟動zookeeper中...."
for host in node01 node02 node03
do
	ssh -q $host "source /etc/profile; /export/servers/zookeeper-3.4.9/bin/zkServer.sh start"
done
echo "啟動zookeeper完成..."
           
    1. solrCloud的啟動和關閉腳本
    • 腳本的放置位置: /export/servers/solr/bin
solrCloud的關閉腳本: shutdownSolrCloud.sh
腳本内容如下:
#!/bin/sh
echo "關閉solrCloud中..."
for host in node01 node02 node03
do
	ssh -q $host "source /etc/profile; /export/servers/solr/apache-tomcat-8.5.31/bin/shutdown.sh"
done
echo "關閉solrCloud完成..."

solrCloud的啟動的腳本 :  startSolrCloud.sh
腳本内容如下: 
#!/bin/sh
echo "啟動solrCloud中..."
for host in node01 node02 node03
do
	ssh -q $host "source /etc/profile; /export/servers/solr/apache-tomcat-8.5.31/bin/startup.sh"
done

echo "solrCloud啟動完成....."
           
    1. 為四個腳本賦權限
chmod 755 /export/servers/zookeeper-3.4.9/bin/shutdownZKCloud.sh
chmod 755 /export/servers/zookeeper-3.4.9/bin/startZKCloud.sh
chmod 755 /export/servers/solr/bin/shutdownSolrCloud.sh
chmod 755 /export/servers/solr/bin/startSolrCloud.sh
           
    1. 啟動各個腳本即可
    • 在啟動的時候需要先啟動zookeeper叢集, 後啟動solr叢集,
    • 在關閉的時候需要先關閉solr叢集後關閉zookeeper叢集

5. solrCloud相關的管理指令

5.1 建立新叢集(建立一個索引庫)

http://192.168.72.141:8080/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=3&maxShardsPerNode=8&property.schema=schema.xml&property.config=solrconfig.xml


接口參數說明:

action: 表示執行的操作 CREATE 建立
name: 新叢集的名稱
numShards: 分片數
replicationFactor: 每個分片的節點數
maxShardsPerNode: 設定每個分片的最大節點數, 預設為1
property.schema: 指定使用的schema檔案   (注意, 此檔案必須在zookeeper上存在)
property.config: 指定使用的solrConfig檔案 (注意, 此檔案必須在zookeeper上存在)

           

[外鍊圖檔轉存失敗(img-pZdp5rqE-1563685245949)(assets/1533636808020.png)]

5.2 删除core指令

會将真實的索引庫的資料删除, 這個指令慎用
http://192.168.72.141:8080/solr/admin/collections?action=DELETE&name=collection1
           

5.3 查詢所有的Core

http://192.168.72.141:8080/solr/admin/collections?action=LIST
           

5.4 顯示core的狀态

http://192.168.72.141:8080/solr/admin/collections?action=clusterstatus
           

5.5 分裂shard(擴充容量)

分裂: 就是将某個分片分成兩個分片

​ 注意: 一旦分裂後, 雖然原來的分片還可以提供服務, 但是已經不再儲存資料, 會将資料儲存到新的分裂後的分片

http://192.168.72.141:8080/solr/admin/collections?action=SPLITSHARD&collection=collection2&shard=shard1

參數說明:
shard: 指定要分裂的分片
           

5.6 删除某個分片

隻是一個邏輯删除, 不會真正的将分片直接删除的,

如果要将分片資料全部删除, 需要手動一個個删除

注意: 删除的分片必須是已經被分裂的, 或者是已經無法提供服務的

http://192.168.72.141:8080/solr/admin/collections?action=DELETESHARD&shard=shard2&collection=collection2
           

6. 使用solrj連接配接叢集, 完成基本的索引庫操作

6.1 導入相關的pom依賴

<dependencies>
        <dependency>
            <groupId>org.apache.solr</groupId>
            <artifactId>solr-solrj</artifactId>
            <version>4.10.2</version>
        </dependency>
         <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging-api</artifactId>
            <version>1.1</version>
        </dependency>
    </dependencies>
           

6.2 編寫代碼,完成CURD

  • 添加(修改)索引
//1. 添加索引資料 :
    @Test
    public void indexWriterTest() throws  Exception{
        //1.建立一個solrj連接配接solrCloud的服務對象
        // 如果想要使用 node01 : 2181 這種方式, 必須保證, node01 是在本地Windows環境下的hosts檔案中配置上
        // 驗證是否配置:  打開cmd  執行: ping node01
        String zkHost = "node01:2181,node02:2181,node03:2181";
        CloudSolrServer solrServer = new CloudSolrServer(zkHost);

        //2. 設定相關的參數:    一個必須, 兩個可選
        solrServer.setDefaultCollection("collection2"); // 預設連接配接那個索引庫
        // zookeeper會幫助我們配置設定一個(不是很繁忙的節點)solrCloud的節點供我們使用,
        solrServer.setZkConnectTimeout(5000); //  從zookeeper中擷取連接配接的逾時時間
        solrServer.setZkClientTimeout(5000);  // 連接配接zookeeper的逾時時間
        //3. 從zookeeper中擷取連接配接
        solrServer.connect();

        //4. 執行添加資料的操作:
        SolrInputDocument doc = new SolrInputDocument();
        doc.addField("id",1);
        doc.addField("title","世界上最傻的焊接工");
        doc.addField("content","其實還有比你更傻的, 把自己縫在被罩了");
        solrServer.add(doc);

        //5. 送出資料
        solrServer.commit();

        
    }
           
  • 删除索引
// 删除索引
    @Test
    public  void  delIndexTest() throws  Exception{
        //1. 建立一個solrj連接配接solrCloud的服務對象
        String zkHost = "192.168.72.141:2181,192.168.72.142:2181,192.168.72.143:2181";
        CloudSolrServer solrServer = new CloudSolrServer(zkHost);

        //1.1 設定相關的參數: 1個必須 兩個可選
        solrServer.setDefaultCollection("collection2");

        solrServer.setZkClientTimeout(5000);
        solrServer.setZkConnectTimeout(5000);

        //1.2 擷取連接配接
        solrServer.connect();

        //2. 添加删除的條件
        solrServer.deleteById("1");
       // solrServer.deleteByQuery("id:1");

        //3. 送出執行
        solrServer.commit();
    }
           
  • 查詢索引
// 查詢索引
    @Test
    public void indexSearcherTest() throws  Exception{
        //1. 建立一個solrj連接配接solrCloud的服務對象
        String zkHost = "node01:2181,node02:2181,node03:2181";
        CloudSolrServer solrServer = new CloudSolrServer(zkHost);

        //1.1 設定相關的參數: 1個必須 兩個可選
        solrServer.setDefaultCollection("collection2");

        //1.2 擷取連接配接
        solrServer.connect();

        //2. 封裝查詢的條件
        SolrQuery solrQuery = new SolrQuery("*:*");
        //3. 執行查詢
        QueryResponse response = solrServer.query(solrQuery);
        //4. 擷取資料
        SolrDocumentList documentList = response.getResults();
        for (SolrDocument document : documentList) {

            String id = (String) document.get("id");
            String title = (String) document.get("title");
            String content = (String) document.get("content");

            System.out.println(id+"   "+ title +"   "+ content);
        }

    }
           

7. 搜尋門戶與solr服務的架構

[外鍊圖檔轉存失敗(img-fEsMdC4x-1563685245951)(assets/1541863320833.png)]

如何實作系統通信:

​ 1、Web-service:效率不高基于soap協定。項目中不推薦使用。 (http + xml)

​ 2、使用restful形式的服務:http+json。很多項目中應用。如果服務太多,服務之間調用關系混亂,需要治療服務。

​ 3、使用dubbo。使用rpc協定進行遠端調用,直接使用socket通信。傳輸效率高,并且可以統計出系統之間的調用關系、調用次數。分布式項目中經常采用此種方式

8.dubbox架構

​ Dubbox 是一個分布式服務架構,其前身是阿裡巴巴開源項目Dubbo ,被國内電商及網際網路項目中使用,後期阿裡巴巴停止了該項目的維護,當當網便在Dubbo基礎上進行優化,并繼續維護,為了與原有的Dubbo區分,故将其命名為Dubbox。 2016年阿裡重新将dubbo進行了維護, 并在2017将dubbo貢獻給apache, 目前已經成為apache的頂級的項目

​ Dubbox 緻力于提供高性能和透明化的RPC遠端服務調用方案

[外鍊圖檔轉存失敗(img-siIeqSSf-1563685245951)(assets/1541863595545.png)]

節點角色說明:
	Provider: 暴露服務的服務提供方。
	Consumer: 調用遠端服務的服務消費方。
	Registry: 服務注冊與發現的注冊中心。
	Monitor: 統計服務的調用次調和調用時間的監控中心。
	Container: 服務運作容器。
調用關系說明:
	0. 服務容器負責啟動,加載,運作服務提供者。
	1. 服務提供者在啟動時,向注冊中心注冊自己提供的服務。
	2. 服務消費者在啟動時,向注冊中心訂閱自己所需的服務。
	3. 注冊中心傳回服務提供者位址清單給消費者,如果有變更,注冊中心将基于長連接配接推送變更資料給消費者。
	4. 服務消費者,從提供者位址清單中,基于軟負載均衡算法,選一台提供者進行調用,如果調用失敗,再選另一台調用。
	5. 服務消費者和提供者,在記憶體中累計調用次數和調用時間,定時每分鐘發送一次統計資料到監控中心。
           

8.1 dubbox的基本使用

​ dubbox官方推薦使用zookeeper作為dubbox的注冊中心, 負責服務位址的注冊與查找,服務提供者和消費者隻在啟動時與注冊中心互動,注冊中心不轉發請求,壓力較小。

需注意, dubbox并沒有在maven的中央倉庫中存在, 需要手動将Dubbox的jar包安裝到我的本地倉庫中。

先将dubbo-2.8.4.jar包放到e:\setup, 然後輸入指令

1) 檢視maven的環境變量是否存在:  打開cmd  執行 mvn -version
2) 執行下列的指令即可
           
mvn install:install-file -Dfile=e:\setup\dubbo-2.8.4.jar -DgroupId=com.alibaba -DartifactId=dubbo -Dversion=2.8.4 -Dpackaging=jar
           

[外鍊圖檔轉存失敗(img-92QFOoMo-1563685245952)(assets/1546412674865.png)]

    1. 建立一個父工程: gossip-dubboxDemo-parent
    • 在父工程中添加如下依賴
<!-- 集中定義依賴版本号 -->
    <properties>
        <junit.version>4.12</junit.version>
        <spring.version>4.2.4.RELEASE</spring.version>
        <servlet-api.version>2.5</servlet-api.version>
        <dubbo.version>2.8.4</dubbo.version>
        <zookeeper.version>3.4.7</zookeeper.version>
        <zkclient.version>0.1</zkclient.version>
        <mybatis.version>3.2.8</mybatis.version>
        <mybatis.spring.version>1.2.2</mybatis.spring.version>
        <mysql.version>5.1.32</mysql.version>
        <druid.version>1.0.9</druid.version>
        <freemarker.version>2.3.23</freemarker.version>
        <solrj.version>4.10.2</solrj.version>
        <javassist.version>3.11.0.GA</javassist.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- spring 相關的依賴包 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
                <version>${spring.version}</version>
            </dependency>

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jms</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <!-- mybatis 相關的依賴包 -->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>${mybatis.version}</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis-spring</artifactId>
                <version>${mybatis.spring.version}</version>
            </dependency>
            <!-- springmvc的相關依賴包 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>${spring.version}</version>
            </dependency>

            <!-- 資料庫的相關依賴包 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
            <!-- 連接配接池 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>${druid.version}</version>
            </dependency>

            <!-- 日志相關的依賴包 -->
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>1.6.4</version>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>

            <!--json相關的依賴-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.28</version>
            </dependency>


            <!--solr相關依賴-->
            <dependency>
                <groupId>org.apache.solr</groupId>
                <artifactId>solr-solrj</artifactId>
                <version>${solrj.version}</version>
            </dependency>


            <!--測試相關-->

            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>${spring.version}</version>
            </dependency>


            <!--dubbox相關依賴-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>dubbo</artifactId>
                <version>${dubbo.version}</version>
            </dependency>
            <!--zookeeper相關依賴-->
            <dependency>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
                <version>${zookeeper.version}</version>
            </dependency>
            <dependency>
                <groupId>com.github.sgroschupf</groupId>
                <artifactId>zkclient</artifactId>
                <version>${zkclient.version}</version>
            </dependency>

            <dependency>
                <groupId>javassist</groupId>
                <artifactId>javassist</artifactId>
                <version>${javassist.version}</version>
            </dependency>
        </dependencies>

    </dependencyManagement>


    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>utf-8</encoding>
                </configuration>
            </plugin>

        </plugins>
    </build>
           
    1. 建立服務提供者: dubboxdemo-service (war工程)
    • 2.1) 添加如下内容依賴:
    <dependencies>
    		<!-- Spring -->
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-context</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-beans</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-webmvc</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-jdbc</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-aspects</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-jms</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-context-support</artifactId>
    		</dependency>	
    		<!-- dubbo相關 -->
    		<dependency>
    			<groupId>com.alibaba</groupId>
    			<artifactId>dubbo</artifactId>			
    		</dependency>
    		<dependency>
    			<groupId>org.apache.zookeeper</groupId>
    			<artifactId>zookeeper</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>com.github.sgroschupf</groupId>
    			<artifactId>zkclient</artifactId>
    		</dependency>		
    		<dependency>
    			<groupId>javassist</groupId>
    			<artifactId>javassist</artifactId>
    		</dependency>		
    	</dependencies>
       <build>  
    	  <plugins>
    	      <plugin>  
    	          <groupId>org.apache.maven.plugins</groupId>  
    	          <artifactId>maven-compiler-plugin</artifactId>  
    	          <version>2.3.2</version>  
    	          <configuration>  
    	              <source>1.8</source>  
    	              <target>1.8</target>  
    	          </configuration>  
    	      </plugin>  
    	      <plugin>
    				<groupId>org.apache.tomcat.maven</groupId>
    				<artifactId>tomcat7-maven-plugin</artifactId>
    				<configuration>
    					<!-- 指定端口 -->
    					<port>8081</port>
    					<!-- 請求路徑 -->
    					<path>/</path>
    				</configuration>
    	  	  </plugin>
    	  </plugins>  
        </build>
               
    • 2.2) 在工程的webapps下建立WEB-INF檔案夾,找到web.xml,添加如下内容
    <!-- 加載spring容器 -->
    	<context-param>
    		<param-name>contextConfigLocation</param-name>
    		<param-value>classpath:applicationContext*.xml</param-value>
    	</context-param>
    	<listener>		
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    	</listener>	
               
    • 2.3) 建立一個業務的接口
      • 建立包:cn.itcast.dubboxdemo.service,用于存放業務接口
    package cn.itcast.dubboxdemo.service;
    /**
     * 業務接口
     */
    public interface UserService {	
    	public String getName();	
    }
               
    • 2.4) 建立業務實作類
      • 建立包cn.itcast.dubboxdemo.service.impl ,用于存放業務實作類。建立業務實作類:
    package cn.itcast.dubboxdemo.service.impl;
    import com.alibaba.dubbo.config.annotation.Service;
    import cn.itcast.dubbodemo.service.UserService;
    //注意:Service注解與原來不同,需要引入com.alibaba包下的
    @Service
    public class UserServiceImpl implements UserService {
    	public String getName() {		
    		return "itcast";
    	}
    }
               
    • 2.5) 編寫配置檔案
      • 在resources下建立applicationContext-service.xml ,内容如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
            http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
         
        <dubbo:application name="dubboxdemo-service"/>  
        <dubbo:registry protocol="zookeeper" address="192.168.72.141:2181,192.168.72.142:2181,192.168.72.143:2181"/>
        <!--注意:dubbo:annotation用于掃描@Service注解。-->
        <dubbo:annotation package="cn.itcast.dubboxdemo.service" /> 
    </beans>
               
    • 2.6) 測試運作
    tomcat7:run
               
  • 3.服務消費者開發
    • 3.1) 建立Maven工程(WAR)dubboxdemo-web ,在pom.xml引入依賴 ,同“dubboxdemo-service”工程。差別就是把tomcat插件的運作端口改為8082 。
    • 3.2) 在webapps下WEB-INF 目錄,找到web.xml,添加如下内容
    <!-- 解決post亂碼 -->
    	<filter>
    		<filter-name>CharacterEncodingFilter</filter-name>		
            <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    		<init-param>
    			<param-name>encoding</param-name>
    			<param-value>utf-8</param-value>
    		</init-param>
    		<init-param>  
                <param-name>forceEncoding</param-name>
                <param-value>true</param-value>  
            </init-param>  
    	</filter>
    	<filter-mapping>
    		<filter-name>CharacterEncodingFilter</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>		
      <servlet>
      	<servlet-name>springmvc</servlet-name>  	
    	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      	<!-- 指定加載的配置檔案 ,通過參數contextConfigLocation加載-->
      	<init-param>
      		<param-name>contextConfigLocation</param-name>
      		<param-value>classpath:applicationContext-web.xml</param-value>
      	</init-param>
      </servlet>  
      <servlet-mapping>
      	<servlet-name>springmvc</servlet-name>
      	<url-pattern>*.do</url-pattern>
      </servlet-mapping>
               
    • 3.3) 拷貝業務接口
      • 将“dubboxdemo-service”工程的cn.itcast.dubboxdemo.service 包以及下面的接口拷貝至此工程。
    • 3.4) 編寫Controller : 包名: cn.itcast.dubboxdemo.controller
    package cn.itcast.dubboxdemo.controller;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    import cn.itcast.dubbodemo.service.UserService;
    @Controller
    @RequestMapping("/user")
    public class UserController {
    	@Reference
    	private UserService userService;	
    	@RequestMapping("/showName")
    	@ResponseBody
    	public String showName(){
    		return userService.getName();
    	}		
    }
               
    • 3.5) 編寫spring配置檔案
      • 在src/main/resources下建立applicationContext-web.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
            http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    
    	<mvc:annotation-driven >
    		<mvc:message-converters register-defaults="false">
    			<bean class="org.springframework.http.converter.StringHttpMessageConverter">  
    				<constructor-arg value="UTF-8" />
    			</bean>  
    		</mvc:message-converters>	
    	</mvc:annotation-driven>
    	<!-- 引用dubbo 服務 -->
    	<dubbo:application name="dubboxdemo-web" />
    	<dubbo:registry protocol="zookeeper" address="192.168.72.141:2181,192.168.72.142:2181,192.168.72.143:2181"/>
         <dubbo:annotation package="cn.itcast.dubboxdemo.controller" />
    </beans>
               
    • 3.6) 測試運作
    tomcat7:run
    
    在浏覽器輸入http://localhost:8082/user/showName.do,檢視浏覽器輸出結果
               

[外鍊圖檔轉存失敗(img-XDChi3Vu-1563685245953)(assets/1558167764563.png)]

使用步驟:

  1. 導包: spring +dubbox+zookeeper
  2. 添加spring的配置檔案:
<dubbo:application name="dubboxdemo-web" />
    <dubbo:registry protocol="zookeeper" address="192.168.72.141:2181,192.168.72.142:2181,192.168.72.143:2181"/>
    <!--隻需要更改掃描包的位置-->
    <dubbo:annotation package="cn.itcast.dubboxdemo.controller" />
           
  1. 在服務端添加 @service注解, 在web端添加@Reference

總結:

  • solrCloud :
      1. 為什麼要使用solrCloud: 搜尋高并發 , 索引量大
      1. 如果部署solrCloud需要先部署一個zookeeper
      • zookeeper: 是一個叢集的管理工具, 在solrCloud中主要用來管理配置檔案, 叢集狀态, solrCloud主節點選舉
      1. 能夠将zookeeper叢集 和 solrCloud的叢集搭建成功
      1. 使用solrCloud的管理指令建立一個新的索引庫(符合結構規定)
      1. 使用solrj完成對solrCloud的操作
  • dubbox:
    • 基本使用

      sage-converters>

      </mvc:annotation-driven> <dubbo:application name=“dubboxdemo-web” />

      <dubbo:registry protocol=“zookeeper” address=“192.168.72.141:2181,192.168.72.142:2181,192.168.72.143:2181”/>

      <dubbo:annotation package=“cn.itcast.dubboxdemo.controller” />

    * 3.6) 測試運作
    
               

    tomcat7:run

    在浏覽器輸入http://localhost:8082/user/showName.do,檢視浏覽器輸出結果

[外鍊圖檔轉存中…(img-XDChi3Vu-1563685245953)]

使用步驟:

  1. 導包: spring +dubbox+zookeeper
  2. 添加spring的配置檔案:
<dubbo:application name="dubboxdemo-web" />
    <dubbo:registry protocol="zookeeper" address="192.168.72.141:2181,192.168.72.142:2181,192.168.72.143:2181"/>
    <!--隻需要更改掃描包的位置-->
    <dubbo:annotation package="cn.itcast.dubboxdemo.controller" />
           
  1. 在服務端添加 @service注解, 在web端添加@Reference

總結:

  • solrCloud :
      1. 為什麼要使用solrCloud: 搜尋高并發 , 索引量大
      1. 如果部署solrCloud需要先部署一個zookeeper
      • zookeeper: 是一個叢集的管理工具, 在solrCloud中主要用來管理配置檔案, 叢集狀态, solrCloud主節點選舉
      1. 能夠将zookeeper叢集 和 solrCloud的叢集搭建成功
      1. 使用solrCloud的管理指令建立一個新的索引庫(符合結構規定)
      1. 使用solrj完成對solrCloud的操作
  • dubbox:
    • 基本使用
    • 了解: 為什麼要使用dubbox

繼續閱讀