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 -![npm](https://img.shields.io/npm/v/vuepress-theme-vdoing) -![star](https://img.shields.io/github/stars/xugaoyi/vuepress-theme-vdoing) -``` -![npm](https://img.shields.io/npm/v/vuepress-theme-vdoing) -![star](https://img.shields.io/github/stars/xugaoyi/vuepress-theme-vdoing) - -> 这类标记图标可以生成动态统计数据。 - -## 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. 通过` -``` - - - -### 方法二: -通过` -``` - - -### 方法三: -使用流程图插件: -* [vuepress-plugin-flowchart](https://www.npmjs.com/package/vuepress-plugin-flowchart) -* [vuepress-plugin-mermaidjs](https://github.com/eFrane/vuepress-plugin-mermaidjs) - -## 5.Demo演示框 -### 方法一: -1. 安装 [vuepress-plugin-demo-block](https://www.npmjs.com/package/vuepress-plugin-demo-block)或其他同类插件,使用方法看插件文档 -2. 在`.vuepress/config.js`配置插件 -3. Markdown中使用 - -> 同类插件:[vuepress-plugin-demo-container](https://github.com/calebman/vuepress-plugin-demo-container) - - -::: demo [vanilla] -```html - -
-
旋转动画1
-
-
旋转动画2
-

-

-

-

-
-
弹性动画
-
曲线弹性
-
- - - -``` -::: - -### 方法二: -嵌入[codepen](https://codepen.io/) - -```html - -``` - - -::: note -`