Date: Sun, 16 Aug 2020 12:15:08 +0800
Subject: [PATCH 004/132] =?UTF-8?q?[U]=20=E6=9B=B4=E6=96=B0readme=E7=9A=84?=
=?UTF-8?q?dubbo=E6=96=87=E7=AB=A0todos?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 9 ++-
...3\250\345\206\214\344\270\255\345\277\203" | 17 +++++
...bo\351\235\242\350\257\225\351\242\230.md" | 22 ++++++
...05\350\257\273\351\241\272\345\272\217.md" | 11 +++
.../Nio/NIO\346\200\273\347\273\22301.md" | 65 ++++++++++++++++++
note/images/RPC/rpc.jpg | Bin 0 -> 40570 bytes
6 files changed, 123 insertions(+), 1 deletion(-)
create mode 100644 "note/Dubbo/Dubbo\346\272\220\347\240\201\350\247\243\346\236\220\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224 \346\263\250\345\206\214\344\270\255\345\277\203"
create mode 100644 "note/Dubbo/Dubbo\351\235\242\350\257\225\351\242\230.md"
create mode 100644 "note/Dubbo/dubbo\345\272\225\345\261\202\345\216\237\347\220\206\351\230\205\350\257\273\351\241\272\345\272\217.md"
create mode 100644 "note/Netty/Nio/NIO\346\200\273\347\273\22301.md"
create mode 100644 note/images/RPC/rpc.jpg
diff --git a/README.md b/README.md
index f81158f..d4c2b82 100644
--- a/README.md
+++ b/README.md
@@ -90,7 +90,14 @@ Java流行框架源码分析,学习以及总结。
- [从零开始系统学习SpringSecurity和OAuth2(二)—— 安全过滤器FilterChainProxy](https://github.com/coderbruis/JavaSourceLearning/blob/master/note/SpringSecurity/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0SpringSecurity%E5%92%8COAuth2%EF%BC%88%E4%BA%8C%EF%BC%89%E2%80%94%E2%80%94%20%E5%AE%89%E5%85%A8%E8%BF%87%E6%BB%A4%E5%99%A8FilterChainProxy.md)
- [从零开始系统学习SpringSecurity和OAuth2(三)—— WebSecurity建造核心逻辑](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/SpringSecurity/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0SpringSecurity%E5%92%8COAuth2%EF%BC%88%E4%B8%89%EF%BC%89%E2%80%94%E2%80%94%20WebSecurity%E5%BB%BA%E9%80%A0%E6%A0%B8%E5%BF%83%E9%80%BB%E8%BE%91.md)
-
+- Dubbo底层源码解析
+ - Dubbo底层源码版本:2.7.8
+ - Dubbo底层源码学习(一)—— Dubbo的URL
+ - Dubbo底层源码学习(二)—— Dubbo的SPI
+ - Dubbo底层源码学习(三)—— Dubbo的注册中心
+ - Dubbo底层源码学习(四)—— Dubbo的注册中心缓存机制
+ - Dubbo底层源码学习(五)—— Dubbo的注册中心重试机制
+
持续更新中...
diff --git "a/note/Dubbo/Dubbo\346\272\220\347\240\201\350\247\243\346\236\220\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224 \346\263\250\345\206\214\344\270\255\345\277\203" "b/note/Dubbo/Dubbo\346\272\220\347\240\201\350\247\243\346\236\220\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224 \346\263\250\345\206\214\344\270\255\345\277\203"
new file mode 100644
index 0000000..664cf6b
--- /dev/null
+++ "b/note/Dubbo/Dubbo\346\272\220\347\240\201\350\247\243\346\236\220\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224 \346\263\250\345\206\214\344\270\255\345\277\203"
@@ -0,0 +1,17 @@
+## 前言
+
+本篇重点内容:
+
+- 注册中心的工作流程
+- 注册中心的数据结构
+- 订阅发布的实现
+- 缓存机制
+- 重试机制
+- 设计模式
+
+本篇文章会先讲解注册中心的工作流程,然后讲解不同注册中心的数据结构和类型;接着讲解注册中心支持的通用特性,如:缓存机制、重试机制等。
+
+最后在围绕着设计模式讲解注册中心底层实现原理。
+
+## 正文
+
diff --git "a/note/Dubbo/Dubbo\351\235\242\350\257\225\351\242\230.md" "b/note/Dubbo/Dubbo\351\235\242\350\257\225\351\242\230.md"
new file mode 100644
index 0000000..a8a3d5b
--- /dev/null
+++ "b/note/Dubbo/Dubbo\351\235\242\350\257\225\351\242\230.md"
@@ -0,0 +1,22 @@
+## 前言
+
+Dubbo面试题
+
+## 正文
+
+RPC非常重要,很多人面试的时候都挂在了这个地方!你要是还不懂RPC是什么?他的基本原理是什么?你一定要把下边的内容记起来!好好研究一下!特别是文中给出的一张关于RPC的基本流程图,重点中的重点,Dubbo RPC的基本执行流程就是他,RPC框架的基本原理也是他,别说我没告诉你!看了下边的内容你要掌握的内容如下,当然还有很多:
+
+1. RPC的由来,是怎么一步一步演进出来的;
+2. RPC的基本架构是什么;
+3. RPC的基本实现原理, 重点;
+4. REST和SOAP、PRC的区别;
+5. 整个调用的过程经历了哪几部?和SpringMVC流程区别?
+
+
+### 1. 为什么要有RPC
+
+随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。
+
+- [PRC原理图](https://github.com/coderbruis/JavaSourceLearning/blob/master/images/PRC/rpc.jpg)
+
+
diff --git "a/note/Dubbo/dubbo\345\272\225\345\261\202\345\216\237\347\220\206\351\230\205\350\257\273\351\241\272\345\272\217.md" "b/note/Dubbo/dubbo\345\272\225\345\261\202\345\216\237\347\220\206\351\230\205\350\257\273\351\241\272\345\272\217.md"
new file mode 100644
index 0000000..18929b7
--- /dev/null
+++ "b/note/Dubbo/dubbo\345\272\225\345\261\202\345\216\237\347\220\206\351\230\205\350\257\273\351\241\272\345\272\217.md"
@@ -0,0 +1,11 @@
+## 前言
+
+在真正深入Dubbo底层源码前,先梳理好阅读路线,这样才能够事半功倍。
+
+## 正文
+
+### 1. 配置加载流程?
+
+[配置加载流程](http://dubbo.apache.org/zh-cn/docs/user/configuration/configuration-load-process.html)
+
+### 2.
\ No newline at end of file
diff --git "a/note/Netty/Nio/NIO\346\200\273\347\273\22301.md" "b/note/Netty/Nio/NIO\346\200\273\347\273\22301.md"
new file mode 100644
index 0000000..24d0f4b
--- /dev/null
+++ "b/note/Netty/Nio/NIO\346\200\273\347\273\22301.md"
@@ -0,0 +1,65 @@
+## 前言
+
+NIO知识一直都比较容易遗忘,所以写一篇NIO的总结来方便记忆。
+
+## 正文
+
+======== 复习BIO ======
+
+Java支持三种网络编程模型:BIO/NIO/AIO
+
+BIO(同步并阻塞),服务器实现模式为:
+一个连接对应一个线程,即客户端有连接请求时,就需要启动一个线程进行处理。
+【一对一的关系】
+
+NIO(同步非阻塞),服务器实现模式为一个线程处理多个请求(连接)。客户端发送的请求会被注册到多路复用器中,如果多路复用器轮询到这个连接是IO请求,则会对这个IO请求进行处理。
+
+client -> Thread -> Selector
+
+NIO方式适用于连接数目多且连接比较短(轻操作)的架构【连接数多;操作时间短】,比如聊天服务器,弹幕系统,从JDK1.4开始支持。
+
+
+
+
+=========== 复习NIO =========
+
+1. JavaNIO全称为Java-non-blocking IO。NIO相关类都被放在了java.nio及其子包下。
+
+2. NIO中的三大核心:
+ - 缓冲区(Buffer)
+ - 选择器(Selector)
+ - 通道(Channel)
+
+NIO是面向缓冲区编程的,基于Reactor模型来实现的。
+
+NIO的数据流向可以用下图来简单的表示一下:
+
+
+Client -> Thread -> [Selector]-> Channel -> Buffer -> JVM
+
+一个Selector可以轮询多个Channel
+
+数据总是从Buffer写入Channel;
+或者从Channel读取数据到Buffer中;
+
+可以这么理解,Buffer就是一个内存块,直接和JVM关联。
+
+
+而Channel提供从文件、网络读取数据的渠道。
+
+NIO程序(JVM) <=> 缓冲区 <=> Channel <=> Selector <=> 文件(网络、client)
+
+
+3. HTTP2.0 使用了多路复用技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大几个数量级。
+
+4. NIO和BIO比较
+ BIO是以流的方式来处理数据的;
+ NIO是以缓冲区的方式啦处理数据的;
+ BIO是阻塞的;
+ NIO是非阻塞的;
+
+5. Channel是会注册到Selector中的;Selector会根据不同的事件来在不同的Channel之间进行切换。
+
+6. Buffer就是一个内存块,底层是数组。
+ Buffer既可以读也可以写,是双向的;需要通过flip方法切换。
+ channel也是双向的。
diff --git a/note/images/RPC/rpc.jpg b/note/images/RPC/rpc.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..92ecd6018b4f6bc4e8bd27453b1a6e9059c9542a
GIT binary patch
literal 40570
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