1. 程式人生 > >day74_淘淘商城專案_07_ zookeeper叢集搭建 + solrcloud叢集搭建 + 搜尋功能切換到叢集版 + httpclient學習 + 全域性異常處理器 + 附錄_匠心筆記

day74_淘淘商城專案_07_ zookeeper叢集搭建 + solrcloud叢集搭建 + 搜尋功能切換到叢集版 + httpclient學習 + 全域性異常處理器 + 附錄_匠心筆記

淘淘商城專案_07


課程計劃

  • 1、solr叢集的搭建
  • 2、使用solrJ管理solr叢集
  • 3、把搜尋功能切換到solr叢集版
  • 4、httpclient
  • 5、全域性異常處理

1、什麼是SolrCloud

  SolrCloud(solr 雲)是Solr提供的分散式搜尋方案,當你需要大規模、容錯、分散式索引和檢索能力時使用 SolrCloud。當索引量很大搜尋請求併發很高,這時需要使用SolrCloud來滿足這些需求。
  SolrCloud是基於Solr和Zookeeper的分散式搜尋方案,它的主要思想是使用Zookeeper作為叢集的配置資訊中心
  Zookeeper它有幾個特色功能:
  1)集中式的配置資訊(資料庫連線池的配置檔案,修改檔案不用重啟就可以生效)
  2)自動容錯
  3)近實時搜尋
  4)查詢時自動負載均衡

2、Solr叢集的系統架構


詳解如下:

2.1、SolrCloud的物理結構

  三個Solr例項(每個例項包括兩個Core),組成一個SolrCloud。

2.2、SolrCloud的邏輯結構

  索引集合包括兩個Shard(Shard1和Shard2),Shard1和Shard2分別由三個Core組成,其中一個Leader兩個Replication,Leader是由ZooKeeper選舉產生,zookeeper控制每個shard上三個Core的索引資料一致,解決高可用問題。
  使用者發起索引請求分別從Shard1和Shard2上獲取,解決高併發問題。

2.2.1、Collection

  Collection在SolrCloud叢集中是一個邏輯意義上的完整的索引結構。它常常被劃分為一個或多個Shard(分片),它們使用相同的配置資訊。
  比如:針對商品資訊搜尋可以建立一個Collection。
  Collection = Shard1 + Shard2 + … + Shardx

2.2.2、Core

  每個Core是Solr中一個獨立執行單位,提供索引搜尋服務。一個Shard需要由一個Core或多個Core組成。由於Collection由多個Shard組成所以Collection一般由多個Core組成。

2.2.3、Master或Slave

  Master是Master-Slave結構中的主結點(通常說主伺服器),Slave是Master-Slave結構中的從結點(通常說從伺服器或備伺服器)。  同一個Shard下Master和Slave儲存的資料是一致的,這是為了達到高可用目的。

2.2.4、Shard

  Collection的邏輯分片。每個Shard被化成一個或者多個Replication,通過選舉確定哪個是Leader。

2.3、我們需要實現簡單的Solr叢集架構


ZooKeeper作為叢集的管理工具。
  1、叢集管理:容錯、負載均衡。
  2、配置檔案的集中管理。
  3、叢集的入口。
  需要實現ZooKeeper高可用。需要搭建叢集。建議是奇數節點。需要三個ZooKeeper伺服器。
  搭建Solr叢集至少需要7臺伺服器。
  ZooKeeper有自己的投票機制,類似於Redis,需要半數以上的節點判斷其他的節點掛掉,才能算掛掉。
搭建偽分散式
  需要三個ZooKeeper節點
  需要四個Tomcat節點。
建議虛擬機器的記憶體1G以上。

3、環境準備

Win10
CentOS 7.5
jdk-7u80-linux-x64.tar.gz
apache-tomcat-7.0.47.tar.gz
zookeeper-3.4.6.tar.gz
solr-4.10.3.tgz.gz

4、安裝步驟

4.1、ZooKeeper叢集的搭建

第一步:Linux上需要安裝jdk環境。(已安好jdk1.7)
第二步:把zookeeper的壓縮包上傳到Linux伺服器。
第三步:解壓縮後刪除壓縮包。

[[email protected] ~]# pwd
/root
[[email protected] ~]# tar zxvf zookeeper-3.4.6.tar.gz
[[email protected] ~]# rm -rf zookeeper-3.4.6.tar.gz 

第四步:把zookeeper複製三份。

[[email protected] ~]# mkdir /usr/local/solr-cloud
[[email protected] ~]# cp -r zookeeper-3.4.6/ /usr/local/solr-cloud/zookeeper01
[[email protected] ~]# cp -r zookeeper-3.4.6/ /usr/local/solr-cloud/zookeeper02
[[email protected] ~]# cp -r zookeeper-3.4.6/ /usr/local/solr-cloud/zookeeper03

第五步:在每個zookeeper目錄下建立一個data目錄。
第六步:在data目錄下建立一個myid檔案,檔名就叫做“myid”。內容就是每個例項的id。例如1、2、3。

[[email protected] ~]# cd /usr/local/solr-cloud/
[[email protected] solr-cloud]# ll
總用量 12
drwxr-xr-x. 10 root root 4096 11月 23 16:59 zookeeper01
drwxr-xr-x. 10 root root 4096 11月 23 16:59 zookeeper02
drwxr-xr-x. 10 root root 4096 11月 23 16:59 zookeeper03
[[email protected] solr-cloud]# cd zookeeper01
[[email protected] zookeeper01]# mkdir data
[[email protected] zookeeper01]# cd data/
[[email protected] data]# echo 1 >> myid
[[email protected] data]# ll
總用量 4
-rw-r--r--. 1 root root 2 11月 23 17:05 myid
[[email protected] data]# cat myid 
1
[[email protected] data]# 

其他zookeeper目錄同理。注意:myid中的id要和伺服器的標識對應起來。
注意:命令:touch myid是建立一個檔案myid,但是不寫入內容;echo 1 >> myid不僅建立一個檔案myid,還寫入內容1。
第七步:修改配置檔案。把每一個zookeeper下的conf目錄下的zoo_sample.cfg檔案改名為zoo.cfg。
在zookeeper01目錄下的配置如下:(注意:配置的埠都不能衝突

[[email protected] conf]# pwd
/usr/local/solr-cloud/zookeeper01/conf
[[email protected] conf]# mv zoo_sample.cfg zoo.cfg
[[email protected] conf]# vim zoo.cfg 

配置如下圖所示:

server.1 這個1是伺服器的標識也可以是其他的數字, 表示這個是第幾號伺服器,用來標識伺服器,這個標識要寫到快照目錄下面myid檔案裡。
同理在zookeeper02、zookeeper03下配置,注意埠不能衝突

/usr/local/solr-cloud/zookeeper01/data/

server.1=192.168.25.154:2881:3881
server.2=192.168.25.154:2882:3882
server.3=192.168.25.154:2883:3883

第八步:啟動每個zookeeper例項。

a) 建立啟動例項的批處理檔案:在solr-cloud下建立,命令如下:

[[email protected] solr-cloud]# vim zookeeper_start_all.sh

b) 使用vim編輯內容如下:

cd /usr/local/solr-cloud/zookeeper01/bin
./zkServer.sh start

cd /usr/local/solr-cloud/zookeeper02/bin
./zkServer.sh start

cd /usr/local/solr-cloud/zookeeper03/bin
./zkServer.sh start

ESC
輸入:wq儲存退出。
修改檔案可執行許可權:

[[email protected] solr-cloud]# chmod u+x zookeeper_start_all.sh

c) 啟動所有zookeeper例項

[[email protected] solr-cloud]# ./zookeeper_start_all.sh 
JMX enabled by default
Using config: /usr/local/solr-cloud/zookeeper01/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
JMX enabled by default
Using config: /usr/local/solr-cloud/zookeeper02/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
JMX enabled by default
Using config: /usr/local/solr-cloud/zookeeper03/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[[email protected] solr-cloud]#

檢視zookeeper的狀態:

[[email protected] solr-cloud]# zookeeper01/bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/solr-cloud/zookeeper01/bin/../conf/zoo.cfg
Error contacting service. It is probably not running.
[[email protected] solr-cloud]# 

明明已經啟動了,但是zookeeper的狀態卻是沒有啟動,為什麼呢?
原因是:本博主的是CentOS7,防火牆使用的是firewalld,我們使用修改配置檔案的方式來新增用到的埠(修改後需要重啟firewalld服務):

[[email protected] zones]# pwd
/etc/firewalld/zones
[[email protected] zones]# vim public.xml

新增內容如下:

儲存退出後,然後我們重啟firewalld服務:

[[email protected] zones]# service firewalld restart
Redirecting to /bin/systemctl restart firewalld.service
[[email protected] zones]#

其實我們在啟動所有zookeeper例項之前還可以關閉虛擬機器的防火牆,但是生產環境中不建議這麼做

systemctl stop firewalld.service        #停止firewall服務
systemctl disable firewalld.service     #禁止firewall服務開機啟動
firewall-cmd --state                    #檢視預設防火牆狀態(關閉後顯示notrunning,開啟後顯示running)

d) 再次啟動所有zookeeper例項,檢視zookeeper的狀態:
效果如下:

[[email protected] solr-cloud]# zookeeper01/bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/solr-cloud/zookeeper01/bin/../conf/zoo.cfg
Mode: follower
[[email protected] solr-cloud]# zookeeper02/bin/zkServer.sh status 
JMX enabled by default
Using config: /usr/local/solr-cloud/zookeeper02/bin/../conf/zoo.cfg
Mode: follower
[[email protected] solr-cloud]# zookeeper03/bin/zkServer.sh status 
JMX enabled by default
Using config: /usr/local/solr-cloud/zookeeper03/bin/../conf/zoo.cfg
Mode: leader

4.2、Solr叢集的搭建

第一步:建立四個tomcat例項。每個tomcat執行在不同的埠。8180、8280、8380、8480。

[[email protected] ~]# ll
總用量 4
drwxr-xr-x.  9 root  root   160 11月 20 17:09 apache-tomcat-7.0.47
drwxr-xr-x.  4 root  root   225 11月 20 19:23 IK Analyzer 2012FF_hf1
drwxr-xr-x.  8 root  root   218 11月 20 17:07 solr-4.10.3
drwxr-xr-x. 10 bruce bruce 4096 2月  20 2014 zookeeper-3.4.6
[[email protected] ~]# cp -r apache-tomcat-7.0.47/ /usr/local/solr-cloud/tomcat01
[[email protected] ~]# cp -r apache-tomcat-7.0.47/ /usr/local/solr-cloud/tomcat02
[[email protected] ~]# cp -r apache-tomcat-7.0.47/ /usr/local/solr-cloud/tomcat03
[[email protected] ~]# cp -r apache-tomcat-7.0.47/ /usr/local/solr-cloud/tomcat04
[[email protected] ~]# vim /usr/local/solr-cloud/tomcat01/conf/server.xml
[[email protected] ~]# vim /usr/local/solr-cloud/tomcat02/conf/server.xml
[[email protected] ~]# vim /usr/local/solr-cloud/tomcat03/conf/server.xml
[[email protected] ~]# vim /usr/local/solr-cloud/tomcat04/conf/server.xml

修改內容為:8005-->8105、8080-->8180、8009-->8109
修改內容為:8005-->8205、8080-->8280、8009-->8209
修改內容為:8005-->8305、8080-->8380、8009-->8309
修改內容為:8005-->8405、8080-->8480、8009-->8409

其餘tomcat同理。
第二步:部署solr的war包。把單機版的solr工程例項複製到叢集中的tomcat中去。

[[email protected] solr-cloud]# cp -r ../solr/tomcat/webapps/solr/ tomcat01/webapps/ 
[[email protected] solr-cloud]# cp -r ../solr/tomcat/webapps/solr/ tomcat02/webapps/
[[email protected] solr-cloud]# cp -r ../solr/tomcat/webapps/solr/ tomcat03/webapps/
[[email protected] solr-cloud]# cp -r ../solr/tomcat/webapps/solr/ tomcat04/webapps/

第三步:為每個solr工程例項建立一個對應的solrhome。使用單機版的solrhome複製四份。

[[email protected] solr-cloud]# cp -r ../solr/solrhome/ solrhome01
[[email protected] solr-cloud]# cp -r ../solr/solrhome/ solrhome02
[[email protected] solr-cloud]# cp -r ../solr/solrhome/ solrhome03
[[email protected] solr-cloud]# cp -r ../solr/solrhome/ solrhome04
[[email protected] solr-cloud]# ll
總用量 24
drwxr-xr-x.  4 root root   85 11月 23 18:59 solrhome01
drwxr-xr-x.  4 root root   85 11月 23 18:59 solrhome02
drwxr-xr-x.  4 root root   85 11月 23 18:59 solrhome03
drwxr-xr-x.  4 root root   85 11月 23 18:59 solrhome04
drwxr-xr-x.  9 root root  160 11月 23 18:41 tomcat01
drwxr-xr-x.  9 root root  160 11月 23 18:37 tomcat02
drwxr-xr-x.  9 root root  160 11月 23 18:37 tomcat03
drwxr-xr-x.  9 root root  160 11月 23 18:37 tomcat04
drwxr-xr-x. 11 root root 4096 11月 23 17:03 zookeeper01
drwxr-xr-x. 11 root root 4096 11月 23 17:08 zookeeper02
drwxr-xr-x. 11 root root 4096 11月 23 17:09 zookeeper03
-rwxr--r--.  1 root root  185 11月 23 17:33 zookeeper_start_all.sh
-rwxr--r--.  1 root root  188 11月 23 18:31 zookeeper_status_all.sh
-rwxr--r--.  1 root root  182 11月 23 17:59 zookeeper_stop_all.sh
[[email protected] solr-cloud]# 

第四步:需要修改solr的web.xml檔案。把solr和solrhome關聯起來。

[[email protected] tomcat01]# pwd
/usr/local/solr-cloud/tomcat01
[[email protected] tomcat01]# vim webapps/solr/WEB-INF/web.xml

修改內容如下:

其餘的web.xml同理修改。
第五步:配置SolrCloud相關的配置。每個solrhome下都有一個solr.xml,把其中的ip及埠號配置好。

[[email protected] solrhome01]# pwd
/usr/local/solr-cloud/solrhome01
[[email protected] solrhome01]# vim solr.xml

修改內容如下:
192.168.25.154
8180

192.168.25.154
8280

192.168.25.154
8380

192.168.25.154
8480

修改配置如下:

其餘的solr.xml同理。
第六步:修改(4個)每一個tomcat/bin目錄下的catalina.sh 檔案,關聯solr和zookeeper。
把此配置新增到配置檔案中:JAVA_OPTS="-DzkHost=192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183"

[[email protected] solr-cloud]# vim  tomcat01/bin/catalina.sh

新增內容如下:

其餘的tomcat同理修改。
第七步:讓zookeeper統一管理solr的配置檔案。需要把solrhome/collection1/conf目錄上傳到zookeeper。上傳任意solrhome中的配置檔案即可。(前提:需要保證zookeeper叢集是啟動的狀態)
使用工具上傳配置檔案,工具位置:/root/solr-4.10.3/example/scripts/cloud-scripts/zkcli.sh

[[email protected] cloud-scripts]# pwd
/root/solr-4.10.3/example/scripts/cloud-scripts
[[email protected] cloud-scripts]# ./zkcli.sh -zkhost 192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183 -cmd upconfig -confdir /usr/local/solr-cloud/solrhome01/collection1/conf/ -confname myconf

檢視是否上傳成功,檢視zookeeper上的配置檔案:
使用zookeeper目錄下的bin/zkCli.sh命令檢視zookeeper上的配置檔案:

[[email protected] solr-cloud]# pwd
/usr/local/solr-cloud
[[email protected] solr-cloud]# cd zookeeper01/bin/
[[email protected] bin]# ./zkCli.sh 
[zk: localhost:2181(CONNECTED) 0] ls /
[configs, zookeeper]
[zk: localhost:2181(CONNECTED) 1] ls /configs
[myconf]
[zk: localhost:2181(CONNECTED) 2] ls /configs/myconf
[admin-extra.menu-top.html, currency.xml, protwords.txt, mapping-FoldToASCII.txt, _schema_analysis_synonyms_english.json, _rest_managed.json, solrconfig.xml, _schema_analysis_stopwords_english.json, stopwords.txt, lang, spellings.txt, mapping-ISOLatin1Accent.txt, admin-extra.html, xslt, synonyms.txt, scripts.conf, update-script.js, velocity, elevate.xml, admin-extra.menu-bottom.html, schema.xml, clustering]
[zk: localhost:2181(CONNECTED) 3] quit
Quitting...
2018-11-23 20:32:38,846 [myid:] - INFO  [main:[email protected]] - Session: 0x16740142eaf0000 closed
2018-11-23 20:32:38,851 [myid:] - INFO  [main-EventThread:[email protected]] - EventThread shut down
[[email protected] bin]# 

注意:如果連線的預設埠2181被佔用,想要連線其他節點使用如下命令:

[[email protected] bin]# ./zkCli.sh -server 192.168.25.154:2182

解釋:
    -server     指定ip地址
    :2182       指定連線的埠

第八步:啟動每個tomcat例項。注意:要保證zookeeper叢集是啟動狀態。
我們可以寫一個批處理檔案,批量啟動tomcat。

[[email protected] solr-cloud]# ./tomcat_start_all.sh
Using CATALINA_BASE:   /usr/local/solr-cloud/tomcat01
Using CATALINA_HOME:   /usr/local/solr-cloud/tomcat01
Using CATALINA_TMPDIR: /usr/local/solr-cloud/tomcat01/temp
Using JRE_HOME:        /usr/local/java/jdk1.7.0_80/jre
Using CLASSPATH:       /usr/local/solr-cloud/tomcat01/bin/bootstrap.jar:/usr/local/solr-cloud/tomcat01/bin/tomcat-juli.jar
Using CATALINA_BASE:   /usr/local/solr-cloud/tomcat02
Using CATALINA_HOME:   /usr/local/solr-cloud/tomcat02
Using CATALINA_TMPDIR: /usr/local/solr-cloud/tomcat02/temp
Using JRE_HOME:        /usr/local/java/jdk1.7.0_80/jre
Using CLASSPATH:       /usr/local/solr-cloud/tomcat02/bin/bootstrap.jar:/usr/local/solr-cloud/tomcat02/bin/tomcat-juli.jar
Using CATALINA_BASE:   /usr/local/solr-cloud/tomcat03
Using CATALINA_HOME:   /usr/local/solr-cloud/tomcat03
Using CATALINA_TMPDIR: /usr/local/solr-cloud/tomcat03/temp
Using JRE_HOME:        /usr/local/java/jdk1.7.0_80/jre
Using CLASSPATH:       /usr/local/solr-cloud/tomcat03/bin/bootstrap.jar:/usr/local/solr-cloud/tomcat03/bin/tomcat-juli.jar
Using CATALINA_BASE:   /usr/local/solr-cloud/tomcat04
Using CATALINA_HOME:   /usr/local/solr-cloud/tomcat04
Using CATALINA_TMPDIR: /usr/local/solr-cloud/tomcat04/temp
Using JRE_HOME:        /usr/local/java/jdk1.7.0_80/jre
Using CLASSPATH:       /usr/local/solr-cloud/tomcat04/bin/bootstrap.jar:/usr/local/solr-cloud/tomcat04/bin/tomcat-juli.jar
[[email protected] solr-cloud]#

第九步:檢視每一個tomcat啟動狀態。發現tomcat都啟動成功。

[[email protected] ~]# cd /usr/local/solr-cloud/tomcat01
[[email protected] tomcat01]# tail -f logs/catalina.out

第十步:通過瀏覽器訪問solr叢集。
訪問地址:http://192.168.25.154:8180/solr

點選Cloud按鈕

第十一步:建立新的Collection並進行分片處理。
在瀏覽器位址列輸入:http://192.168.25.154:8180/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2

再重新訪問地址:http://192.168.25.154:8180/solr

第十二步:刪除不用的Collection。
在瀏覽器位址列輸入:http://192.168.25.154:8180/solr/admin/collections?action=DELETE&name=collection1

再重新訪問地址:http://192.168.25.154:8180/solr

5、使用solrJ管理solr叢集

5.1、新增文件

使用步驟:
  第一步:把solrJ相關的jar包新增到工程中。在Maven工程中則是新增依賴。
  第二步:建立一個SolrServer物件(抽象類),使用HttpSolrServer建立物件(連線單機版solr),使用CloudSolrServer建立物件(連線叢集版solr)。需要使用CloudSolrServer子類。構造方法的引數是zookeeper的地址列表
  第三步:需要設定DefaultCollection屬性。不設定,會報錯。
  第四步:建立一個文件物件SolrInputDocument物件。
  第五步:向文件物件中新增域。
  第六步:把文件物件寫入索引庫。
  第七步:提交。
測試程式碼如下:

	/**
	 * 向索引庫中新增索引(叢集版)
	 * @throws Exception
	 */
	@Test
	public void solrCloudAddDocumentTest() throws Exception {
		// 第一步:把solrJ相關的jar包新增到工程中。在Maven工程中則是新增依賴。
		// 第二步:建立一個SolrServer物件(抽象類),使用HttpSolrServer建立物件(連線單機版solr),使用CloudSolrServer建立物件(連線叢集版solr)。
		// 需要使用CloudSolrServer子類。構造方法的引數是zookeeper的地址列表。使用逗號分隔。
		CloudSolrServer solrServer = new CloudSolrServer("192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183");
		// 第三步:需要設定DefaultCollection屬性。不設定,會報錯。
		solrServer.setDefaultCollection("collection2");
		// 第四步:建立一個文件物件SolrInputDocument物件。
		SolrInputDocument document = new SolrInputDocument();
		// 第五步:向文件物件中新增域。
		document.addField("id", "test001");
		document.addField("item_title", "測試商品名稱");
		document.addField("item_price", 100);
		// 第六步:把文件物件寫入索引庫。
		solrServer.add(document);
		// 第七步:提交。
		solrServer.commit();
	}

5.2、查詢文件

  建立一個CloudSolrServer物件,其他處理和單機版一致。不在贅述!

6、把搜尋功能切換到solr叢集版

我們先將上面5、使用solrJ管理solr叢集生成的測試資料從叢集版的solr索引庫中刪除掉。
點選【Documents】–> 點選【Document Type】選擇為【XML】,在【Document(s)】中輸入如下內容:

<delete>
    <query>*:*</query>
</delete>
<commit/>

點選【Submit Document】按鈕。
因為我們使用的SolrServer物件(抽象類),是HttpSolrServer物件和CloudSolrServer物件的父類,所以我們的實現類程式碼不需要進行修改,只要修改solr的配置檔案applicationContext-solr.xml即可,如下:

7、HttpClient

7.1、HttpClient簡介

  HttpClient 是 Apache Jakarta Common 下的子專案,可以用來提供高效的、最新的、功能豐富的支援 HTTP 協議的客戶端程式設計工具包,並且它支援 HTTP 協議最新的版本和建議。
  HttpClient 提供的主要的功能:
    (1)實現了所有 HTTP 的方法(GET、POST、PUT、DELETE等)
    (2)支援自動轉向
    (3)支援 HTTPS 協議
    (4)支援代理伺服器等(翻牆)
  我們所用的solrj其實就封裝了HttpClient。

7.2、學習HttpClient

http狀態碼:

常用的:200、201、202、400、404、405、406、415、500、501、502、503

由於我們沒有手機端,所以我們通過以下工程進行學習httpclient:

7.2.1、無引數的GET請求

HttpClient它是模擬瀏覽器請求。通過程式碼來模擬瀏覽器請求。

7.2.2、帶引數的GET請求

public class DoGETParam {

	public static void main(String[] args) throws Exception {

		// 建立HttpClient物件
		CloseableHttpClient httpclient = HttpClients.createDefault();

		// 定義請求的引數
		// 方式一:new URIBuilder("http://localhost:8081/item/list").addParameter("a", "1").addParameter("a", "2").build(); 
		// 方式一效果:http://localhost:8081/item/list?a=1&a=2
		// 方式二:new URIBuilder("http://localhost:8081/item/list").setParameter("a", "1").setParameter("a", "10").build();
		// 方式二效果:http://localhost:8081/item/list?a=2
		URI uri = new URIBuilder("http://localhost:8081/item/list").setParameter("page", "1").setParameter("rows", "10").build();

		System.out.println(uri);

		// 建立http GET請求
		HttpGet httpGet = new HttpGet(uri);

		CloseableHttpResponse response = null;
		try {
			// 執行請求
			response = httpclient.execute(httpGet);
			// 判斷返回狀態是否為200
			if (response.getStatusLine().getStatusCode() == 200) {
				String content = EntityUtils.toString(response.getEntity(), "UTF-8");
				System.out.println(content);
			}
		} finally {
			if (response != null) {
				response.close();
			}
			httpclient.close();
		}
	}
}

7.2.3、無引數的POST請求

public class DoPOST {

    public static void main(String[] args) throws Exception {

        // 建立HttpClient物件
        CloseableHttpClient httpclient = HttpClients.createDefault();

        // 建立http POST請求
        HttpPost httpPost = new HttpPost("http://www.oschina.net/");

        httpPost.setHeader("User-Agent", "");
        
        CloseableHttpResponse response = null;
        try {
            // 執行請求
            response = httpclient.execute(httpPost);
            // 判斷返回狀態是否為200
            if (response.getStatusLine().getStatusCode() == 200) {
                String content = EntityUtils.toString(response.getEntity(), "UTF-8");
                System.out.println(content);
            }
        } finally {
            if (response != null) {
                response.close();
            }
            httpclient.close();
        }
    }
}

7.2.4、帶引數的POST請求

public class DoPOSTParam {

    public static void main(String[] args) throws Exception {

        // 建立HttpClient物件
        CloseableHttpClient httpclient = HttpClients.createDefault();

        // 建立http POST請求
        // 新增商品的url:/item/save
        HttpPost httpPost = new HttpPost("http://localhost:8081/item/save");

        //cid=560&title=httpclient&sellPoint=asfdafaf...
        // 設定2個post引數,一個是scope、一個是q
        List<NameValuePair> parameters = new ArrayList<NameValuePair>(0);
        parameters.add(new BasicNameValuePair("cid", "560"));
        parameters.add(new BasicNameValuePair("title", "httpclient"));
        parameters.add(new BasicNameValuePair("sellPoint", "asfdafaf"));
        parameters.add(new BasicNameValuePair("price", "1200"));
        parameters.add(new BasicNameValuePair("num", "213"));
        // 構造一個form表單式的實體
        UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters);
        // 將請求實體設定到httpPost物件中
        httpPost.setEntity(formEntity);

        CloseableHttpResponse response = null;
        try {
            // 執行請求
            response = httpclient.execute(httpPost);
            // 判斷返回狀態是否為200
            if (response.getStatusLine().getStatusCode() == 200) {
                String content = EntityUtils.toString(response.getEntity(), "UTF-8");
                System.out.println(content);
            }
        } finally {
            if (response != null) {
                response.close();
            }
            httpclient.close();
        }
    }
}

8、使用HttpClient呼叫介面

8.1、編寫返回響應的實體類

/**
 * 返回響應的實體類
 * @author	chenmingjun
 * @date	2018年11月24日下午4:52:44
 * @version 1.0
 */
public class HttpResult {
	
	private Integer code; // 響應狀態碼

	private String body; // 響應的內容

	public HttpResult(Integer code, String body) {
		super();
		this.code = code;
		this.body = body;
	}

	public HttpResult() {
		super();
	}

	public Integer getCode() {
		return code;
	}

	public void setCode(Integer code) {
		this.code = code;
	}

	public String getBody() {
		return body;
	}

	public void setBody(String body) {
		this.body = body;
	}
	
	@Override
	public String toString() {
		return "HttpResult [code=" + code + ", body=" + body + "]";
	}
}

8.2、封裝HttpClient

/**
 * HttpClient API
 * @author	chenmingjun
 * @date	2018年11月24日下午5:11:33
 * @version 1.0
 */
public class APIService {

	/**
	 * 1.不帶引數的GET請求的方法
	 * @param url 請求的URL
	 * @return HttpResult 要返回http狀態碼以及響應的內容
	 * @throws Exception
	 */
	public HttpResult doget(String url) throws Exception {
		
            
           

相關推薦

day74_商城專案_07_ zookeeper叢集搭建 + solrcloud叢集搭建 + 搜尋功能切換叢集 + httpclient學習 + 全域性異常處理器 + 附錄_匠心筆記

淘淘商城專案_07 1、什麼是SolrCloud 2、Solr叢集的系統架構 2.1、SolrCloud的物理結構 2.2、SolrCloud的邏輯結構 2.2.1、Collection

day74_商城專案_07_solrcloud搭建 + zookeeper叢集搭建 + 搜尋功能切換叢集 + httpclient學習 + 全域性異常處理器 + 附錄_匠心筆記

課程計劃 1、solr叢集的搭建 2、使用solrJ管理solr叢集 3、把搜尋功能切換到solr叢集版 4、httpclient 5、全域性異常處理 1、什麼是SolrCloud   SolrCloud(solr 雲)是Solr提供的分散式搜尋

day70_商城專案_03_商品類目選擇 + 圖片上傳 + 圖片伺服器FastDFS + 富文字編輯器KindEditor + 新增商品_匠心筆記

淘淘商城專案_03 1、商品類目選擇 1.1、功能分析 1.1.1、資料庫表結構設計 1.1.2、前端頁面分析 1.2、服務層工程開發 1.2.1、Dao

day72_商城專案_05_首頁輪播圖顯示實現 + redis的安裝及使用 + redis叢集環境搭建 + redis實現快取 + 快取同步_匠心筆記

淘淘商城專案_05 1、首頁輪播圖的展示 1.1、功能分析 1.2、Dao層 1.3、Service層 1.3.1、釋出服務 1.4、表現層 1.

day69_商城專案_02_dubbo介紹 + dubbo框架整合 + zookeeper + 商品列表查詢實現 + 分頁 + 逆向工程_匠心筆記

淘淘商城專案_02 1、功能分析 1.1、後臺系統所用的技術 1.2、建立資料庫 1.3、Mybatis逆向工程 1.4、系統間通訊問題 1.4.1、分析

day68_商城專案_01_電商介紹 + 網際網路術語 + SOA + 分散式 + 叢集介紹 + 環境配置 + 框架搭建_匠心筆記

淘淘商城專案_01 1、電商行業的背景介紹--電子商務 1.1、11.11 1.2、電商行業技術特點 2、淘淘商城的系統架構 2.1、淘淘商城介紹 2.2、功能介紹 2

商城專案_同步索引庫問題分析 + ActiveMQ介紹/安裝/使用 + ActiveMQ整合spring + 使用ActiveMQ實現新增商品後同步索引庫_匠心筆記

文章目錄 1、同步索引庫問題分析 2、ActiveM的介紹 2.1、什麼是ActiveMQ 2.2、ActiveMQ的訊息形式 3、ActiveMQ的安裝 3.1、安裝環境 3.2、安裝步驟

day79_商城專案_12_購物車流程 + 商城購物車系統的搭建 + 商城購物車系統的實現分析 + 購物車實現增刪改查_匠心筆記

課程計劃 1、購物車的流程 2、購物車的實現 a) 登入狀態下的購物車實現 b) 未登入狀態下的購物車實現 1、購物車流程 1.1、以前的購物車流程 使用者將商品新增到購物車時,判斷使用者是否登入,如果已經登入將購物車放入se

day81_商城專案_14_專案釋出 + Linux下安裝mysql + tomcat熱部署 + 資料庫分庫分表 + Mycat學習_匠心筆記

第十四天: 1、Linux上mysql的安裝 2、系統的部署 3、mycat的介紹 4、專案總結 5、面試中的問題 1、開發流程淺解 2、專案釋出前的準備 1、測試  a) 本地單元測試  b) 測試環境測試(1,2,3,4,5)  c) 使用

day82_商城_15_專案的總結 + 專案中的問題_匠心筆記

專案的總結 第一天: 學習電商行業的背景,電商模式:B2B、B2C、B2B2C、O2O。分散式,叢集的理解,系統的架構,基於SSO的架構。使用Maven搭建後臺工程,及SVN的使用。 第二天: dubbo的學習和使用,系統和系統之間通訊的中介軟體。webservice :系統之間通訊。應

day73_商城專案_06_solr索引庫搭建 + solr搜尋功能實現 + 圖片顯示等問題解決_匠心筆記

課程計劃 第六天: 1、搜尋工程的搭建 2、linux下solr服務的搭建 3、測試使用solrJ管理索引庫 4、把商品資料匯入到索引庫中(後臺功能) 5、商品搜尋功能實現(前臺功能) 1、搜尋工程的搭建 要實現搜尋功能,需要搭建solr服務、搜尋服務工程、搜尋系統(表

帶你逐步深入瞭解SSM框架——商城專案之框架整合,後臺系統搭建

1.  今日計劃 1、  SSM框架整合 2、  mybatis逆向工程 3、  商品列表 4、  商品列表分頁處理 2.  SSM框架整合 2.1. 後臺系統所用的技術 框架:Spring + SpringMVC +Mybatis 前端:EasyUI 資料庫:mysql

day82_商城專案_15_專案總結 + 專案中的問題_匠心筆記

專案總結 第一天 1、電商行業的背景,b2b、b2c、b2b2c、c2c、o2o2。 2、系統的架構。基於SOA的架構。 3、工程搭建。使用maven管理工程。 4、svn的使用。 第二天 1、ssm框架整合。 2、使用dubbo進行通訊   1)服務提供者   2)服務消費者

day81_商城專案_14_專案釋出 + Linux下安裝mysql + tomcat熱部署 + 反向代理的配置 + 資料庫分庫分表 + Mycat學習_匠心筆記

淘淘商城專案_14 1、開發流程淺解 2、專案釋出前的準備 3、專案部署 3.1、Linux下安裝mysql 3.2、專案架構講解 3.3、系統功能介紹 3.4、網路拓撲圖 3.5

day80_商城專案_13_訂單系統搭建 + 展示訂單確認頁面 + 使用者身份認證(SpringMVC攔截器) + 實現提交訂單功能_匠心筆記

淘淘商城專案_13 1、訂單系統搭建 1.1、功能分析 1.2、工程搭建 1.2.1、建立訂單服務層工程 1.2.2、建立訂單表現層工程 2、展示訂單確認頁面

day79_商城專案_12_購物車流程 + 商城購物車系統的搭建 + 商城購物車系統的實現分析(cookie+redis方案) + 購物車實現增刪改查_匠心筆記

淘淘商城專案_12 1、購物車流程 1.1、以前的購物車流程 1.2、現在的購物車流程 2、商城購物車系統的搭建 2.1、購物車系統的架構 2.2、服務層工程搭建

day78_商城專案_11_實現SSO系統的登入註冊功能 + 門戶首頁展示使用者名稱 + ajax請求跨域問題詳解_匠心筆記

淘淘商城專案_11 1、服務介面實現 1.1、檢查資料是否可用介面開發 1.1.1、功能分析 1.1.2、Dao 1.1.3、Service 1.1.4、釋出服務

day77_商城專案_10_ Linux下的Nginx代理詳解(配置虛擬主機+實現反向代理+實現負載均衡+高可用) + 單點登入系統工程搭建 + SSO系統介面文件講解_匠心筆記

淘淘商城專案_10 1、目前訪問系統使用的方式存在的問題 2、什麼是nginx 3、nginx的應用場景 4、nginx的安裝 4.1、要求的安裝環境 4.2、安裝步驟 4.3、啟動nginx

day76_商城專案_09_商品詳情頁動態展示實現(jsp+redis) + FreeMarker模板引擎入門 + 商品詳情頁靜態化實現(Win版本的nginx作http伺服器)_匠心筆記

淘淘商城專案_09 1、商品詳情頁面展示,動態展示(jsp + redis) 1.1、工程搭建 1.1.1、pom檔案 1.1.2、框架整合 1.1.3、springmvc.xml

day75_商城專案_08_同步索引庫問題分析 + ActiveMQ介紹/安裝/使用 + ActiveMQ整合spring + 使用ActiveMQ實現新增商品後同步索引庫_匠心筆記

淘淘商城專案_08 1、同步索引庫問題分析 2、ActiveM的介紹 2.1、什麼是ActiveMQ 2.2、ActiveMQ的訊息形式 3、ActiveMQ的安裝 3.1、安裝環