HttpClient和MyCat数据库代理学习

第175次(HttpClient)

HttpClient自定义工具类的使用如何编写一个HttpClient工具类?import java.io.IOException; import java.net.URI; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.utils.URIBuilder; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; 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<NameValuePair>(); 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; } }如何通过HttpClient工具类发送Get、Post请求?

调用工具类的doGet或doPost方法

学习主题:MyCat

MyCat简介什么是MyCat?

MyCat 是目前最流行的基于 java 语言编写的数据库中间件,是一个实现了 MySQL 协议 的服务器,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问, 而其后端可以用 MySQL 原生协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数 主流数据库服务器通信,其核心功能是分库分表。配合数据库的主从模式还可实现读写分离。

MyCat 是基于阿里开源的 Cobar 产品而研发,Cobar 的稳定性、可靠性、优秀的架构和 性能以及众多成熟的使用案例使得 MyCat 变得非常的强大。 MyCat 发展到目前的版本,已经不是一个单纯的 MySQL 代理了,它的后端可以支持 MySQL、SQL Server、Oracle、DB2、PostgreSQL 等主流数据库,也支持 MongoDB 这种新型 NoSQL 方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是那种存储方 式,在 MyCat 里,都是一个传统的数据库表,支持标准的 SQL 语句进行数据的操作,这样 一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。

MyCat有哪些优势?数据量级

单一的 MySQL 其数据存储量级和操作量级有限. Mycat 可以管理若干 MySQL 数据库,同时实现数据的存储和操作.

开源性质

Mycat 是 java 编写的中间件. 开源,免费. 有非常多的人和组织对 Mycat 实行开发,维护,管理,更新. Mycat 版本提升较快,可以跟随环境发展.如果有问题,可以快速解决. Mycat 有开源网站和开源社区.且有官方发布的电子书籍. Mycat 是阿里原应用 corba 转型而来的.

市场应用

2015 年左右,Mycat 在互联网应用中占比非常高.

MyCat中的概念什么是切分?

逻辑上的切分. 在物理层面,是使用多库[database],多表[table]实现的切分.

什么是纵向切分

就是把原本存储于一个库的数据存储到多个库上。 由于对数据库的读写都是对同一个库进行操作,所以单库并不能解决大规模并发写入的 问题。 例如,我们会建立定义数据库 workDB、商品数据库 payDB、用户数据库 userDB、日志 数据库 logDB 等,分别用于存储项目数据定义表、商品定义表、用户数据表、日志数据表等。

优点:1)减少增量数据写入时的锁对查询的影响。 2)由于单表数量下降,常见的查询操作由于减少了需要扫描的记录,使得单表单次查 询所需的检索行数变少,减少了磁盘 IO,时延变短。

缺点:无法解决单表数据量太大的问题。

什么是横向切分

把原本存储于一个表的数据分块存储到多个表上。当一个表中的数据量过大时,我们可 以把该表的数据按照某种规则,进行划分,然后存储到多个结构相同的表,和不同的库上。

例如,我们 userDB 中的 userTable 中数据量很大,那么可以把 userDB 切分为结构相同 的多个 userDB:part0DB、part1DB 等,再将 userDB 上的 userTable,切分为很多 userTable: userTable0、userTable1 等,然后将这些表按照一定的规则存储到多个 userDB 上。

优点: 1)单表的并发能力提高了,磁盘 I/O 性能也提高了。 2)如果出现高并发的话,总表可以根据不同的查询,将并发压力分到不同的小表里面。

缺点:无法实现表连接查询。

什么是逻辑库-Schema

Mycat 中定义的 database.是逻辑上存在的.但是物理上是不存在的. 主要是针对纵向切分提供的概念.

什么是逻辑表-table

Mycat 中定义的 table.是逻辑上存在,物理上是不存在的. 主要是针对横向切分提供的概念.

什么是数据主机 – dataHost

物理 MySQL 存放的主机地址.可以使用主机名,IP,域名定义.

什么是数据节点 – dataNode

配置物理的 database. 数据保存的物理节点.就是 database

什么是分片规则

当控制数据的时候,如何访问物理 database 和 table. 就是访问 dataHost 和 dataNode 的算法. 在 Mycat 处理具体的数据 CRUD 的时候,如何访问 dataHost 和 dataNode 的算法.如:哈希 算法,crc32 算法等.

MyCat的默认端口是多少?

8066

MyCat的使用-读写分离介绍读写分离的原理是什么?

需要搭建主从模式,让主数据库(master)处理事务性增、改、删操作(INSERT、 UPDATE、DELETE),而从数据库(slave)处理 SELECT 查询操作。 Mycat 配合数据库本身的复制功能,可以解决读写分离的问题。

什么是主从备份?

就是一种主备模式的数据库应用. 主库(Master)数据与备库(Slave)数据完全一致. 实现数据的多重备份, 保证数据的安全. 可以在 Master[InnoDB]和 Slave[MyISAM]中使用不同的数据库引擎,实现读写的分离.

主从备份模式是如何实现数据同步的?

所有对 Master 的操作,都会同步到 Slave 中.从机通过读取主机的二进制文件,然后执行里面的操作,对自身实现更新。

MyCat的使用-创建MySQL的主从模式如何在Linux中创建MySQL的主从备份模式?

在两个主机中分别安装mysql

修改Master配置文件my.cnf

添加servier_id=1

添加log_bin=master_log

重启Master Mysql服务

为slave创建用户,并为其host授权,放行端口。

修改slave配置文件my.cnf

添加servier_id=2

停止slave,并配置主库信息,然后再开启slave

对主从模式进行测试。

MyCat的使用-安装MyCat如何安装MyCat?

安装jdk

下载MyCat的压缩文件到服务器/root/temp目录下,解压

将解压的压缩包复制到/usr/local目录

MyCat的使用-server.xml<user>节点的作用是什么?

用户配置节点

<user>节点中name属性的作用是什么?

登录的用户名,也就是连接MyCat的用户名

<user>节点中password属性的作用是什么?

登陆的密码,也就是连接MyCat的密码

<user>节点中schemas属性的作用是什么?

逻辑库名,与schema.xml中的配置关联

<user>节点中privileges属性的作用是什么?

配置用户针对表的增删改查权限

在配置privileges时dml权限顺序是什么顺序?用什么表示权限的开启与禁止?

顺序;增 改 查 删 ,0表示禁止;1表示开启

MyCat的使用-schema.xml<schema>节点的作用是什么?

配置逻辑库的标签,name与schema.xml中schema对相应

<schema>中name属性的作用是什么?

配置逻辑库名称

<schema>中checkSQLschema属性的作用是什么?

是否检测 SQL 语法中的 schema 信息.

checkSQLschema 值是 true, Mycat 发送到数据库的 SQL 是 select * from table; checkSQLschema 只是 false,Mycat 发送的数据库的 SQL 是 select * from A.table;

<schema>中sqlMaxLimit属性的作用是什么?

Mycat 在执行 SQL 的时候,如果 SQL 语句中没有 limit 子句.自动增加 limit 子句. 避免一次 性得到过多的数据,影响效率. limit子句的限制数量默认配置为100.如果SQL中有具体的limit子句,当前属性失效.

<table>节点的作用是什么?

定义逻辑表的标签

<table>中name属性的作用是什么?

逻辑表名

<table>中dataNode属性的作用是什么?

数据节点名称. 即物理数据库中的 database 名称.多个名称使用逗号分隔.

<table>中rule属性的作用是什么?

分片规则名称.具体的规则名称参考 rule.xml 配置文件.

<dataNode>节点的作用是什么?

定义数据节点的标签

<dataNode>中name属性的作用是什么?

数据节点名称, 是定义的逻辑名称,对应具体的物理数据库 database

<dataNode>中dataHost属性的作用是什么?

引用 dataHost 标签的 name 值,代表使用的物理数据库所在位置和配置信息

<dataNode>中database属性的作用是什么?

在 dataHost 物理机中,具体的物理数据库 database 名称.

<dataHost>节点的作用是什么?

定义数据主机的标签

<dataHost>中name属性的作用是什么?

定义逻辑上的数据主机名称

<dataHost>中maxCon/minCon属性的作用是什么?

最大连接数, max connections

最小连接数, min connections

<dataHost>中dbType属性的作用是什么?

数据库类型 : mysql 数据库

<dataHost>中dbDriver属性的作用是什么?

数据库驱动类型, native,使用 mycat 提供的本地驱动.

<writeHost>节点的作用是什么?

写数据的数据库定义标签. 实现读写分离操作

<writeHost>中host属性的作用是什么?

数据库命名

<writeHost>中url属性的作用是什么?

数据库访问路径

<writeHost>中user属性的作用是什么?

数据库访问用户名

<writeHost>中password属性的作用是什么?

访问用户密码

<readHost>节点的作用是什么?

读数据的数据库定义标签. 实现读写分离操作.

<readHost>中host属性的作用是什么?

数据库命名

<readHost>中url属性的作用是什么?

数据库访问路径

<readHost>中url属性的作用是什么?

数据库访问用户名

<readHost>中password属性的作用是什么?

数据库访问密码