第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属性的作用是什么?
数据库密码
分享/讲解/扩展思考
点名提问从第一节课到最后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。