diff --git a/database/mycat/README.md b/database/mycat/README.md
new file mode 100644
index 0000000..bec8c61
--- /dev/null
+++ b/database/mycat/README.md
@@ -0,0 +1,35 @@
+# MyCat指南
+
+## 1. Mycat相关的基本概念
+
+* Mycat的概念
+ * MyCAT相当于MySQL SERVER层
+ * MySQL相当于MyCAT的存储层
+ * MyCAT中不存储数据,所有的数据存储在MySQL中
+ * MyCAT对于研发人员来说是透明的
+ * MyCAT对使用的SQL有一些限制
+ * MyCAT是数据库中间层
+ * MyCAT可以实现对后端数据库的分库分表和读写分离
+ * MyCAT对前端应用隐藏了后端数据库的存储逻辑
+* 什么是数据中间层
+ * 链接数据和应用的一层设计,MyCAT就是用来实现数据中间层的数据中间件
+* MyCAT的主要作用
+ * 作为分布式数据库中间层使用
+ * 实现后端数据库读写分离及负载均衡
+ * 对业务数据库进行垂直/水平切分
+ * 控制数据库连接的数量
+* Mycat的基本元素
+ * 逻辑库
+ * 应用层直接看成数据库即可,实际可能是由多个数据库组成的逻辑库
+ * 逻辑库中不会保存数据,只是一个对外开放数据库的概念
+ * 逻辑表
+ * 水平切分后的订单表,结构相同,对外可以作为一张大表来使用
+ * 逻辑表也是概念的东西,实际并不用来进行存储数据
+ * 逻辑表的种类: 分片表和非分片表;全局表,在所有分片中都存在的表;ER关系表,按ER关系进行分片的表
+* MyCAT安装
+ * 下载解压MyCAT
+ * 安装JAVA运行环境
+ * 新建MyCAT运行系统账号
+ * 配置系统的环境变量
+ * 修改Mycat启动参数,启动MyCAT
+ *
diff --git a/database/mycat/pic/MyCAT作为分布式数据库中间层的使用.png b/database/mycat/pic/MyCAT作为分布式数据库中间层的使用.png
new file mode 100644
index 0000000..87dd5b5
Binary files /dev/null and b/database/mycat/pic/MyCAT作为分布式数据库中间层的使用.png differ
diff --git a/database/mycat/pic/Mycat架构图.png b/database/mycat/pic/Mycat架构图.png
new file mode 100644
index 0000000..7326d15
Binary files /dev/null and b/database/mycat/pic/Mycat架构图.png differ
diff --git a/dev-protocol-tools/pom.xml b/dev-protocol-tools/pom.xml
index 484e5b3..6efb5d5 100644
--- a/dev-protocol-tools/pom.xml
+++ b/dev-protocol-tools/pom.xml
@@ -47,6 +47,12 @@
easyexcel
3.0.5
+
+ org.jetbrains
+ annotations
+ RELEASE
+ compile
+
\ No newline at end of file
diff --git a/dev-protocol-tools/src/main/java/com/baiye/number/NumberUtil.java b/dev-protocol-tools/src/main/java/com/baiye/number/NumberUtil.java
new file mode 100644
index 0000000..d1b7509
--- /dev/null
+++ b/dev-protocol-tools/src/main/java/com/baiye/number/NumberUtil.java
@@ -0,0 +1,82 @@
+package com.baiye.number;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ThreadLocalRandom;
+
+/**
+ * 号码生成工具类
+ *
+ * @author q
+ * @date 2022/06/15
+ */
+public class NumberUtil {
+
+
+ /**
+ * 创建流水号函数
+ *
+ * @param type 类型 线上/线下 1位
+ * @param organizationId 零售店/仓库 6位
+ * @param spgId 品类编号 5位
+ * @param date 购物日期 6位
+ * @return {@link String}
+ */
+ public static String createOrderCode(String type, String organizationId, String spgId, String date) {
+ return type +
+ organizationId +
+ spgId +
+ date +
+ produceRandomNumber();
+ }
+
+ static StringBuffer produceRandomNumber() {
+ StringBuffer buffer = new StringBuffer();
+ ThreadLocalRandom.current().ints(0, 9).limit(10).forEach(
+ buffer::append
+ );
+ return buffer;
+ }
+
+
+ /**
+ * 测试 -
+ *
+ * fixme 这边把 只能通过线程池方式创建线程的警告进行忽略
+ */
+ @SuppressWarnings("all")
+ public static void main(String[] args) {
+
+ int sum = 10000;
+
+ CountDownLatch countDownLatch = new CountDownLatch(sum);
+ Set set = new HashSet<>(sum);
+
+ for (int i = 0; i < sum; i++) {
+ new Thread(() -> {
+ String num = createOrderCode("S", "000012", "11002", "2022615");
+ System.out.println(
+ Thread.currentThread().getName()
+ + " - "
+ + num);
+ set.add(num);
+ countDownLatch.countDown();
+ }).start();
+ }
+
+ try {
+ countDownLatch.await();
+ // 结果为 定义的 sum值表示 生成的都是唯一的Id,且数目对的
+ System.out.println(set.size());
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+
+
+ }
+
+}
diff --git a/longpolling/demo/demo1/README.md b/longpolling/demo/demo1/README.md
new file mode 100644
index 0000000..9d1c02d
--- /dev/null
+++ b/longpolling/demo/demo1/README.md
@@ -0,0 +1,3 @@
+# Disruptor与Netty实现百万级长连接接入
+
+##
diff --git a/longpolling/demo/demo1/dev-protocol-disruptor-netty-client/.gitignore b/longpolling/demo/demo1/dev-protocol-disruptor-netty-client/.gitignore
new file mode 100644
index 0000000..d4beec9
--- /dev/null
+++ b/longpolling/demo/demo1/dev-protocol-disruptor-netty-client/.gitignore
@@ -0,0 +1,46 @@
+### Example user template template
+### Example user template
+
+# IntelliJ project files
+.idea
+*.iml
+out
+gen
+### Maven template
+target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+release.properties
+dependency-reduced-pom.xml
+buildNumber.properties
+.mvn/timing.properties
+# https://github.com/takari/maven-wrapper#usage-without-binary-jar
+.mvn/wrapper/maven-wrapper.jar
+
+### Java template
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
diff --git a/longpolling/demo/demo1/dev-protocol-disruptor-netty-client/pom.xml b/longpolling/demo/demo1/dev-protocol-disruptor-netty-client/pom.xml
new file mode 100644
index 0000000..26bb31e
--- /dev/null
+++ b/longpolling/demo/demo1/dev-protocol-disruptor-netty-client/pom.xml
@@ -0,0 +1,20 @@
+
+
+
+ dev-protocol
+ org.example
+ 1.0-SNAPSHOT
+ ../../../../pom.xml
+
+ 4.0.0
+
+ dev-protocol-disruptor-netty-client
+
+
+ 8
+ 8
+
+
+
\ No newline at end of file
diff --git a/longpolling/demo/demo1/dev-protocol-disruptor-netty-common/.gitignore b/longpolling/demo/demo1/dev-protocol-disruptor-netty-common/.gitignore
new file mode 100644
index 0000000..d4beec9
--- /dev/null
+++ b/longpolling/demo/demo1/dev-protocol-disruptor-netty-common/.gitignore
@@ -0,0 +1,46 @@
+### Example user template template
+### Example user template
+
+# IntelliJ project files
+.idea
+*.iml
+out
+gen
+### Maven template
+target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+release.properties
+dependency-reduced-pom.xml
+buildNumber.properties
+.mvn/timing.properties
+# https://github.com/takari/maven-wrapper#usage-without-binary-jar
+.mvn/wrapper/maven-wrapper.jar
+
+### Java template
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
diff --git a/longpolling/demo/demo1/dev-protocol-disruptor-netty-common/pom.xml b/longpolling/demo/demo1/dev-protocol-disruptor-netty-common/pom.xml
new file mode 100644
index 0000000..e986b9c
--- /dev/null
+++ b/longpolling/demo/demo1/dev-protocol-disruptor-netty-common/pom.xml
@@ -0,0 +1,72 @@
+
+
+
+ dev-protocol
+ org.example
+ 1.0-SNAPSHOT
+ ../../../../pom.xml
+
+ 4.0.0
+
+ dev-protocol-disruptor-netty-common
+
+
+ 8
+ 8
+
+
+
+
+ org.projectlombok
+ lombok
+
+
+ io.netty
+ netty-all
+ 4.1.12.Final
+
+
+
+ org.jboss.marshalling
+ jboss-marshalling
+ 1.3.0.CR9
+
+
+ org.jboss.marshalling
+ jboss-marshalling-serial
+ 1.3.0.CR9
+
+
+
+ com.google.protobuf
+ protobuf-java
+ 2.5.0
+
+
+
+ com.lmax
+ disruptor
+ 3.3.2
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ 1.8
+
+
+
+
+
+
\ No newline at end of file
diff --git a/longpolling/demo/demo1/dev-protocol-disruptor-netty-common/src/main/java/com/baiye/codec/MarshallingCodeCFactory.java b/longpolling/demo/demo1/dev-protocol-disruptor-netty-common/src/main/java/com/baiye/codec/MarshallingCodeCFactory.java
new file mode 100644
index 0000000..9dd88eb
--- /dev/null
+++ b/longpolling/demo/demo1/dev-protocol-disruptor-netty-common/src/main/java/com/baiye/codec/MarshallingCodeCFactory.java
@@ -0,0 +1,49 @@
+package com.baiye.codec;
+
+import io.netty.handler.codec.marshalling.DefaultMarshallerProvider;
+import io.netty.handler.codec.marshalling.DefaultUnmarshallerProvider;
+import io.netty.handler.codec.marshalling.MarshallerProvider;
+import io.netty.handler.codec.marshalling.MarshallingDecoder;
+import io.netty.handler.codec.marshalling.MarshallingEncoder;
+import io.netty.handler.codec.marshalling.UnmarshallerProvider;
+
+import org.jboss.marshalling.MarshallerFactory;
+import org.jboss.marshalling.Marshalling;
+import org.jboss.marshalling.MarshallingConfiguration;
+
+/**
+ * Marshalling工厂 - 进行自定义编码
+ */
+public final class MarshallingCodeCFactory {
+
+ /**
+ * 创建Jboss Marshalling解码器MarshallingDecoder
+ * @return MarshallingDecoder
+ */
+ public static MarshallingDecoder buildMarshallingDecoder() {
+ //首先通过Marshalling工具类的精通方法获取Marshalling实例对象 参数serial标识创建的是java序列化工厂对象。
+ final MarshallerFactory marshallerFactory = Marshalling.getProvidedMarshallerFactory("serial");
+ //创建了MarshallingConfiguration对象,配置了版本号为5
+ final MarshallingConfiguration configuration = new MarshallingConfiguration();
+ configuration.setVersion(5);
+ //根据marshallerFactory和configuration创建provider
+ UnmarshallerProvider provider = new DefaultUnmarshallerProvider(marshallerFactory, configuration);
+ //构建Netty的MarshallingDecoder对象,俩个参数分别为provider和单个消息序列化后的最大长度
+ MarshallingDecoder decoder = new MarshallingDecoder(provider, 1024 * 1024 * 1);
+ return decoder;
+ }
+
+ /**
+ * 创建Jboss Marshalling编码器MarshallingEncoder
+ * @return MarshallingEncoder
+ */
+ public static MarshallingEncoder buildMarshallingEncoder() {
+ final MarshallerFactory marshallerFactory = Marshalling.getProvidedMarshallerFactory("serial");
+ final MarshallingConfiguration configuration = new MarshallingConfiguration();
+ configuration.setVersion(5);
+ MarshallerProvider provider = new DefaultMarshallerProvider(marshallerFactory, configuration);
+ //构建Netty的MarshallingEncoder对象,MarshallingEncoder用于实现序列化接口的POJO对象序列化为二进制数组
+ MarshallingEncoder encoder = new MarshallingEncoder(provider);
+ return encoder;
+ }
+}
diff --git a/longpolling/demo/demo1/dev-protocol-disruptor-netty-common/src/main/java/com/baiye/dto/TranslatorData.java b/longpolling/demo/demo1/dev-protocol-disruptor-netty-common/src/main/java/com/baiye/dto/TranslatorData.java
new file mode 100644
index 0000000..ae95f37
--- /dev/null
+++ b/longpolling/demo/demo1/dev-protocol-disruptor-netty-common/src/main/java/com/baiye/dto/TranslatorData.java
@@ -0,0 +1,38 @@
+package com.baiye.dto;
+
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+/**
+ * 传输数据对象
+ *
+ * @author q
+ * @date 2022/07/11
+ */
+@Getter
+@Setter
+@ToString
+public class TranslatorData implements Serializable {
+
+
+ /**
+ * id
+ */
+ private String id;
+
+ /**
+ * 消息的名字
+ */
+ private String name;
+
+ /**
+ * 消息内容
+ */
+ private String message;
+
+
+}
diff --git a/longpolling/demo/demo1/dev-protocol-disruptor-netty-server/.gitignore b/longpolling/demo/demo1/dev-protocol-disruptor-netty-server/.gitignore
new file mode 100644
index 0000000..d4beec9
--- /dev/null
+++ b/longpolling/demo/demo1/dev-protocol-disruptor-netty-server/.gitignore
@@ -0,0 +1,46 @@
+### Example user template template
+### Example user template
+
+# IntelliJ project files
+.idea
+*.iml
+out
+gen
+### Maven template
+target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+release.properties
+dependency-reduced-pom.xml
+buildNumber.properties
+.mvn/timing.properties
+# https://github.com/takari/maven-wrapper#usage-without-binary-jar
+.mvn/wrapper/maven-wrapper.jar
+
+### Java template
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
diff --git a/longpolling/demo/demo1/dev-protocol-disruptor-netty-server/pom.xml b/longpolling/demo/demo1/dev-protocol-disruptor-netty-server/pom.xml
new file mode 100644
index 0000000..1714e43
--- /dev/null
+++ b/longpolling/demo/demo1/dev-protocol-disruptor-netty-server/pom.xml
@@ -0,0 +1,58 @@
+
+
+
+ dev-protocol
+ org.example
+ 1.0-SNAPSHOT
+ ../../../../pom.xml
+
+ 4.0.0
+
+ dev-protocol-disruptor-netty-server
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+ org.example
+ dev-protocol-disruptor-netty-common
+ 1.0-SNAPSHOT
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ 1.8
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/longpolling/demo/demo1/dev-protocol-disruptor-netty-server/src/main/java/com/baiye/NettyServerApplication.java b/longpolling/demo/demo1/dev-protocol-disruptor-netty-server/src/main/java/com/baiye/NettyServerApplication.java
new file mode 100644
index 0000000..3117ca0
--- /dev/null
+++ b/longpolling/demo/demo1/dev-protocol-disruptor-netty-server/src/main/java/com/baiye/NettyServerApplication.java
@@ -0,0 +1,4 @@
+package com.baiye;
+
+public class NettyServerApplication {
+}
diff --git a/longpolling/demo/demo1/dev-protocol-disruptor-netty-server/src/main/java/com/baiye/server/NettyServer.java b/longpolling/demo/demo1/dev-protocol-disruptor-netty-server/src/main/java/com/baiye/server/NettyServer.java
new file mode 100644
index 0000000..46114a0
--- /dev/null
+++ b/longpolling/demo/demo1/dev-protocol-disruptor-netty-server/src/main/java/com/baiye/server/NettyServer.java
@@ -0,0 +1,78 @@
+package com.baiye.server;
+
+import com.baiye.codec.MarshallingCodeCFactory;
+import io.netty.bootstrap.ServerBootstrap;
+import io.netty.buffer.PooledByteBufAllocator;
+import io.netty.channel.AdaptiveRecvByteBufAllocator;
+import io.netty.channel.ChannelInitializer;
+import io.netty.channel.ChannelOption;
+import io.netty.channel.EventLoopGroup;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.SocketChannel;
+import io.netty.channel.socket.nio.NioServerSocketChannel;
+import io.netty.handler.logging.LogLevel;
+import io.netty.handler.logging.LoggingHandler;
+
+/**
+ * Netty Server 端
+ *
+ * @author q
+ * @date 2022/07/11
+ */
+public class NettyServer {
+
+
+ /**
+ * Netty 两个线程租的底层原理
+ * 图示:
+ *
+ * —————— ———————————————————————————————————————————
+ * | |------------ip/port,发起第一次握手----------------|-> —————— Server[Online] |
+ * | | | | | |
+ * | |<----------ack包,发起第而次握手-------------------|- |SYNC | |
+ * | | | —————— |
+ * | | | sync + accept = backlog |
+ * | Client | | —————— |
+ * | |--第三次握手成功,把SYNC中的链接放到Accept队列中----->| |Accept| |
+ * | | | —————— |
+ * | | | serverSocket.accept() |
+ * —————— ———————————————————————————————————————————
+ *
+ *
+ */
+ public NettyServer() {
+ // 1. 创建两个工作线程组: 1个用于接收网络请求的, 另一个用于实际处理业务的线程组
+ EventLoopGroup bossGroup = new NioEventLoopGroup();
+
+ EventLoopGroup workGroup = new NioEventLoopGroup();
+
+ // 创建辅助类 - 帮助构建Netty模型
+ ServerBootstrap serverBootstrap = new ServerBootstrap()
+ .group(bossGroup, workGroup)
+ .channel(NioServerSocketChannel.class)
+ // fixme 设置 backlog大小
+ .option(ChannelOption.SO_BACKLOG, 1024)
+ // fixme 表示缓存区动态调配(自适应) 数据包相差不大的时候比较合适
+ .option(ChannelOption.RCVBUF_ALLOCATOR, AdaptiveRecvByteBufAllocator.DEFAULT)
+ // 缓冲区 池化操作
+ .option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT)
+ // 记录日志
+ .handler(new LoggingHandler(LogLevel.INFO))
+ // 数据接收过来给哪个方法进行回调 -> 接收数据进行异步处理
+ .childHandler(new ChannelInitializer() {
+ @Override
+ protected void initChannel(SocketChannel socketChannel) throws Exception {
+ // fixme 在管道上加一些拦截器进行处理
+
+ // 进行设置编解码 -> 对Java对象转为的二进制数据进行编解码
+ socketChannel.pipeline().addLast(MarshallingCodeCFactory.buildMarshallingDecoder());
+ socketChannel.pipeline().addLast(MarshallingCodeCFactory.buildMarshallingEncoder());
+ // 信息处理
+ socketChannel.pipeline().addLast(new ServerHandler());
+ }
+ });
+
+
+
+ }
+}
diff --git a/longpolling/demo/demo1/dev-protocol-disruptor-netty-server/src/main/java/com/baiye/server/ServerHandler.java b/longpolling/demo/demo1/dev-protocol-disruptor-netty-server/src/main/java/com/baiye/server/ServerHandler.java
new file mode 100644
index 0000000..e91e8a1
--- /dev/null
+++ b/longpolling/demo/demo1/dev-protocol-disruptor-netty-server/src/main/java/com/baiye/server/ServerHandler.java
@@ -0,0 +1,32 @@
+package com.baiye.server;
+
+import com.baiye.dto.TranslatorData;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelInboundHandlerAdapter;
+
+/**
+ * 继承其接口的子类,防止去重写那么多的接口
+ *
+ * @author q
+ * @date 2022/07/11
+ */
+public class ServerHandler extends ChannelInboundHandlerAdapter {
+
+ @Override
+ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
+
+ // 接收到数据 数据已经进行了编解码, 所以直接进行转换
+ TranslatorData request = (TranslatorData) msg;
+ System.out.println("Server 端数据 : " + request.toString());
+
+ // 设计响应回送数据
+ TranslatorData response = new TranslatorData();
+ response.setId("resp: " + request.getId());
+ response.setName("resp: " + request.getName());
+ response.setMessage("resp: " + request.getMessage());
+
+ // 写数据并刷新
+ ctx.writeAndFlush(response);
+
+ }
+}
diff --git a/pom.xml b/pom.xml
index c6941d4..29b12bc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,6 +28,9 @@
dev-protocol-pay
dev-protocol-tools
dev-protocol-drools
+ longpolling/demo/demo1/dev-protocol-disruptor-netty-client
+ longpolling/demo/demo1/dev-protocol-disruptor-netty-server
+ longpolling/demo/demo1/dev-protocol-disruptor-netty-common