apache httpclient 工具类_HttpClient 和Mycat 主从节点和读写分离
第175次(HttpClient)
學習主題:HttpClient
學習目標:
1 掌握HttpClient自定義工具以及HttpClient具體的使用
對應視頻:
http://www.itbaizhan.cn/course/id/85.html
對應文檔:
無
對應作業
1. HttpClient自定義工具類的使用
(1) 如何編寫一個HttpClient工具類?
HttpClient工具類
public class HttpClientUtil {
public static String doGet(String url, Map<String, String> param) {
// 創建Httpclient對象
CloseableHttpClient httpclient = HttpClients.createDefault();
String resultString = "";
CloseableHttpResponse response = null;
try {
// 創建uri
URIBuilder builder = new URIBuilder(url);
if (param != null) {
for (String key : param.keySet()) {
builder.addParameter(key, param.get(key));
}
}
URI uri = builder.build();
// 創建http GET請求
HttpGet httpGet = new HttpGet(uri);
// 執行請求
response = httpclient.execute(httpGet);
// 判斷返回狀態是否為200
if (response.getStatusLine().getStatusCode() == 200) {
resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (response != null) {
response.close();
}
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return resultString;
}
public static String doGet(String url) {
return doGet(url, null);
}
public static String doPost(String url, Map<String, String> param) {
// 創建Httpclient對象
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String resultString = "";
try {
// 創建Http Post請求
HttpPost httpPost = new HttpPost(url);
// 創建參數列表
if (param != null) {
List<NameValuePair> paramList = new ArrayList<>();
for (String key : param.keySet()) {
paramList.add(new BasicNameValuePair(key, param.get(key)));
}
// 模擬表單
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList,"utf-8");
httpPost.setEntity(entity);
}
// 執行http請求
response = httpClient.execute(httpPost);
resultString = EntityUtils.toString(response.getEntity(), "utf-8");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
response.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return resultString;
}
public static String doPost(String url) {
return doPost(url, null);
}
public static String doPostJson(String url, String json) {
// 創建Httpclient對象
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String resultString = "";
try {
// 創建Http Post請求
HttpPost httpPost = new HttpPost(url);
// 創建請求內容
StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
httpPost.setEntity(entity);
// 執行http請求
response = httpClient.execute(httpPost);
resultString = EntityUtils.toString(response.getEntity(), "utf-8");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
response.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return resultString;
}
}
(2) 如何通過HttpClient工具類發送Get、Post請求?
2. 實戰案例(對應視頻194-198)
(1) 設計一個SOA模式架構的項目,通過HttpClient完成服務調用。實現對用戶表的CRUD操作。(打包源碼)
分享/講解/擴展思考
點名提問從第一節課到最后一節課分別學到了什么,直到同學們把所有的知識點都說出來并且保證無誤。
第176次(MyCat)
學習主題:MyCat
學習目標:
1 掌握什么是MyCat
2 掌握MyCat分庫分表
3 掌握MyCat主從備份,讀寫分離
對應視頻:
http://www.itbaizhan.cn/course/id/85.html
對應文檔:
無
對應作業
3. MyCat簡介
(1) 什么是MyCat?
前身時Cobar
基于java語言編寫的數據庫中間件 可以與多個數據庫進行通信
核心時分庫分表 ,配合數據庫的主從模式還可以實現讀寫分離
(2) MyCat有哪些優勢?
1. 數據量級
單一的Mysql其數據存儲量級和操作量級有限
Mycat可以管理若干Mysql數據庫,同時實現數據的存儲和操作
2. 開源
Mycat時java編寫的中間件,開源免費
3.市場應用占比高
4. MyCat中的概念
5.
(1) 什么是切分?
邏輯上的切分,在物理層面,是使用多庫[database],多表[table]實現的切分
(2) 什么是縱向切分
就是把原本存儲于一個庫的數據存儲到多個庫上。
由于對數據庫的讀寫都是對同一個庫進行操作,所以單庫并不能解決大規模并發寫入的
問題。
例如,我們會建立定義數據庫 workDB、商品數據庫 payDB、用戶數據庫 userDB、日志
數據庫 logDB 等,分別用于存儲項目數據定義表、商品定義表、用戶數據表、日志數據表等。
優點
減少增量數據寫入時的鎖對查詢的影響
由于單表數量下降,常見的查詢操作由于減少了需要掃描的記錄,使得單表單次查詢所需的檢索行數變少,減少了磁盤io,時延變短
缺點:
無法解決單表數據量太大的問題
(3) 什么是橫向切分
把原本存儲于一個表的數據分塊存儲到多個表上,當一個表中的數據量過大時,我們可以把該表的數據按照某種規則,進行劃分,然后存儲到多個結構相同的表,和不同的庫上
例如,我們 userDB 中的 userTable 中數據量很大,那么可以把 userDB 切分為結構相同
的多個 userDB:part0DB、part1DB 等,再將 userDB 上的 userTable,切分為很多 userTable:
userTable0、userTable1 等,然后將這些表按照一定的規則存儲到多個 userDB 上。
優點:
單表的并發能力提高了,磁盤i/o性能也提高了
如果出現高并發的話,總表可以根據不同的查詢,將并發壓力分到不同的小表在里面.
缺點:無法實現表連接查詢
(4) 什么是邏輯庫-Schema
Mycat中定義的database,是邏輯上存在的,但物理上是不存在的
主要針對縱向切分提供的概念
(5) 什么是邏輯表-table
Mycat中定義的table,是邏輯上存在,物理上是不存在的
主要針對橫向切分提供的概念
(6) 什么是數據主機 – dataHost
物理mysql存放的主機地址(集群 ) 可以使用主機名,IP,域名定義
(7) 什么是數據節點 – dataNode
配置物理的database(數據庫),數據保存的物理節點就是dataNode (數據庫)
(8) 什么是分片規則
當控制數據的時候,如何訪問物理的database和table
就是訪問dataHost和dataNode的算法
在Mycat處理具體的數據CRUD的時候,如何訪問dataHost和dataNode的算法,如
哈希算法,crc32算法等
(9) MyCat的默認端口是多少?
6. MyCat的使用-讀寫分離介紹
(1) 讀寫分離的原理是什么?
使用不同的數據庫引擎,實現讀和寫的分離操作,提供所有的操作效率
一個讀一個寫 ,我們只需要他們的數據一致就可以
(2) 什么是主從備份?
就是一種主備模式的數據庫應用
主庫(master)數據和備庫(slave)數據完全一致
實現數據的多重備份,保證數據的安全(讀寫分離的基礎)
(3) 主從備份模式是如何實現數據同步的?
7. MyCat的使用-創建MySQL的主從模式
(1) 如何在Linux中創建MySQL的主從備份模式?
Master(主庫配置)
路徑:/etc/my.cnf
命令:vim /etc/my.cnf
配置server_id=1 (mysql服務的唯一標識,自己寫)
配置要求:
Server_id 任意配置,只要是數字即可
Server_id Master唯一標識數字必須小于Slave唯一標識數字
配置log_bin
本環境中log_bin值:master_log
開啟日志功能以及日志文件命名.log_bin=master_log
變量的值就是日志文件名稱,是日志文件名稱的主體(就是主數據庫中的Binary log如上圖)
Mysql數據庫自動增加文件名后綴和文件類型
重啟mysql
訪問mysql
Mysql -uusername -ppassword
創建用戶和授權
Mysql數據庫中,為不存在的用戶授權,會默認創建此用戶
此用戶是從庫訪問主庫使用的用戶
Ip地址不能寫%,因為主從備份中,當前創建的用戶,是給從庫Slave訪問主庫Master使用的,用戶必須有指定的訪問地址,不能是通用地址
Grant(授予) all privileges(特權) on *.* to ‘username’@’ip’identified(鑒定) by ‘password’ with grant option;
刷新
Flush privileges;
查看用戶
查看master信息(show master status)
關閉防護墻或防火墻中開發3306端口
8. MyCat的使用-安裝MyCat
(1) 如何安裝MyCat?
解壓 至/usr/local
9. MyCat的使用-server.xml
(1) <user>節點的作用是什么?
用戶配置節點
(2) <user>節點中name屬性的作用是什么?
登錄的用戶名,也就是鏈接Mycat的用戶名
(3) <user>節點中password屬性的作用是什么?
登錄的密碼,也就是鏈接Mycat的密碼
(4) <user>節點中schemas屬性的作用是什么?
邏輯庫名,這里會和 schema.xml 中的配置關聯,多個用逗
號分開,例如需要這個用戶管理兩個數據庫 db1,db2,則配置
db1,db2
(5) <user>節點中privileges屬性的作用是什么?
配置用戶針對表的增刪改查的權限
(6) 在配置privileges時dml權限順序是什么順序?用什么表示權限的開啟與禁止?
dml 權限順序為:insert(新增),update(修改),select(查詢),delete(刪除),0000--> 1111,0 為
禁止權限,1 為開啟權限。
10. MyCat的使用-schema.xml
(1) <schema>節點的作用是什么?
配置邏輯庫的標簽
(2) <schema>中name屬性的作用是什么?
邏輯庫名稱
(3) <schema>中checkSQLschema屬性的作用是什么?
是否檢測SQL語法中的schema信息
(4) <schema>中sqlMaxLimit屬性的作用是什么?
Mycat在執行SQL的時候,如果SQl語句中沒有limit子句,自動增加limit子句,避免一次性得到過多的數據,影響效率,limit子句的限制數量默認配置為100,如果SQL中有具體的limit子句,該屬性無效
(5) <table>節點的作用是什么?
定義邏輯表的標簽
(6) <table>中name屬性的作用是什么?
邏輯表名
(7) <table>中dataNode屬性的作用是什么?
定義數據節點的標簽,即物理數據庫中的database名稱,多個名稱使用逗號分隔
(8) <table>中rule屬性的作用是什么?
分片規則名稱,具體的規則名稱參考rule.xml配置文件
(9) <dataNode>節點的作用是什么?
定義數據節點的標簽
(10) <dataNode>中name屬性的作用是什么?
數據節點名稱,是定義的邏輯名稱從,對應具體的物理數據庫database
(11) <dataNode>中dataHost屬性的作用是什么?
引用dataHost標簽的name值,代表使用的物理數據庫所在位置和配置信息
(12) <dataNode>中database屬性的作用是什么?
具體的物理數據庫database名稱
(13) <dataHost>節點的作用是什么?
定義數據主機的名稱
(14) <dataHost>中name屬性的作用是什么?
定義邏輯上的數據主機名稱
(15) <dataHost>中maxCon/minCon屬性的作用是什么?
最大連接數:max connections
最小鏈接數:min connections
(16) <dataHost>中dbType屬性的作用是什么?
Mysql數據庫
(17) <dataHost>中dbDriver屬性的作用是什么?
數據庫驅動類型 native 使用mycat提供的本地驅動
(18) <writeHost>節點的作用是什么?
寫數據的數據庫定義標簽,實現讀寫分離操作
(19) <writeHost>中host屬性的作用是什么?
數據庫命名
(20) <writeHost>中url屬性的作用是什么?
數據庫訪問路徑
(21) <writeHost>中user屬性的作用是什么?
數據庫訪問用戶名
(22) <writeHost>中password屬性的作用是什么?
訪問用戶密碼
(23) <readHost>節點的作用是什么?
數據庫配置
(24) <readHost>中host屬性的作用是什么?
數據庫命名
(25) <readHost>中url屬性的作用是什么?
數據庫訪問路徑
(26) <readHost>中password屬性的作用是什么?
數據庫密碼
分享/講解/擴展思考
點名提問從第一節課到最后一節課分別學到了什么,直到同學們把所有的知識點都說出來并且保證無誤。
總結
以上是生活随笔為你收集整理的apache httpclient 工具类_HttpClient 和Mycat 主从节点和读写分离的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编译php时的configure,PHP
- 下一篇: cad计算总长度插件_超实用的CAD插件