娛樂頭條_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(索引庫)
- 指定就是三台solr伺服器(直白一點就是三個部署了solr的tomcat)
- 邏輯結構
- 我們把整個叢集看做了一個整體(一個大的索引庫), 在這個索引庫下有兩個分片(也就是把索引庫分成兩部分), 每一個分片都有三個節點(對應就是實體結果中各個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個)
-
- 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完成..."
-
- 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啟動完成....."
-
- 為四個腳本賦權限
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
-
- 啟動各個腳本即可
- 在啟動的時候需要先啟動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)]
-
- 建立一個父工程: 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>
-
- 建立服務提供者: 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)]
使用步驟:
- 導包: spring +dubbox+zookeeper
- 添加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" />
- 在服務端添加 @service注解, 在web端添加@Reference
總結:
- solrCloud :
-
- 為什麼要使用solrCloud: 搜尋高并發 , 索引量大
-
- 如果部署solrCloud需要先部署一個zookeeper
- zookeeper: 是一個叢集的管理工具, 在solrCloud中主要用來管理配置檔案, 叢集狀态, solrCloud主節點選舉
-
- 能夠将zookeeper叢集 和 solrCloud的叢集搭建成功
-
- 使用solrCloud的管理指令建立一個新的索引庫(符合結構規定)
-
- 使用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)]
使用步驟:
- 導包: spring +dubbox+zookeeper
- 添加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" />
- 在服務端添加 @service注解, 在web端添加@Reference
總結:
- solrCloud :
-
- 為什麼要使用solrCloud: 搜尋高并發 , 索引量大
-
- 如果部署solrCloud需要先部署一個zookeeper
- zookeeper: 是一個叢集的管理工具, 在solrCloud中主要用來管理配置檔案, 叢集狀态, solrCloud主節點選舉
-
- 能夠将zookeeper叢集 和 solrCloud的叢集搭建成功
-
- 使用solrCloud的管理指令建立一個新的索引庫(符合結構規定)
-
- 使用solrj完成對solrCloud的操作
-
- dubbox:
- 基本使用
- 了解: 為什麼要使用dubbox