大V推荐!SpringBoot整合MyCat实现读写分离

## 一、网络编程基础回顾 ### 1\. Socket `Socket`本身有“插座”的意思,不是Java中特有的概念,而是一个语言无关的标准,任何可以实现网络编程的编程语言都有`Socket`。在`Linux`环境下,用于表示进程间网络通信的特殊文件类型,其本质为内核借助缓冲区形成的伪文件。既然是文件,那么理所当然的,我们可以使用文件描述符引用套接字。 与管道类似的,`Linux`系统将其封装成文件的目的是为了统一接口,使得读写套接字和读写文件的操作一致。区别是管道主要应用于本地进程间通信,而套接字多应用于网络进程间数据的传递。 可以这么理解:`Socket`就是网络上的两个应用程序通过一个双向通信连接实现数据交换的编程接口API。 `Socket`通信的基本流程具体步骤如下所示: (1)服务端通过`Listen`开启监听,等待客户端接入。 (2)客户端的套接字通过`Connect`连接服务器端的套接字,服务端通过`Accept`接收客户端连接。在`connect-accept`过程中,操作系统将会进行三次握手。 (3)客户端和服务端通过`write`和`read`发送和接收数据,操作系统将会完成`TCP`数据的确认、重发等步骤。 (4)通过`close`关闭连接,操作系统会进行四次挥手。 针对Java编程语言,`java.net`包是网络编程的基础类库。其中`ServerSocket`和`Socket`是网络编程的基础类型。 `SeverSocket`是服务端应用类型。`Socket`是建立连接的类型。当连接建立成功后,服务器和客户端都会有一个`Socket`对象示例,可以通过这个`Socket`对象示例,完成会话的所有操作。对于一个完整的网络连接来说,`Socket`是平等的,没有服务器客户端分级情况。 ### 2\. IO模型介绍 对于一次IO操作,数据会先拷贝到内核空间中,然后再从内核空间拷贝到用户空间中,所以一次`read`操作,会经历两个阶段: (1)等待数据准备 (2)数据从内核空间拷贝到用户空间 基于以上两个阶段就产生了五种不同的IO模式。 1. 阻塞IO:从进程发起IO操作,一直等待上述两个阶段完成,此时两阶段一起阻塞。 2. 非阻塞IO:进程一直询问IO准备好了没有,准备好了再发起读取操作,这时才把数据从内核空间拷贝到用户空间。第一阶段不阻塞但要轮询,第二阶段阻塞。 3. 多路复用IO:多个连接使用同一个select去询问IO准备好了没有,如果有准备好了的,就返回有数据准备好了,然后对应的连接再发起读取操作,把数据从内核空间拷贝到用户空间。两阶段分开阻塞。 4. 信号驱动IO:进程发起读取操作会立即返回,当数据准备好了会以通知的形式告诉进程,进程再发起读取操作,把数据从内核空间拷贝到用户空间。第一阶段不阻塞,第二阶段阻塞。 5. 异步IO:进程发起读取操作会立即返回,等到数据准备好且已经拷贝到用户空间了再通知进程拿数据。两个阶段都不阻塞。 这五种IO模式不难发现存在这两对关系:同步和异步、阻塞和非阻塞。那么稍微解释一下: #### 同步和异步 * **同步:** 同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回。 * **异步:** 异步就是发起一个调用后,立刻得到被调用者的回应表示已接收到请求,但是被调用者并没有返回结果,此时我们可以处理其他的请求,被调用者通常依靠事件,回调等机制来通知调用者其返回结果。 同步和异步的区别最大在于异步的话调用者不需要等待处理结果,被调用者会通过回调等机制来通知调用者其返回结果。 #### 阻塞和非阻塞 * **阻塞:** 阻塞就是发起一个请求,调用者一直等待请求结果返回,也就是当前线程会被挂起,无法从事其他任务,只有当条件就绪才能继续。 * **非阻塞:** 非阻塞就是发起一个请求,调用者不用一直等着结果返回,可以先去干其他事情。 阻塞和非阻塞是针对进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作方法的实现方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入方法会立即返回一个状态值。 如果组合后的同步阻塞(`blocking-IO`)简称`BIO`、同步非阻塞(`non-blocking-IO`)简称`NIO`和异步非阻塞(`asynchronous-non-blocking-IO`)简称`AIO`又代表什么意思呢? * **BIO** (同步阻塞I/O模式): 数据的读取写入必须阻塞在一个线程内等待其完成。这里使用那个经典的烧开水例子,这里假设一个烧开水的场景,有一排水壶在烧开水,BIO的工作模式就是, 叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。但是实际上线程在等待水壶烧开的时间段什么都没有做。 * **NIO**(同步非阻塞): 同时支持阻塞与非阻塞模式,但这里我们以其同步非阻塞I/O模式来说明,那么什么叫做同步非阻塞?如果还拿烧开水来说,NIO的做法是叫一个线程不断的轮询每个水壶的状态,看看是否有水壶的状态发生了改变,从而进行下一步的操作。 * **AIO**(异步非阻塞I/O模型): 异步非阻塞与同步非阻塞的区别在哪里?异步非阻塞无需一个线程去轮询所有IO操作的状态改变,在相应的状态改变后,系统会通知对应的线程来处理。对应到烧开水中就是,为每个水壶上面装了一个开关,水烧开之后,水壶会自动通知我水烧开了。 `java` 中的 `BIO`、`NIO`和`AIO`理解为是 `Java 语言`在操作系统层面对这三种 `IO` 模型的封装。程序员在使用这些 封装API 的时候,不需要关心操作系统层面的知识,也不需要根据不同操作系统编写不同的代码,只需要使用`Java`的API就可以了。由此,为了使读者对这三种模型有个比较具体和递推式的了解,并且和本文主题`NIO`有个清晰的对比,下面继续延伸。 #### Java BIO `BIO`编程方式通常是是Java的上古产品,自JDK 1.0-JDK1.4就有的东西。编程实现过程为:首先在服务端启动一个`ServerSocket`来监听网络请求,客户端启动`Socket`发起网络请求,默认情况下`SeverSocket`会建立一个线程来处理此请求,如果服务端没有线程可用,客户端则会阻塞等待或遭到拒绝。服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理。大致结构如下: ![](http://www.icode9.com/i/li/?n=2&i=images/20210701/1625107784325679.jpg) 如果要让 `BIO` 通信模型能够同时处理多个客户端请求,就必须使用多线程(主要原因是 `socket.accept()`、`socket.read()`、 `socket.write()` 涉及的三个主要函数都是同步阻塞的),也就是说它在接收到客户端连接请求之后为每个客户端创建一个新的线程进行链路处理,处理完成之后,通过输出流返回应答给客户端,线程销毁。这就是典型的 一请求一应答通信模型 。我们可以设想一下如果这个连接不做任何事情的话就会造成不必要的线程开销,不过可以通过**线程池机制**改善,线程池还可以让线程的创建和回收成本相对较低。使用线程池机制改善后的 `BIO` 模型图如下: ![](http://www.icode9.com/i/li/?n=2&i=images/20210701/1625107785101687.jpg) `BIO`方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,是JDK1.4以前的唯一选择,但程序直观简单易懂。`Java BIO`编程示例网上很多,这里就不进行coding举例了,毕竟后面`NIO`才是重点。 #### Java NIO `NIO`(New IO或者No-Blocking IO),从JDK1.4 开始引入的`非阻塞IO`,是一种`非阻塞`+ `同步`的通信模式。这里的`No Blocking IO`用于区分上面的`BIO`。 `NIO`本身想解决 `BIO`的并发问题,通过`Reactor模式`的事件驱动机制来达到`Non Blocking`的。当 `socket` 有流可读或可写入 `socket` 时,操作系统会相应的通知应用程序进行处理,应用再将流读取到缓冲区或写入操作系统。 也就是说,这个时候,已经不是一个连接就 要对应一个处理线程了,而是有效的请求,对应一个线程,当连接没有数据时,是没有工作线程来处理的。 当一个连接创建后,不需要对应一个线程,这个连接会被注册到 `多路复用器`上面,所以所有的连接只需要一个线程就可以搞定,当这个线程中的`多路复用器` 进行轮询的时候,发现连接上有请求的话,才开启一个线程进行处理,也就是一个请求一个线程模式。 `NIO`提供了与传统BIO模型中的`Socket`和`ServerSocket`相对应的`SocketChannel`和`ServerSocketChannel`两种不同的套接字通道实现,如下图结构所示。这里涉及的`Reactor`设计模式、多路复用`Selector`、`Buffer`等暂时不用管,后面会讲到。 ![](http://www.icode9.com/i/li/?n=2&i=images/20210701/1625107785115610.jpg) NIO 方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局 限于应用中,编程复杂,JDK1.4 开始支持。同时,`NIO`和普通IO的区别主要可以从存储数据的载体、是否阻塞等来区分: ![](http://www.icode9.com/i/li/?n=2&i=images/20210701/1625107785383395.jpg) #### Java AIO 与 `NIO` 不同,当进行读写操作时,只须直接调用 API 的 `read` 或 `write` 方法即可。这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入 `read` 方 法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将 `write` 方法传递的流写入完毕时,操作系统主动通知应用程序。即可以理解为,`read/write` 方法都是异步的,完成后会主动调用回调函数。在 `JDK7` 中,提供了异步文件通道和异步套接字通道的实现,这部分内容被称作 `NIO`. `AIO` 方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用 `OS` 参与并发操作,编程比较复杂,`JDK7` 开始支持。 目前来说 `AIO` 的应用还不是很广泛,`Netty` 之前也尝试使用过 `AIO`,不过又放弃了。 ## 二、NIO核心组件介绍 ### 1\. Channel 在`NIO`中,基本所有的IO操作都是从`Channel`开始的,`Channel`通过`Buffer(缓冲区)`进行读写操作。 `read()`表示读取通道中数据到缓冲区,`write()`表示把缓冲区数据写入到通道。 ![](http://www.icode9.com/i/li/?n=2&i=images/20210701/1625107785804448.jpg) `Channel`有好多实现类,这里有三个最常用: * `SocketChannel`:一个客户端发起TCP连接的Channel * `ServerSocketChannel`:一个服务端监听新连接的TCP Channel,对于每一个新的Client连接,都会建立一个对应的SocketChannel * `FileChannel`:从文件中读写数据 其中`SocketChannel`和`ServerSocketChannel`是网络编程中最常用的,一会在最后的示例代码中会有讲解到具体用法。 ### 2\. Buffer #### 概念 `Buffer`也被成为内存缓冲区,本质上就是内存中的一块,我们可以将数据写入这块内存,之后从这块内存中读取数据。也可以将这块内存封装成`NIO Buffer`对象,并提供一组常用的方法,方便我们对该块内存进行读写操作。 `Buffer`在`java.nio`中被定义为抽象类: ![](http://www.icode9.com/i/li/?n=2&i=images/20210701/1625107785512575.jpg) 我们可以将`Buffer`理解为一个数组的封装,我们最常用的`ByteBuffer`对应的数据结构就是`byte[]` #### 属性 `Buffer`中有4个非常重要的属性:**capacity、limit、position、mark** ![](http://www.icode9.com/i/li/?n=2&i=images/20210701/1625107785530596.jpg) # 难道这样就够了吗?不,远远不够! 提前多熟悉阿里往年的面试题肯定是对面试有很大的帮助的,但是作为技术性职业,手里有实打实的技术才是你面对面试官最有用的利器,这是从内在散发出来的自信。 备战阿里时我花的最多的时间就是在学习技术上,占了我所有学习计划中的百分之70,这是一些我学习期间觉得还是很不错的一些学习笔记,以及学习视频都是[可以点击这里免费领取](https://docs.qq.com/doc/DSmxTbFJ1cmN1R2dB)的! 我为什么要写这篇文章呢,其实我觉得学习是不能停下脚步的,在网络上和大家一起分享,一起讨论,不单单可以遇到更多一样的人,还可以扩大自己的眼界,学习到更多的技术,我还会在csdn、博客、掘金等网站上分享技术,这也是一种学习的方法。 今天就分享到这里了,谢谢大家的关注,以后会分享更多的干货给大家! ![阿里一面就落马,恶补完这份“阿里面试宝典”后,上岸蚂蚁金服](http://www.icode9.com/i/li/?n=2&i=images/20210701/1625107785908715.jpg) ![阿里一面就落马,恶补完这份“阿里面试宝典”后,上岸蚂蚁金服](http://www.icode9.com/i/li/?n=2&i=images/20210701/1625107786868466.jpg) ![image.png](http://www.icode9.com/i/li/?n=2&i=images/20210701/1625107786709784.jpg) #

原文地址:https://blog.51cto.com/u_15288758/2962798

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Mycat是什么?MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一
转自:https://www.cnblogs.com/ivictor/p/5111495.html参考:https://www.cnblogs.com/damumu/p/7320258.htmlMyCAT是mysql中间件,前身是阿里大名鼎鼎的Cobar,Cobar在开源了一段时间后,不了了之。于是MyCAT扛起了这面大旗,在大数据时代,其重要性愈发彰显。这篇文章主要是MyCAT的入门部署
1.在数据库做好主从同步的情况下搭建mycat。下载mycat,解压。修改server.xml文件,修改schema.xml待完善启动mycat。参考文章:https://blog.csdn.net/yelllowcong/article/details/79063546https://www.cnblogs.com/NingKangMing/p/6143834.html
集群的服务器列表在10.11.0.210和10.11.0.216中部署mycat和haproxy(因为实验机器性能有限,实际生产环境中需要单独用服务做haproxy反向代理) 两台机器的Mycat配置和haproxy保持一致即haproxyàmycatàpxc集群àmysql分片 Mycat的相关配置Server.xml[root@node6
Mycat是什么?·一个彻底开源的,面向企业应用开发的大数据库集群·支持事务、ACID、可以替代MySQL的加强版数据库·一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群·一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQLServer·结合传统数据库和新型分布式数
<system>配置Mycat系统参数 <system>  <propertyname="serverPort">3306</property><!--mycat服务端口-->  <propertyname="managerPort">9066</property><!--mycat管理端口-->  <propertyname=&q
数据库中间件:mycat逻辑库:即mycat服务上的数据库,并非实际mysql服务上的数据库。逻辑表:与逻辑库同理。数据节点:是mycat逻辑表与mysql物理表的对应关系,mycat服务上某个库中的某个表的数据可能是由不同mysql服务器上数据库中表的数据组成。具体哪个逻辑表对应mysql的哪个实际
MyCat的官方网站:http://www.mycat.org.cn/下载地址:https://github.com/MyCATApache/Mycat-download第一步:下载wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz 并解压Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
show@@sql;Emptyset(0.01sec)一直查不出数据查看在Mycat中执行过的SQL语句,需要确认server.xml配置文件中的<propertyname="useSqlStat">1</property>刚开始一直出不来数据,最后发现是没开启的原因。。。。。。1. 连接mycat9066管理端口   mysql-h127.0.0.1-
Mysql分布式集群部署mycat分库分表系列(共三套)系列一:《分布式集群+分库分表实战教程》本套课程将通过分布式集群和分库分表两部分内容进行讲解1、主要解决针对大型网站架构中持久化部分中,大量数据存储以及高并发访问所带来是数据读写问题。分布式是将一个业务拆分为多个子业务
1、下载系统安装包选择相应的版本进行下载,地址:http://dl.mycat.io/ 。Mycat数据库分库分表中间件介绍 http://www.mycat.io/2、安装安装mycat前需要保证系统已安装过jdk和mysql,将下载好的mycat安装包解压到某个目录下,然后进入mycat解压目录下的bin目录(打开cmd控制台确保是以管
原文:学会数据库读写分离、分表分库https://www.cnblogs.com/joylee/p/7513038.html系统开发中,数据库是非常重要的一个点。除了程序的本身的优化,如:SQL语句优化、代码优化,数据库的处理本身优化也是非常重要的。主从、热备、分表分库等都是系统发展迟早会遇到的技术问题问题。Mycat
MyCAT是mysql中间件,前身是阿里大名鼎鼎的Cobar,Cobar在开源了一段时间后,不了了之。于是MyCAT扛起了这面大旗,在大数据时代,其重要性愈发彰显。这篇文章主要是MyCAT的入门部署。  随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。对于一个大型的互联网应
MyCat安装配置学习1.下载安装tar解压(不多说)2.MyCat命令./mycatstart启动./mycatstop停止./mycatrestart重启配置server.xml添加用户设置配置schema.xml
1.Mycat入门官网http://www.mycat.io/1.1.什么是Mycat一个彻底开源的,面向企业应用开发的大数据库集群支持事务、ACID、可以替代MySQL的加强版数据库一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL
因为51博客写作格式问题,以后文档都以有道文档连接为主,已整理到有道云笔记,目前笔记有云计算运维大数据运维,应用运维,DBA,测试,小白想学的可以加我qq:936172842,,请注明51学友,无备注一律不加,http:/ote.youdao.comoteshare?id=935db6cec339054c82d8b3f6ac343fa0⊂=DBB78851CCCF486EB26B
MyCat简介前面文章我们提到,如果数据量比较大的话,我们需要对数据进行分库分表,分完之后,原本存在一个数据库中的数据,现在就存在多个数据库中了,就像下面这样:  那么此时MyCat所扮演的角色就是分布式数据库中间件!MyCat是一个开源的分布式数据库中间件,它实现了MySQL协议,在开发
一、自定义类加载器在复杂类情况下的运行分析1、使用之前创建的类加载器publicclassMyTest16extendsClassLoader{privateStringclassName;//目录privateStringpath;privatefinalStringfileExtension=".class";publicMyTest16(Stringclass
mycat是一个中间层mycat不存储任何数据,所有数据存储在mysql中mycat对于开发人员来说就是mysql,但mycat不能支持所有mysql语句mycat可以实现对后端数据库的分库分表和读写分离、负载均衡mycat对前端应用隐藏了后端数据库的存储逻辑(比如对后端数据读写分离,如果在程序中实现,则每一个使
下载:https://github.com/MyCATApache/Mycat-download安装:直接解压运行命令:linux:   ./mycatstart启动   ./mycatstop停止   ./mycatconsole前台运行   ./mycatrestart重启服务   ./mycatpause暂停   ./mycatstatus查看启动状态windows: