From 950f679c79fe2cada2e56b2ff99c05b7a11ef0e9 Mon Sep 17 00:00:00 2001
From: qiuyue <1599308204@qq.com>
Date: Tue, 28 Mar 2023 13:06:02 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E7=9B=B8=E5=85=B3=E6=96=87=E7=AB=A0?=
=?UTF-8?q?=E4=BB=A5=E5=8F=8A=E5=8E=BB=E9=99=A4=E6=9D=82=E4=B9=B1=E6=96=87?=
=?UTF-8?q?=E7=AB=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../docs/01.使用教程/02.相关文章/03.AOP.md | 49 ++++
.../02.相关文章/03.使目录栏支持h2~h6标题.md | 26 --
.../06.代理实现中涉及的几类Channel.md | 61 +++++
.../06.如何让你的笔记更有表现力.md | 230 ------------------
.../07.批量操作front matter工具.md | 67 -----
.../docs/01.使用教程/02.相关文章/08.部署.md | 84 -------
.../02.相关文章/09.关于写文章和一级标题.md | 30 ---
.../02.相关文章/10.关于博客搭建与管理.md | 35 ---
.../11.在线编辑和新增文章的方法.md | 31 ---
9 files changed, 110 insertions(+), 503 deletions(-)
create mode 100644 neutrino-proxy-vuepress/docs/01.使用教程/02.相关文章/03.AOP.md
delete mode 100644 neutrino-proxy-vuepress/docs/01.使用教程/02.相关文章/03.使目录栏支持h2~h6标题.md
create mode 100644 neutrino-proxy-vuepress/docs/01.使用教程/02.相关文章/06.代理实现中涉及的几类Channel.md
delete mode 100644 neutrino-proxy-vuepress/docs/01.使用教程/02.相关文章/06.如何让你的笔记更有表现力.md
delete mode 100644 neutrino-proxy-vuepress/docs/01.使用教程/02.相关文章/07.批量操作front matter工具.md
delete mode 100644 neutrino-proxy-vuepress/docs/01.使用教程/02.相关文章/08.部署.md
delete mode 100644 neutrino-proxy-vuepress/docs/01.使用教程/02.相关文章/09.关于写文章和一级标题.md
delete mode 100644 neutrino-proxy-vuepress/docs/01.使用教程/02.相关文章/10.关于博客搭建与管理.md
delete mode 100644 neutrino-proxy-vuepress/docs/01.使用教程/02.相关文章/11.在线编辑和新增文章的方法.md
diff --git a/neutrino-proxy-vuepress/docs/01.使用教程/02.相关文章/03.AOP.md b/neutrino-proxy-vuepress/docs/01.使用教程/02.相关文章/03.AOP.md
new file mode 100644
index 00000000..3bfc2f17
--- /dev/null
+++ b/neutrino-proxy-vuepress/docs/01.使用教程/02.相关文章/03.AOP.md
@@ -0,0 +1,49 @@
+---
+title: AOP
+date: 2022-03-18 15:02:52
+permalink: /pages/8dfab5/
+article: false
+---
+
+# 动态代理策略
+- `AUTO` 框架按照一定策略动态选择代理方式
+- `JDK_DYNAMIC_PROXY` JDK动态代理
+- `ASGC_PROXY` 子类继承代理(傲世孤尘代理)
+
+# 自动代理策略
+> 当被代理类是一个接口时,采用JDK动态代理,否则采用子类代理
+
+# JDK动态代理
+> 目前仅支持代理接口,不支持为普通类生成代理。
+> 原因是:JDK动态代理生成的代理类,不能用被代理类的类型接收,而必须用被代理类的接口类型接收,这与目前的设计结构有冲突,后续需要思考优化解决
+
+# 子类继承代理
+> 顾名思义,通过生成一个被代理类的子类来创建一个代理类实例,因此可以用被代理类类型接收代理实例。
+> 可代理接口、普通类。不能代理静态类、内部类、final修饰的类、final修饰的方法,暂不支持代理抽象类。
+
+# 拦截器
+> 所有拦截器实例都是单例的,与bean容器打通(这块后期着重优化)
+
+- `全局拦截器` 全局维护,由所有代理类共享的拦截器,根据需要可以过滤。
+- `普通拦截器` 代理实例维护,不同的代理实例可共享,需要在被代理类或者方法上加`@Intercept`注解标注
+- `过滤器` 阉割版的拦截器,用于在目标方法执行前进行过滤操作
+- `结果处理器` 阉割版的拦截器,用于在目标方法执行完毕正常返回后,对返回数据进行处理
+- `异常处理器` 阉割版的拦截器,用于在目标方法执行抛异常后,对异常进行捕获处理
+
+# 拦截器的继承
+> 不是父类子类的继承,类似于财产的继承。按照继承关系依次是:全局拦截器 -> 类拦截器 -> 方法拦截器
+- 所有的代理类都继承全局拦截器,前提是代理类没有排除全局拦截器
+- 所有的可代理方法都继承类上的拦截器(`@Intercept`在类上标注的拦截器),前提是方法上没有标注排除类上的拦截器。
+- 特别的,如果被代理类是一个接口。则这个接口会继承所有父接口的拦截器。
+
+# 拦截器的执行顺序
+- 对于普通类来说,拦截器按照继承顺序执行,也就是会首先执行全局拦截器
+- 对于接口来说,先按照拦截器继承顺序,再按照接口继承层级向上传递。如:全局拦截器 -> 类拦截器 -> 方法拦截器 -> 父接口拦截器 -> 爷接口拦截器 -> ...
+
+# 拦截器的异常处理流程
+> 异常处理与拦截器执行顺序相反,类似于冒泡的过程。
+- 末端拦截器处理,若未能捕获,则继续流转
+- 全局拦截器处理,若未能捕获、则继续流转
+- 若被代理方法声明了对外抛出,则抛给应用层,否则继续流转
+- 代理方法处理,直接打印堆栈信息
+
diff --git a/neutrino-proxy-vuepress/docs/01.使用教程/02.相关文章/03.使目录栏支持h2~h6标题.md b/neutrino-proxy-vuepress/docs/01.使用教程/02.相关文章/03.使目录栏支持h2~h6标题.md
deleted file mode 100644
index 2d054a25..00000000
--- a/neutrino-proxy-vuepress/docs/01.使用教程/02.相关文章/03.使目录栏支持h2~h6标题.md
+++ /dev/null
@@ -1,26 +0,0 @@
----
-title: 使目录栏支持h2~h6标题
-date: 2022-03-18 15:02:52
-permalink: /pages/8dfab5/
-article: false
----
-
-在`.vuepress/config.js`添加如下配置即可使 VuePress 提取相应标题级别的数据,并应用到主题的右侧目录栏中。
-
-
-## markdown.extractHeaders
-
-- 类型: Array
-- 默认: ['h2', 'h3']
-
-Markdown 文件的 headers (标题 & 小标题) 会在准备阶段被提取出来,并存储在 this.$page.headers 中。默认情况下,VuePress 会提取 h2 和 h3 标题。你可以通过这个选项来修改提取出的标题级别。
-
-```js
-module.exports = {
- markdown: {
- extractHeaders: [ 'h2', 'h3', 'h4', 'h5', 'h6' ]
- }
-}
-```
-
-注:此配置来自 [VuePress官方文档](https://vuepress.vuejs.org/zh/config/#markdown-extractheaders)
diff --git a/neutrino-proxy-vuepress/docs/01.使用教程/02.相关文章/06.代理实现中涉及的几类Channel.md b/neutrino-proxy-vuepress/docs/01.使用教程/02.相关文章/06.代理实现中涉及的几类Channel.md
new file mode 100644
index 00000000..f3e5d5a3
--- /dev/null
+++ b/neutrino-proxy-vuepress/docs/01.使用教程/02.相关文章/06.代理实现中涉及的几类Channel.md
@@ -0,0 +1,61 @@
+---
+title: 代理实现中涉及的几类Channel
+date: 2020-09-26 21:13:59
+permalink: /pages/dd027d/
+article: false
+---
+
+# 代理实现中涉及的几类Channel
+
+## 指令通道(CmdChannel)
+- 该channel负责维护客户端与服务端之间的指令通讯,由客户端启动后向服务端发起连接请求,服务端验证license成功后连接建立。
+- 服务端维护第一个CmdChannel的映射表,key为licenseId。服务端可以根据licenseId,向指定的客户端指令通道发布指令。
+- 该通道建立完成后,服务端会将该license授权的外网映射端口打开,等待用户访问。正常情况下,只要客户端不下线,该通道一直可用。
+- 然后服务端维护第二个CmdChannel的映射表,key为服务端外网端口。服务端可以根据指定的外网端口,向指定的客户端指令通道发布指令。
+
+## 用户访问通道(VisitorChannel)
+- 该channel负责维护访问者与服务端端口之间的通讯,由访问者向服务端映射的外网端口发起请求开始建立,具体断开时机由实际的被代理的
+ 协议决定。
+- 如HTTP/1.0下,用户向该端口发起请求,响应结束后,该通道随之关闭,下一次发起请求后,重新建立新的连接。
+- 该连接建立后,服务端会向该外网端口映射的指令通道发送`Connect`指令,传输该外网端口需要代理的内网信息,
+ 如:`127.0.0.1:3306`。
+
+## 被代理服务的实际通道(RealServerChannel)
+- 该channel负责维护客户端与实际被代理服务之间的通讯,当客户端接收到服务端的`Connect`指令后,客户端便会建立该通道。
+
+## 代理数据传输的通道(ProxyChannel)
+- 该channel负责完成内网被代理服务与代理服务端之间的数据转发任务。
+- 每个客户端维护一个`ProxyChannel`的缓存队列,需要时从该队列中取,当取不到时,直接新建一个`ProxyChannel`返回。
+ 当一个`ProxyChannel`实例用完后,需要归还到缓存队列中(`ProxyChannel`收到`DisConnect`指令时)。
+- 当`RealServerChannel`建立完成后,就会获取相关联的`ProxyChannel`,并与其绑定。设置`RealServerChannel`为
+ 可读状态。然后通过`ProxyChannel`向服务端发送`Connect`指令。
+
+
+# 代理实现流程
+## 1、服务连接阶段
+- 1.1、客户端根据是否需要使用SSL,选择对应的服务端端口发起连接,建立`CmdChannel`。
+- 1.2、客户端根据用户输入或配置文件获取`license`,并携带`license`通过`CmdChannel`向服务端发送`Auth`指令。
+- 1.3、服务端通过`CmdChannel`接收到来自客户端的`Auth`指令。若验证`license`有效,则建立`licenseId`与`CmdChannel`的映射缓存、
+ 外网端口与`CmdChannel`的映射缓存。并启动服务端代理端口,等待用户连接。
+## 2、用户连接阶段
+- 2.1、用户向服务端代理的外网端口发起请求,服务端建立`VisitorChannel`。
+- 2.2、根据外网端口查找`CmdChannel`,若不存在有效的`CmdChannel`,则关闭该`VisitorChannel`。否则,
+ 设置`VisitorChannel`为不可读,并携带内网映射信息(如:`127.0.0.1:3306`)通过`CmdChannel`向客户端发送`Connect`指令。
+## 3、实际被代理服务连接阶段
+- 3.1、客户端通过`CmdChannel`接收到服务端的`Connect`指令。拿到需要代理的内网IP、端口号,向实际被
+ 代理服务发起连接请求,若连接失败,则通过`CmdChannel`向服务端发送`DisConnect`指令。建立`RealServerChannel`成功,设置`RealServerChannel`为不可读
+ 状态,并进入4.1阶段
+## 4、代理通道连接阶段
+- 4.1、客户端通过`ProxyChannelQueue`获取或新建一个`ProxyChannel`,并将`RealServerChannel`与`ProxyChannel`进行绑定。
+- 4.2、客户端通过`ProxyChannel`向服务端发送`Connect`指令。
+- 4.3、服务端通过`ProxyChannel`通道收到来自客户端的`Connect`指令后,将`ProxyChannel`与对应的`VisitorChannel`进行绑定,并
+ 设置`VisitorChannel`为可读状态。
+## 5、数据传输阶段
+- 5.1、服务端通过`VisitorChannel`收到来自用户的请求数据,然后找到`VisitorChannel`绑定的`ProxyChannel`,
+ 通过`ProxyChannel`发送`Transfer`指令,并携带用户请求数据。
+- 5.2、客户端通过`ProxyChannel`收到来自服务端的`Transfer`指令,取出用户请求数据。找到`ProxyChannel`绑定的`RealServerChannel`,
+ 通过`RealServerChannel`向被代理服务写入用户请求数据。
+- 5.3、客户端通过`RealServerChannel`收到被代理服务响应的数据,找到`RealServerChannel`绑定的`ProxyChannel`,
+ 通过`ProxyChannel`向服务端发送`Transfer`指令,并携带响应数据。
+- 5.4、服务端通过`ProxyChannel`收到来自客户端的`Transfer`指令,找到`ProxyChannel`绑定的`VisitorChannel`,
+ 通过`VisitorChannel`向用户端写入响应数据。
diff --git a/neutrino-proxy-vuepress/docs/01.使用教程/02.相关文章/06.如何让你的笔记更有表现力.md b/neutrino-proxy-vuepress/docs/01.使用教程/02.相关文章/06.如何让你的笔记更有表现力.md
deleted file mode 100644
index 8a046957..00000000
--- a/neutrino-proxy-vuepress/docs/01.使用教程/02.相关文章/06.如何让你的笔记更有表现力.md
+++ /dev/null
@@ -1,230 +0,0 @@
----
-title: 如何让你的笔记更有表现力
-date: 2020-09-26 21:13:59
-permalink: /pages/dd027d/
-article: false
----
-
-你的知识笔记枯燥无味没有重点?基于本主题,配合各种骚操作,让你的知识笔记表现力爆棚~~
-
-::: note
-Markdown的基本语法就不再重复啦 (对Markdown不了解的可以看 [这里](https://xugaoyi.com/pages/ad247c4332211551/)),
-下面将介绍一些可以在本主题Markdown中使用的骚操作~
-:::
-
-## 1. 文本高亮
-使用``标签让文本高亮
-
-```text
-Vdoing是一款简洁高效的 知识管理&博客 主题
-```
-Vdoing是一款简洁高效的 知识管理&博客 主题
-
-## 2. 标记
-### 内置标记
-主题内置的[Badge组件](https://vuepress.vuejs.org/zh/guide/using-vue.html#badge),直接在 Markdown 文件中使用
-
-```html
-
-
-```
-
-
-
-### 外部标记
-使用 [shields](https://shields.io/) 生成标记,在Markdown中使用
-```markdown
-
-
-```
-
-
-
-> 这类标记图标可以生成动态统计数据。
-
-## 3. 折叠列表
-主题内置的容器,直接在 Markdown 文件中使用
-````html
-::: details
-这是一个详情块
-```js
-console.log('这是一个详情块')
-```
-:::
-````
-::: details
-这是一个详情块
-```js
-console.log('这是一个详情块')
-```
-:::
-
-> 更多:[Markdown 容器](/pages/d0d7eb/)
-
-## 4. 思维导图 & 流程图
-### 方法一:
-1. 使用[Markmap](https://markmap.js.org/)生成思维导图html文件
-2. 将html文件放在`docs/.vuepress/public/markmap/`
-3. 通过`