diff --git a/ReadMe.md b/ReadMe.md
index c23b543..84572da 100644
--- a/ReadMe.md
+++ b/ReadMe.md
@@ -30,9 +30,11 @@
-## Java基础
+
+
+# Java基础
-### 基础知识
+## 基础知识
* [面向对象基础](docs/Java/basic/面向对象基础.md)
* [Java基本数据类型](docs/Java/basic/Java基本数据类型.md)
* [string和包装类](docs/Java/basic/string和包装类.md)
@@ -56,7 +58,7 @@
* [序列化和反序列化](docs/Java/basic/序列化和反序列化.md)
* [继承封装多态的实现原理](docs/Java/basic/继承封装多态的实现原理.md)
-### 容器
+## 集合类
* [Java集合类总结](docs/Java/collection/Java集合类总结.md)
* [Java集合详解:一文读懂ArrayList,Vector与Stack使用方法和实现原理](docs/Java/collection/Java集合详解:一文读懂ArrayList,Vector与Stack使用方法和实现原理.md)
@@ -68,7 +70,7 @@
* [Java集合详解:HashSet,TreeSet与LinkedHashSet](docs/Java/collection/Java集合详解:HashSet,TreeSet与LinkedHashSet.md)
* [Java集合详解:Java集合类细节精讲](docs/Java/collection/Java集合详解:Java集合类细节精讲.md)
-## JavaWeb
+# JavaWeb
* [走进JavaWeb技术世界:JavaWeb的由来和基础知识](docs/JavaWeb/走进JavaWeb技术世界:JavaWeb的由来和基础知识.md)
* [走进JavaWeb技术世界:JSP与Servlet的曾经与现在](docs/JavaWeb/走进JavaWeb技术世界:JSP与Servlet的曾经与现在.md)
@@ -87,9 +89,9 @@
* [走进JavaWeb技术世界:深入浅出Mybatis基本原理](docs/JavaWeb/走进JavaWeb技术世界:深入浅出Mybatis基本原理.md)
* [走进JavaWeb技术世界:极简配置的SpringBoot](docs/JavaWeb/走进JavaWeb技术世界:极简配置的SpringBoot.md)
-## Java进阶
+# Java进阶
-### 并发编程
+## 并发编程
* [Java并发指南:并发基础与Java多线程](docs/Java/concurrency/Java并发指南:并发基础与Java多线程.md)
* [Java并发指南:深入理解Java内存模型JMM](docs/Java/concurrency/Java并发指南:深入理解Java内存模型JMM.md)
@@ -108,7 +110,7 @@
* [Java并发指南:ForkJoin并发框架与工作窃取算法剖析](docs/Java/concurrency/Java并发指南:ForkJoin并发框架与工作窃取算法剖析.md)
* [Java并发编程学习总结](docs/Java/concurrency/Java并发编程学习总结.md)
-### JVM
+## JVM
* [JVM总结](docs/Java/JVM/JVM总结.md)
* [深入理解JVM虚拟机:JVM内存的结构与消失的永久代](docs/Java/JVM/深入理解JVM虚拟机:JVM内存的结构与消失的永久代.md)
@@ -126,7 +128,7 @@
* [深入理解JVM虚拟机:再谈四种引用及GC实践](docs/Java/JVM/深入理解JVM虚拟机:再谈四种引用及GC实践.md)
* [深入理解JVM虚拟机:GC调优思路与常用工具](docs/Java/JVM/深入理解JVM虚拟机:GC调优思路与常用工具.md)
-### Java网络编程
+## Java网络编程
* [Java网络编程和NIO详解:JAVA 中原生的 socket 通信机制](docs/Java/network/Java网络编程与NIO详解:JAVA中原生的socket通信机制.md)
* [Java网络编程与NIO详解:JAVA NIO 一步步构建IO多路复用的请求模型](docs/Java/network/Java网络编程与NIO详解:JavaNIO一步步构建IO多路复用的请求模型.md)
@@ -139,8 +141,10 @@
* [Java网络编程与NIO详解:基于NIO的网络编程框架Netty](docs/Java/network/Java网络编程与NIO详解:基于NIO的网络编程框架Netty.md)
* [Java网络编程与NIO详解:Java网络编程与NIO详解](docs/Java/network/Java网络编程与NIO详解:深度解读Tomcat中的NIO模型.md)
* [Java网络编程与NIO详解:Tomcat中的Connector源码分析(NIO)](docs/Java/network/Java网络编程与NIO详解:Tomcat中的Connector源码分析(NIO).md)
-## Spring全家桶
-### Spring
+
+# Spring全家桶
+
+## Spring
* [SpringAOP的概念与作用](docs/Spring全家桶/Spring/Spring常见注解.md)
* [SpringBean的定义与管理(核心)](docs/Spring全家桶/Spring/Spring常见注解.md)
@@ -157,8 +161,9 @@
* [Spring概述](docs/Spring全家桶/Spring/Spring常见注解.md)
* [第一个Spring应用](docs/Spring全家桶/Spring/Spring常见注解.md)
-### Spring源码分析
+## Spring源码分析
+### 综合
* [Spring源码剖析:初探SpringIOC核心流程](docs/Spring全家桶/Spring源码分析/Spring源码剖析:初探SpringIOC核心流程.md)
* [Spring源码剖析:SpringIOC容器的加载过程 ](docs/Spring全家桶/Spring源码分析/Spring源码剖析:SpringIOC容器的加载过程.md)
* [Spring源码剖析:懒加载的单例Bean获取过程分析](docs/Spring全家桶/Spring源码分析/Spring源码剖析:懒加载的单例Bean获取过程分析.md)
@@ -168,7 +173,56 @@
* [Spring源码剖析:Spring事务概述](docs/Spring全家桶/Spring源码分析/Spring源码剖析:Spring事务概述.md)
* [Spring源码剖析:Spring事务源码剖析](docs/Spring全家桶/Spring源码分析/Spring源码剖析:Spring事务源码剖析.md)
-### SpringMVC
+### AOP
+* [AnnotationAwareAspectJAutoProxyCreator 分析(上)](docs/Spring全家桶/Spring源码分析/SpringAOP/AnnotationAwareAspectJAutoProxyCreator分析(上).md)
+* [AnnotationAwareAspectJAutoProxyCreator 分析(下)](docs/Spring全家桶/Spring源码分析/SpringAOP/AnnotationAwareAspectJAutoProxyCreator分析(下).md)
+* [AOP示例demo及@EnableAspectJAutoProxy](docs/Spring全家桶/Spring源码分析/SpringAOP/AOP示例demo及@EnableAspectJAutoProxy.md)
+* [SpringAop(四):jdk 动态代理](docs/Spring全家桶/Spring源码分析/SpringAOP/SpringAop(四):jdk动态代理.md)
+* [SpringAop(五):cglib 代理](docs/Spring全家桶/Spring源码分析/SpringAOP/SpringAop(五):cglib代理.md)
+* [SpringAop(六):aop 总结](docs/Spring全家桶/Spring源码分析/SpringAOP/SpringAop(六):aop总结.md)
+
+### 事务
+* [spring 事务(一):认识事务组件](docs/Spring全家桶/Spring源码分析/Spring事务/Spring事务(一):认识事务组件.md)
+* [spring 事务(二):事务的执行流程](docs/Spring全家桶/Spring源码分析/Spring事务/Spring事务(二):事务的执行流程.md)
+* [spring 事务(三):事务的隔离级别与传播方式的处理](docs/Spring全家桶/Spring源码分析/Spring事务/Spring事务(三):事务的隔离级别与传播方式的处理01.md)
+* [spring 事务(四):事务的隔离级别与传播方式的处理](docs/Spring全家桶/Spring源码分析/Spring事务/Spring事务(四):事务的隔离级别与传播方式的处理02.md)
+* [spring 事务(五):事务的隔离级别与传播方式的处理](docs/Spring全家桶/Spring源码分析/Spring事务/Spring事务(五):事务的隔离级别与传播方式的处理03.md)
+* [spring 事务(六):事务的隔离级别与传播方式的处理](docs/Spring全家桶/Spring源码分析/Spring事务/Spring事务(六):事务的隔离级别与传播方式的处理04.md)
+
+### 启动流程
+* [spring启动流程(一):启动流程概览](docs/Spring全家桶/Spring源码分析/Spring启动流程/Spring启动流程(一):启动流程概览.md)
+* [spring启动流程(二):ApplicationContext 的创建](docs/Spring全家桶/Spring源码分析/Spring启动流程/Spring启动流程(二):ApplicationContext的创建.md)
+* [spring启动流程(三):包的扫描流程](docs/Spring全家桶/Spring源码分析/Spring启动流程/Spring启动流程(三):包的扫描流程.md)
+* [spring启动流程(四):启动前的准备工作](docs/Spring全家桶/Spring源码分析/Spring启动流程/Spring启动流程(四):启动前的准备工作.md)
+* [spring启动流程(五):执行 BeanFactoryPostProcessor](docs/Spring全家桶/Spring源码分析/Spring启动流程/Spring启动流程(五):执行BeanFactoryPostProcessor.md)
+* [spring启动流程(六):注册 BeanPostProcessor](docs/Spring全家桶/Spring源码分析/Spring启动流程/Spring启动流程(六):注册BeanPostProcessor.md)
+* [spring启动流程(七):国际化与事件处理](docs/Spring全家桶/Spring源码分析/Spring启动流程/Spring启动流程(七):国际化与事件处理.md)
+* [spring启动流程(八):完成 BeanFactory 的初始化](docs/Spring全家桶/Spring源码分析/Spring启动流程/Spring启动流程(八):完成BeanFactory的初始化.md)
+* [spring启动流程(九):单例 bean 的创建](docs/Spring全家桶/Spring源码分析/Spring启动流程/Spring启动流程(九):单例bean的创建.md)
+* [spring启动流程(十):启动完成的处理](docs/Spring全家桶/Spring源码分析/Spring启动流程/Spring启动流程(十):启动完成的处理.md)
+* [spring启动流程(十一):启动流程总结](docs/Spring全家桶/Spring源码分析/Spring启动流程/Spring启动流程(十一):启动流程总结.md)
+
+### 组件分析
+* [spring 组件之 ApplicationContext](docs/Spring全家桶/Spring源码分析/Spring组件分析/Spring组件之ApplicationContext.md)
+* [spring 组件之 BeanDefinition](docs/Spring全家桶/Spring源码分析/Spring组件分析/Spring组件之BeanDefinition.md)
+* [Spring 组件之 BeanFactory](docs/Spring全家桶/Spring源码分析/Spring组件分析/Spring组件之BeanFactory.md)
+* [spring 组件之 BeanFactoryPostProcessor](docs/Spring全家桶/Spring源码分析/Spring组件分析/Spring组件之BeanFactoryPostProcessor.md)
+* [spring 组件之 BeanPostProcessor](docs/Spring全家桶/Spring源码分析/Spring组件分析/Spring组件之BeanPostProcessor.md)
+
+### 重要机制探秘
+
+* [ConfigurationClassPostProcessor(一):处理 @ComponentScan 注解](docs/Spring全家桶/Spring源码分析/Spring重要机制探秘/ConfigurationClassPostProcessor(一):处理@ComponentScan注解.md)
+* [ConfigurationClassPostProcessor(三):处理 @Import 注解](docs/Spring全家桶/Spring源码分析/Spring重要机制探秘/ConfigurationClassPostProcessor(三):处理@Import注解.md)
+* [ConfigurationClassPostProcessor(二):处理 @Bean 注解](docs/Spring全家桶/Spring源码分析/Spring重要机制探秘/ConfigurationClassPostProcessor(二):处理@Bean注解.md)
+* [ConfigurationClassPostProcessor(四):处理 @Conditional 注解](docs/Spring全家桶/Spring源码分析/Spring重要机制探秘/ConfigurationClassPostProcessor(四):处理@Conditional注解.md)
+* [Spring 探秘之 AOP 的执行顺序](docs/Spring全家桶/Spring源码分析/Spring重要机制探秘/Spring探秘之AOP的执行顺序.md)
+* [Spring 探秘之 Spring 事件机制](docs/Spring全家桶/Spring源码分析/Spring重要机制探秘/Spring探秘之Spring事件机制.md)
+* [spring 探秘之循环依赖的解决(一):理论基石](docs/Spring全家桶/Spring源码分析/Spring重要机制探秘/Spring探秘之循环依赖的解决(一):理论基石.md)
+* [spring 探秘之循环依赖的解决(二):源码分析](docs/Spring全家桶/Spring源码分析/Spring重要机制探秘/Spring探秘之循环依赖的解决(二):源码分析.md)
+* [spring 探秘之监听器注解 @EventListener](docs/Spring全家桶/Spring源码分析/Spring重要机制探秘/spring探秘之监听器注解@EventListener.md)
+* [spring 探秘之组合注解的处理](docs/Spring全家桶/Spring源码分析/Spring重要机制探秘/Spring探秘之组合注解的处理.md)
+
+## SpringMVC
* [SpringMVC中的国际化功能](docs/Spring全家桶/SpringMVC/SpringMVC中的国际化功能.md)
* [SpringMVC中的异常处理器](docs/Spring全家桶/SpringMVC/SpringMVC中的异常处理器.md)
@@ -179,16 +233,22 @@
* [SpringMVC如何实现文件上传](docs/Spring全家桶/SpringMVC/SpringMVC如何实现文件上传.md)
* [SpringMVC中的常用功能](docs/Spring全家桶/SpringMVC/SpringMVC中的常用功能.md)
-### SpringMVC源码分析
+## SpringMVC源码分析
* [SpringMVC源码分析:SpringMVC概述](docs/Spring全家桶/SpringMVC源码分析/SpringMVC源码分析:SpringMVC概述.md)
* [SpringMVC源码分析:SpringMVC设计理念与DispatcherServlet](docs/Spring全家桶/SpringMVC源码分析/SpringMVC源码分析:SpringMVC设计理念与DispatcherServlet.md)
* [SpringMVC源码分析:DispatcherServlet的初始化与请求转发 ](docs/Spring全家桶/SpringMVC源码分析/SpringMVC源码分析:DispatcherServlet的初始化与请求转发.md)
* [SpringMVC源码分析:DispatcherServlet如何找到正确的Controller ](docs/Spring全家桶/SpringMVC源码分析/SpringMVC源码分析:DispatcherServlet如何找到正确的Controller.md)
* [SpringMVC源码剖析:消息转换器HttpMessageConverter与@ResponseBody注解](docs/Spring全家桶/SpringMVC/SpringMVC源码剖析:消息转换器HttpMessageConverter与@ResponseBody注解.md)
-* [SpringMVC源码分析:SpringMVC的视图解析原理 ](docs/Spring全家桶/SpringMVC源码分析/SpringMVC源码分析:SpringMVC的视图解析原理.md)
+* [DispatcherServlet 初始化流程 ](docs/Spring全家桶/SpringMVC源码分析/DispatcherServlet初始化流程.md)
+* [RequestMapping 初始化流程 ](docs/Spring全家桶/SpringMVC源码分析/RequestMapping初始化流程.md)
+* [Spring 容器启动 Tomcat ](docs/Spring全家桶/SpringMVC源码分析/Spring容器启动Tomcat.md)
+* [SpringMVC demo 与@EnableWebMvc 注解 ](docs/Spring全家桶/SpringMVC源码分析/SpringMVC的Demo与@EnableWebMvc注解.md)
+* [SpringMVC 整体源码结构总结 ](docs/Spring全家桶/SpringMVC源码分析/SpringMVC整体源码结构总结.md)
+* [请求执行流程(一)之获取 Handler ](docs/Spring全家桶/SpringMVC源码分析/请求执行流程(一)之获取Handler.md)
+* [请求执行流程(二)之执行 Handler 方法 ](docs/Spring全家桶/SpringMVC源码分析/请求执行流程(二)之执行Handler方法.md)
-### SpringBoot
+## SpringBoot
* [SpringBoot系列:SpringBoot的前世今生](docs/Spring全家桶/SpringBoot/SpringBoot的前世今生.md)
* [给你一份SpringBoot知识清单.md](docs/Spring全家桶/SpringBoot/给你一份SpringBoot知识清单.md)
@@ -205,15 +265,62 @@
* [SpringBoot中的任务调度与@Async](docs/Spring全家桶/SpringBoot/SpringBoot中的任务调度与@Async.md)
* [基于SpringBoot中的开源监控工具SpringBootAdmin](docs/Spring全家桶/SpringBoot/基于SpringBoot中的开源监控工具SpringBootAdmin.md)
-### SpringBoot源码分析
-
-### SpringCloud
-
-### SpringCloud源码分析
-
-todo
-
-## 设计模式
+## SpringBoot源码分析
+* [@SpringBootApplication 注解](docs/Spring全家桶/SpringBoot源码解析/@SpringBootApplication注解.md)
+* [springboot web应用(一):servlet 组件的注册流程](docs/Spring全家桶/SpringBoot源码解析/SpringBootWeb应用(一):servlet组件的注册流程.md)
+* [springboot web应用(二):WebMvc 装配过程](docs/Spring全家桶/SpringBoot源码解析/SpringBootWeb应用(二):WebMvc装配过程.md)
+
+* [SpringBoot 启动流程(一):准备 SpringApplication](docs/Spring全家桶/SpringBoot源码解析/SpringBoot启动流程(一):准备SpringApplication.md)
+* [SpringBoot 启动流程(二):准备运行环境](docs/Spring全家桶/SpringBoot源码解析/SpringBoot启动流程(二):准备运行环境.md)
+* [SpringBoot 启动流程(三):准备IOC容器](docs/Spring全家桶/SpringBoot源码解析/SpringBoot启动流程(三):准备IOC容器.md)
+* [springboot 启动流程(四):启动IOC容器](docs/Spring全家桶/SpringBoot源码解析/SpringBoot启动流程(四):启动IOC容器.md)
+* [springboot 启动流程(五):完成启动](docs/Spring全家桶/SpringBoot源码解析/SpringBoot启动流程(五):完成启动.md)
+* [springboot 启动流程(六):启动流程总结](docs/Spring全家桶/SpringBoot源码解析/SpringBoot启动流程(六):启动流程总结.md)
+
+* [springboot 自动装配(一):加载自动装配类](docs/Spring全家桶/SpringBoot源码解析/SpringBoot自动装配(一):加载自动装配类.md)
+* [springboot 自动装配(二):条件注解](docs/Spring全家桶/SpringBoot源码解析/SpringBoot自动装配(二):条件注解.md)
+* [springboot 自动装配(三):自动装配顺序](docs/Spring全家桶/SpringBoot源码解析/SpringBoot自动装配(三):自动装配顺序.md)
+
+## SpringCloud
+* [SpringCloud概述](docs/Spring全家桶/SpringCloud/SpringCloud概述.md)
+* [Spring Cloud Config](docs/Spring全家桶/SpringCloud/SpringCloudConfig.md)
+* [Spring Cloud Consul](docs/Spring全家桶/SpringCloud/SpringCloudConsul.md)
+* [Spring Cloud Eureka](docs/Spring全家桶/SpringCloud/SpringCloudEureka.md)
+* [Spring Cloud Gateway](docs/Spring全家桶/SpringCloud/SpringCloudGateway.md)
+* [Spring Cloud Hystrix](docs/Spring全家桶/SpringCloud/SpringCloudHystrix.md)
+* [Spring Cloud LoadBalancer](docs/Spring全家桶/SpringCloud/SpringCloudLoadBalancer.md)
+* [Spring Cloud OpenFeign](docs/Spring全家桶/SpringCloud/SpringCloudOpenFeign.md)
+* [Spring Cloud Ribbon](docs/Spring全家桶/SpringCloud/SpringCloudRibbon.md)
+* [Spring Cloud Sleuth](docs/Spring全家桶/SpringCloud/SpringCloudSleuth.md)
+* [Spring Cloud Zuul](docs/Spring全家桶/SpringCloud/SpringCloudZuul.md)
+
+## SpringCloud 源码分析
+* [Spring Cloud Config源码分析](docs/Spring全家桶/SpringCloud源码分析/SpringCloudConfig源码分析.md)
+* [Spring Cloud Eureka源码分析](docs/Spring全家桶/SpringCloud源码分析/SpringCloudEureka源码分析.md)
+* [Spring Cloud Gateway源码分析](docs/Spring全家桶/SpringCloud源码分析/SpringCloudGateway源码分析.md)
+* [Spring Cloud Hystrix源码分析](docs/Spring全家桶/SpringCloud源码分析/SpringCloudHystrix源码分析.md)
+* [Spring Cloud LoadBalancer源码分析](docs/Spring全家桶/SpringCloud源码分析/SpringCloudLoadBalancer源码分析.md)
+* [Spring Cloud OpenFeign源码分析](docs/Spring全家桶/SpringCloud源码分析/SpringCloudOpenFeign源码分析.md)
+* [Spring Cloud Ribbon源码分析](docs/Spring全家桶/SpringCloud源码分析/SpringCloudRibbon源码分析.md)
+
+## SpringCloud Alibaba
+* [SpringCloud Alibaba概览](docs/Spring全家桶/SpringCloudAlibaba/SpringCloudAlibaba概览.md)
+* [SpringCloud Alibaba nacos](docs/Spring全家桶/SpringCloudAlibaba/SpringCloudAlibabaNacos.md)
+* [SpringCloud Alibaba RocketMQ](docs/Spring全家桶/SpringCloudAlibaba/SpringCloudAlibabaRocketMQ.md)
+* [SpringCloud Alibaba sentinel](docs/Spring全家桶/SpringCloudAlibaba/SpringCloudAlibabaSentinel.md)
+* [SpringCloud Alibaba skywalking](docs/Spring全家桶/SpringCloudAlibaba/SpringCloudAlibabaSkywalking.md)
+* [SpringCloud Alibaba seata](docs/Spring全家桶/SpringCloudAlibaba/SpringCloudAlibabaSeata.md)
+
+## SpringCloud Alibaba源码分析
+* [Spring Cloud Seata源码分析](docs/Spring全家桶/SpringCloudAlibaba源码分析/SpringCloudSeata源码分析.md)
+* [Spring Cloud Sentinel源码分析](docs/Spring全家桶/SpringCloudAlibaba源码分析/SpringCloudSentinel源码分析.md)
+* [SpringCloudAlibaba nacos源码分析:概览](docs/Spring全家桶/SpringCloudAlibaba源码分析/SpringCloudAlibabaNacos源码分析:概览.md)
+* [SpringCloudAlibaba nacos源码分析:服务发现](docs/Spring全家桶/SpringCloudAlibaba源码分析/SpringCloudAlibabaNacos源码分析:服务发现.md)
+* [SpringCloudAlibaba nacos源码分析:服务注册](docs/Spring全家桶/SpringCloudAlibaba源码分析/SpringCloudAlibabaNacos源码分析:服务注册.md)
+* [SpringCloudAlibaba nacos源码分析:配置中心](docs/Spring全家桶/SpringCloudAlibaba源码分析/SpringCloudAlibabaNacos源码分析:配置中心.md)
+* [Spring Cloud RocketMQ源码分析](docs/Spring全家桶/SpringCloudAlibaba源码分析/SpringCloudRocketMQ源码分析.md)
+
+# 设计模式
* [设计模式学习总结](docs/Java/design-parttern/设计模式学习总结.md)
* [初探Java设计模式:创建型模式(工厂,单例等).md](docs/Java/design-parttern/初探Java设计模式:创建型模式(工厂,单例等).md)
@@ -223,32 +330,32 @@ todo
* [初探Java设计模式:Spring涉及到的种设计模式.md](docs/Java/design-parttern/初探Java设计模式:Spring涉及到的种设计模式.md)
-## 计算机基础
+# 计算机基础
-### 计算机网络
+## 计算机网络
todo
-### 操作系统
+## 操作系统
todo
-#### Linux相关
+## Linux相关
todo
-### 数据结构与算法
+## 数据结构与算法
todo
-#### 数据结构
+## 数据结构
todo
-#### 算法
+## 算法
todo
-## 数据库
+# 数据库
todo
-### MySQL
+## MySQL
* [Mysql原理与实践总结](docs/database/Mysql原理与实践总结.md)
* [重新学习Mysql数据库:无废话MySQL入门](docs/database/重新学习MySQL数据库:无废话MySQL入门.md)
* [重新学习Mysql数据库:『浅入浅出』MySQL和InnoDB](docs/database/重新学习MySQL数据库:『浅入浅出』MySQL和InnoDB.md)
@@ -265,9 +372,9 @@ todo
* [重新学习Mysql数据库:Mysql主从复制,读写分离,分表分库策略与实践](docs/database/重新学习MySQL数据库:Mysql主从复制,读写分离,分表分库策略与实践.md)
-## 缓存
+# 缓存
-### Redis
+## Redis
* [Redis原理与实践总结](docs/cache/Redis原理与实践总结.md)
* [探索Redis设计与实现开篇:什么是Redis](docs/cache/探索Redis设计与实现开篇:什么是Redis.md)
* [探索Redis设计与实现:Redis的基础数据结构概览](docs/cache/探索Redis设计与实现:Redis的基础数据结构概览.md)
@@ -286,11 +393,30 @@ todo
* [探索Redis设计与实现:Redis事务浅析与ACID特性介绍](docs/cache/探索Redis设计与实现:Redis事务浅析与ACID特性介绍.md)
* [探索Redis设计与实现:Redis分布式锁进化史 ](docs/cache/探索Redis设计与实现:Redis分布式锁进化史.md )
-## 消息队列
-
-### Kafka
-
-## 大后端
+# 消息队列
+
+## Kafka
+* [消息队列kafka详解:Kafka快速上手(Java版)](docs/mq/kafka/消息队列kafka详解:Kafka快速上手(Java版).md)
+* [消息队列kafka详解:Kafka一条消息存到broker的过程](docs/mq/kafka/消息队列kafka详解:Kafka一条消息存到broker的过程.md)
+* [消息队列kafka详解:消息队列kafka详解:Kafka介绍](docs/mq/kafka/消息队列kafka详解:Kafka介绍.md)
+* [消息队列kafka详解:Kafka原理分析总结篇](docs/mq/kafka/消息队列kafka详解:Kafka原理分析总结篇.md)
+* [消息队列kafka详解:Kafka常见命令及配置总结](docs/mq/kafka/消息队列kafka详解:Kafka常见命令及配置总结.md)
+* [消息队列kafka详解:Kafka架构介绍](docs/mq/kafka/消息队列kafka详解:Kafka架构介绍.md)
+* [消息队列kafka详解:Kafka的集群工作原理](docs/mq/kafka/消息队列kafka详解:Kafka的集群工作原理.md)
+* [消息队列kafka详解:Kafka重要知识点+面试题大全](docs/mq/kafka/消息队列kafka详解:Kafka重要知识点+面试题大全.md)
+* [消息队列kafka详解:如何实现延迟队列](docs/mq/kafka/消息队列kafka详解:如何实现延迟队列.md)
+* [消息队列kafka详解:如何实现死信队列](docs/mq/kafka/消息队列kafka详解:如何实现死信队列.md)
+
+## RocketMQ
+* [RocketMQ系列:事务消息(最终一致性)](docs/mq/RocketMQ/RocketMQ系列:事务消息(最终一致性).md)
+* [RocketMQ系列:基本概念](docs/mq/RocketMQ/RocketMQ系列:基本概念.md)
+* [RocketMQ系列:广播与延迟消息](docs/mq/RocketMQ/RocketMQ系列:广播与延迟消息.md)
+* [RocketMQ系列:批量发送与过滤](docs/mq/RocketMQ/RocketMQ系列:批量发送与过滤.md)
+* [RocketMQ系列:消息的生产与消费](docs/mq/RocketMQ/RocketMQ系列:消息的生产与消费.md)
+* [RocketMQ系列:环境搭建](docs/mq/RocketMQ/RocketMQ系列:环境搭建.md)
+* [RocketMQ系列:顺序消费](docs/mq/RocketMQ/RocketMQ系列:顺序消费.md)
+
+# 大后端
* [后端技术杂谈开篇:云计算,大数据与AI的故事](docs/backend/后端技术杂谈开篇:云计算,大数据与AI的故事.md)
* [后端技术杂谈:搜索引擎基础倒排索引](docs/backend/后端技术杂谈:搜索引擎基础倒排索引.md)
* [后端技术杂谈:搜索引擎工作原理](docs/backend/后端技术杂谈:搜索引擎工作原理.md)
@@ -305,8 +431,8 @@ todo
* [后端技术杂谈:十分钟理解Kubernetes核心概念](docs/backend/后端技术杂谈:十分钟理解Kubernetes核心概念.md)
* [后端技术杂谈:捋一捋大数据研发的基本概念](docs/backend/后端技术杂谈:捋一捋大数据研发的基本概念.md)
-## 分布式
-### 分布式理论
+# 分布式
+## 分布式理论
* [分布式系统理论基础:一致性PC和PC ](docs/distributed/basic/分布式系统理论基础:一致性PC和PC.md)
* [分布式系统理论基础:CAP ](docs/distributed/basic/分布式系统理论基础:CAP.md)
* [分布式系统理论基础:时间时钟和事件顺序](docs/distributed/basic/分布式系统理论基础:时间时钟和事件顺序.md)
@@ -317,7 +443,7 @@ todo
* [分布式系统理论基础:zookeeper分布式协调服务 ](docs/distributed/basic/分布式系统理论基础:zookeeper分布式协调服务.md)
* [分布式理论总结](docs/distributed/分布式技术实践总结.md)
-### 分布式技术
+## 分布式技术
* [搞懂分布式技术:分布式系统的一些基本概念](docs/distributed/practice/搞懂分布式技术:分布式系统的一些基本概念.md )
* [搞懂分布式技术:分布式一致性协议与Paxos,Raft算法](docs/distributed/practice/搞懂分布式技术:分布式一致性协议与Paxos,Raft算法.md)
* [搞懂分布式技术:初探分布式协调服务zookeeper](docs/distributed/practice/搞懂分布式技术:初探分布式协调服务zookeeper.md )
@@ -338,29 +464,29 @@ todo
* [搞懂分布式技术:浅谈分布式消息技术Kafka](docs/distributed/practice/搞懂分布式技术:浅谈分布式消息技术Kafka.md )
* [分布式技术实践总结](docs/distributed/分布式理论总结.md)
-## 面试指南
+# 面试指南
todo
-### 校招指南
+## 校招指南
todo
-### 面经
+## 面经
todo
-## 工具
+# 工具
todo
-## 资料
+# 资料
todo
-### 书单
+## 书单
todo
-## 待办
+# 待办
springboot和springcloud
-## 微信公众号
+# 微信公众号
-### Java技术江湖
+## Java技术江湖
如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】

diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot/springboot\346\211\223\345\214\205\344\270\216\345\220\257\345\212\250.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot/SpringBoot\346\211\223\345\214\205\344\270\216\345\220\257\345\212\250.md"
similarity index 100%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot/springboot\346\211\223\345\214\205\344\270\216\345\220\257\345\212\250.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot/SpringBoot\346\211\223\345\214\205\344\270\216\345\220\257\345\212\250.md"
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/@SpringBootApplication \346\263\250\350\247\243.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/@SpringBootApplication\346\263\250\350\247\243.md"
similarity index 100%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/@SpringBootApplication \346\263\250\350\247\243.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/@SpringBootApplication\346\263\250\350\247\243.md"
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/springboot web\345\272\224\347\224\250\357\274\210\344\270\200\357\274\211\357\274\232servlet \347\273\204\344\273\266\347\232\204\346\263\250\345\206\214\346\265\201\347\250\213.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/SpringBootWeb\345\272\224\347\224\250\357\274\210\344\270\200\357\274\211\357\274\232servlet\347\273\204\344\273\266\347\232\204\346\263\250\345\206\214\346\265\201\347\250\213.md"
similarity index 100%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/springboot web\345\272\224\347\224\250\357\274\210\344\270\200\357\274\211\357\274\232servlet \347\273\204\344\273\266\347\232\204\346\263\250\345\206\214\346\265\201\347\250\213.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/SpringBootWeb\345\272\224\347\224\250\357\274\210\344\270\200\357\274\211\357\274\232servlet\347\273\204\344\273\266\347\232\204\346\263\250\345\206\214\346\265\201\347\250\213.md"
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/springboot web\345\272\224\347\224\250\357\274\210\344\272\214\357\274\211\357\274\232WebMvc \350\243\205\351\205\215\350\277\207\347\250\213.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/SpringBootWeb\345\272\224\347\224\250\357\274\210\344\272\214\357\274\211\357\274\232WebMvc\350\243\205\351\205\215\350\277\207\347\250\213.md"
similarity index 100%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/springboot web\345\272\224\347\224\250\357\274\210\344\272\214\357\274\211\357\274\232WebMvc \350\243\205\351\205\215\350\277\207\347\250\213.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/SpringBootWeb\345\272\224\347\224\250\357\274\210\344\272\214\357\274\211\357\274\232WebMvc\350\243\205\351\205\215\350\277\207\347\250\213.md"
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/SpringBoot \345\220\257\345\212\250\346\265\201\347\250\213\357\274\210\344\270\200\357\274\211\357\274\232\345\207\206\345\244\207 SpringApplication.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/SpringBoot\345\220\257\345\212\250\346\265\201\347\250\213\357\274\210\344\270\200\357\274\211\357\274\232\345\207\206\345\244\207SpringApplication.md"
similarity index 100%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/SpringBoot \345\220\257\345\212\250\346\265\201\347\250\213\357\274\210\344\270\200\357\274\211\357\274\232\345\207\206\345\244\207 SpringApplication.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/SpringBoot\345\220\257\345\212\250\346\265\201\347\250\213\357\274\210\344\270\200\357\274\211\357\274\232\345\207\206\345\244\207SpringApplication.md"
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/SpringBoot \345\220\257\345\212\250\346\265\201\347\250\213\357\274\210\344\270\211\357\274\211\357\274\232\345\207\206\345\244\207IOC\345\256\271\345\231\250.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/SpringBoot\345\220\257\345\212\250\346\265\201\347\250\213\357\274\210\344\270\211\357\274\211\357\274\232\345\207\206\345\244\207IOC\345\256\271\345\231\250.md"
similarity index 100%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/SpringBoot \345\220\257\345\212\250\346\265\201\347\250\213\357\274\210\344\270\211\357\274\211\357\274\232\345\207\206\345\244\207IOC\345\256\271\345\231\250.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/SpringBoot\345\220\257\345\212\250\346\265\201\347\250\213\357\274\210\344\270\211\357\274\211\357\274\232\345\207\206\345\244\207IOC\345\256\271\345\231\250.md"
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/SpringBoot \345\220\257\345\212\250\346\265\201\347\250\213\357\274\210\344\272\214\357\274\211\357\274\232\345\207\206\345\244\207\350\277\220\350\241\214\347\216\257\345\242\203.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/SpringBoot\345\220\257\345\212\250\346\265\201\347\250\213\357\274\210\344\272\214\357\274\211\357\274\232\345\207\206\345\244\207\350\277\220\350\241\214\347\216\257\345\242\203.md"
similarity index 100%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/SpringBoot \345\220\257\345\212\250\346\265\201\347\250\213\357\274\210\344\272\214\357\274\211\357\274\232\345\207\206\345\244\207\350\277\220\350\241\214\347\216\257\345\242\203.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/SpringBoot\345\220\257\345\212\250\346\265\201\347\250\213\357\274\210\344\272\214\357\274\211\357\274\232\345\207\206\345\244\207\350\277\220\350\241\214\347\216\257\345\242\203.md"
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/springboot \345\220\257\345\212\250\346\265\201\347\250\213\357\274\210\344\272\224\357\274\211\357\274\232\345\256\214\346\210\220\345\220\257\345\212\250.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/SpringBoot\345\220\257\345\212\250\346\265\201\347\250\213\357\274\210\344\272\224\357\274\211\357\274\232\345\256\214\346\210\220\345\220\257\345\212\250.md"
similarity index 100%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/springboot \345\220\257\345\212\250\346\265\201\347\250\213\357\274\210\344\272\224\357\274\211\357\274\232\345\256\214\346\210\220\345\220\257\345\212\250.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/SpringBoot\345\220\257\345\212\250\346\265\201\347\250\213\357\274\210\344\272\224\357\274\211\357\274\232\345\256\214\346\210\220\345\220\257\345\212\250.md"
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/springboot \345\220\257\345\212\250\346\265\201\347\250\213\357\274\210\345\205\255\357\274\211\357\274\232\345\220\257\345\212\250\346\265\201\347\250\213\346\200\273\347\273\223.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/SpringBoot\345\220\257\345\212\250\346\265\201\347\250\213\357\274\210\345\205\255\357\274\211\357\274\232\345\220\257\345\212\250\346\265\201\347\250\213\346\200\273\347\273\223.md"
similarity index 100%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/springboot \345\220\257\345\212\250\346\265\201\347\250\213\357\274\210\345\205\255\357\274\211\357\274\232\345\220\257\345\212\250\346\265\201\347\250\213\346\200\273\347\273\223.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/SpringBoot\345\220\257\345\212\250\346\265\201\347\250\213\357\274\210\345\205\255\357\274\211\357\274\232\345\220\257\345\212\250\346\265\201\347\250\213\346\200\273\347\273\223.md"
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/springboot \345\220\257\345\212\250\346\265\201\347\250\213\357\274\210\345\233\233\357\274\211\357\274\232\345\220\257\345\212\250IOC\345\256\271\345\231\250.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/SpringBoot\345\220\257\345\212\250\346\265\201\347\250\213\357\274\210\345\233\233\357\274\211\357\274\232\345\220\257\345\212\250IOC\345\256\271\345\231\250.md"
similarity index 100%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/springboot \345\220\257\345\212\250\346\265\201\347\250\213\357\274\210\345\233\233\357\274\211\357\274\232\345\220\257\345\212\250IOC\345\256\271\345\231\250.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/SpringBoot\345\220\257\345\212\250\346\265\201\347\250\213\357\274\210\345\233\233\357\274\211\357\274\232\345\220\257\345\212\250IOC\345\256\271\345\231\250.md"
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/springboot \350\207\252\345\212\250\350\243\205\351\205\215\357\274\210\344\270\200\357\274\211\357\274\232\345\212\240\350\275\275\350\207\252\345\212\250\350\243\205\351\205\215\347\261\273.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/SpringBoot\350\207\252\345\212\250\350\243\205\351\205\215\357\274\210\344\270\200\357\274\211\357\274\232\345\212\240\350\275\275\350\207\252\345\212\250\350\243\205\351\205\215\347\261\273.md"
similarity index 100%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/springboot \350\207\252\345\212\250\350\243\205\351\205\215\357\274\210\344\270\200\357\274\211\357\274\232\345\212\240\350\275\275\350\207\252\345\212\250\350\243\205\351\205\215\347\261\273.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/SpringBoot\350\207\252\345\212\250\350\243\205\351\205\215\357\274\210\344\270\200\357\274\211\357\274\232\345\212\240\350\275\275\350\207\252\345\212\250\350\243\205\351\205\215\347\261\273.md"
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/springboot \350\207\252\345\212\250\350\243\205\351\205\215\357\274\210\344\270\211\357\274\211\357\274\232\350\207\252\345\212\250\350\243\205\351\205\215\351\241\272\345\272\217.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/SpringBoot\350\207\252\345\212\250\350\243\205\351\205\215\357\274\210\344\270\211\357\274\211\357\274\232\350\207\252\345\212\250\350\243\205\351\205\215\351\241\272\345\272\217.md"
similarity index 100%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/springboot \350\207\252\345\212\250\350\243\205\351\205\215\357\274\210\344\270\211\357\274\211\357\274\232\350\207\252\345\212\250\350\243\205\351\205\215\351\241\272\345\272\217.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/SpringBoot\350\207\252\345\212\250\350\243\205\351\205\215\357\274\210\344\270\211\357\274\211\357\274\232\350\207\252\345\212\250\350\243\205\351\205\215\351\241\272\345\272\217.md"
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/springboot \350\207\252\345\212\250\350\243\205\351\205\215\357\274\210\344\272\214\357\274\211\357\274\232\346\235\241\344\273\266\346\263\250\350\247\243.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/SpringBoot\350\207\252\345\212\250\350\243\205\351\205\215\357\274\210\344\272\214\357\274\211\357\274\232\346\235\241\344\273\266\346\263\250\350\247\243.md"
similarity index 100%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/springboot \350\207\252\345\212\250\350\243\205\351\205\215\357\274\210\344\272\214\357\274\211\357\274\232\346\235\241\344\273\266\346\263\250\350\247\243.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringBoot\346\272\220\347\240\201\350\247\243\346\236\220/SpringBoot\350\207\252\345\212\250\350\243\205\351\205\215\357\274\210\344\272\214\357\274\211\357\274\232\346\235\241\344\273\266\346\263\250\350\247\243.md"
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud Config.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudConfig.md"
similarity index 98%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud Config.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudConfig.md"
index 67c9c5a..cb6a94c 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud Config.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudConfig.md"
@@ -821,4 +821,13 @@ config:
4\. ʹ��������ٴη��ʡ�http://localhost:3366/getConfig�����������ͼ��

-ͼ17��Spring Cloud Bus ����֪ͨ
\ No newline at end of file
+ͼ17��Spring Cloud Bus ����֪ͨ
+
+
+# �����
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud Consul.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudConsul.md"
similarity index 94%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud Consul.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudConsul.md"
index 730cda5..85fcf19 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud Consul.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudConsul.md"
@@ -239,3 +239,10 @@ Spring Cloud Consul
# ��ĿԴ���ַ
https://github.com/macrozheng/springcloud-learning
+# �����
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud Eureka.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudEureka.md"
similarity index 99%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud Eureka.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudEureka.md"
index b1a2d68..960e5c7 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud Eureka.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudEureka.md"
@@ -1041,4 +1041,12 @@ enable-self-preservation: false # false
��ͼ 11 �� �������Կ����������ݣ�
* �� DS Replicas ѡ����������˺�ɫ������Ϣ��EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.�������ָ���Ϣ���� Eureka �����ұ������ƴ��ڿ���״̬�����Ѿ���������
-* micro-service-cloud-provider-dept-8001 �ķ�����Ϣ��Ȼ���� Eureka Server ����ע����У���δ���Ƴ���
\ No newline at end of file
+* micro-service-cloud-provider-dept-8001 �ķ�����Ϣ��Ȼ���� Eureka Server ����ע����У���δ���Ƴ���
+
+# �����
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud Gateway.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudGateway.md"
similarity index 97%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud Gateway.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudGateway.md"
index 8b7ad04..e99968d 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud Gateway.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudGateway.md"
@@ -496,9 +496,18 @@ eureka:
2\. ����```micro-service-cloud-gateway-9527��ʹ����������ʡ�http://eureka7001.com:9527/dept/list�������ǻᷢ�ַ��ʱ� 406 ������̨������¡�
```2021-10-21 16:25:39.450 INFO 19116 --- [ctor-http-nio-4] net.biancheng.c.filter.MyGlobalFilter : Thu Oct 21 16:25:39 CST 2021�����Զ����ȫ�ֹ����� MyGlobalFilter
-2021-10-21 16:25:39.451 INFO 19116 --- [ctor-http-nio-4] net.biancheng.c.filter.MyGlobalFilter : ���� uname ����Ϊ null��```
+2021-10-21 16:25:39.451 INFO 19116 --- [ctor-http-nio-4] net.biancheng.c.filter.MyGlobalFilter : ���� uname ����Ϊ null��
+```
3\. ʹ����������ʡ�http://eureka7001.com:9527/dept/list?uname=123��,�������ͼ��

-ͼ7���Զ���ȫ�����ع�����
\ No newline at end of file
+ͼ7���Զ���ȫ�����ع�����
+
+# �����
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud Hystrix.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudHystrix.md"
similarity index 99%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud Hystrix.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudHystrix.md"
index adddc7d..1a26d68 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud Hystrix.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudHystrix.md"
@@ -1109,4 +1109,12 @@ public class HystrixDashboardConfig {
8\. ʹ���������η��ʡ�http://eureka7001.com:8004/dept/hystrix/circuit/1���� ��http://eureka7001.com:8004/dept/hystrix/circuit/-1�����鿴 Hystrix ���ҳ�棬����ͼ��

-ͼ16��Hystrix ��ط����������
\ No newline at end of file
+ͼ16��Hystrix ��ط����������
+
+# �����
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud LoadBalancer.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudLoadBalancer.md"
similarity index 97%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud LoadBalancer.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudLoadBalancer.md"
index 9289412..1a35579 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud LoadBalancer.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudLoadBalancer.md"
@@ -336,3 +336,11 @@ LoadBalancerΪ
# ��ĿԴ���ַ
https://github.com/macrozheng/springcloud-learning/tree/master/nacos-loadbalancer-service
+
+# �����
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud OpenFeign.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudOpenFeign.md"
similarity index 98%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud OpenFeign.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudOpenFeign.md"
index d2e6a26..50c14d5 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud OpenFeign.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudOpenFeign.md"
@@ -479,4 +479,11 @@ Logger.Level
2021-10-12 14:33:07.983 DEBUG 13388 --- [p-nio-80-exec-2] n.biancheng.c.service.DeptFeignService : [DeptFeignService#list]
2021-10-12 14:33:07.991 DEBUG 13388 --- [p-nio-80-exec-2] n.biancheng.c.service.DeptFeignService : [DeptFeignService#list] [{"deptNo":1,"deptName":"������","dbSource":"bianchengbang_jdbc"},{"deptNo":2,"deptName":"���²�","dbSource":"bianchengbang_jdbc"},{"deptNo":3,"deptName":"����","dbSource":"bianchengbang_jdbc"},{"deptNo":4,"deptName":"�г���","dbSource":"bianchengbang_jdbc"},{"deptNo":5,"deptName":"��ά��","dbSource":"bianchengbang_jdbc"}]
2021-10-12 14:33:07.991 DEBUG 13388 --- [p-nio-80-exec-2] n.biancheng.c.service.DeptFeignService : [DeptFeignService#list] <--- END HTTP (341-byte body)```
-```
\ No newline at end of file
+```
+# �����
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud Ribbon.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudRibbon.md"
similarity index 98%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud Ribbon.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudRibbon.md"
index 7d3f979..74eff0a 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud Ribbon.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudRibbon.md"
@@ -654,4 +654,12 @@ public class MicroServiceCloudConsumerDept80Application {

ͼ6�����Ƹ��ؾ������
-ͨ��ͼ 6 �� dbSource �ֶ�ȡֵ�ı仯���Կ��������Ƕ��Ƶĸ��ؾ�������Ѿ���Ч��
\ No newline at end of file
+ͨ��ͼ 6 �� dbSource �ֶ�ȡֵ�ı仯���Կ��������Ƕ��Ƶĸ��ؾ�������Ѿ���Ч��
+
+# �����
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud Sleuth.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudSleuth.md"
similarity index 93%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud Sleuth.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudSleuth.md"
index e3f2000..45bc82f 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud Sleuth.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudSleuth.md"
@@ -131,4 +131,12 @@ springcloud-learning
## [#](https://www.macrozheng.com/cloud/sleuth.html#%E9%A1%B9%E7%9B%AE%E6%BA%90%E7%A0%81%E5%9C%B0%E5%9D%80)��ĿԴ���ַ
-[https://github.com/macrozheng/springcloud-learning](https://github.com/macrozheng/springcloud-learning)
\ No newline at end of file
+[https://github.com/macrozheng/springcloud-learning](https://github.com/macrozheng/springcloud-learning)
+
+# �����
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud Zuul.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudZuul.md"
similarity index 97%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud Zuul.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudZuul.md"
index 7bca86e..9040110 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/Spring Cloud Zuul.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloudZuul.md"
@@ -384,3 +384,9 @@ Zuul
#��ĿԴ���ַ
https://github.com/macrozheng/springcloud-learning
+# �����
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloud\346\246\202\350\277\260.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloud\346\246\202\350\277\260.md"
index fb27ab5..a525595 100644
--- "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloud\346\246\202\350\277\260.md"
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloud/SpringCloud\346\246\202\350\277\260.md"
@@ -134,4 +134,10 @@ Spring Boot
����
}
-````
\ No newline at end of file
+````
+# �����
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba/SpringCloud Alibaba nacos.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba/SpringCloudAlibabaNacos.md"
similarity index 100%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba/SpringCloud Alibaba nacos.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba/SpringCloudAlibabaNacos.md"
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba/SpringCloud Alibaba RocketMQ.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba/SpringCloudAlibabaRocketMQ.md"
similarity index 100%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba/SpringCloud Alibaba RocketMQ.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba/SpringCloudAlibabaRocketMQ.md"
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba/SpringCloud Alibaba seata.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba/SpringCloudAlibabaSeata.md"
similarity index 100%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba/SpringCloud Alibaba seata.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba/SpringCloudAlibabaSeata.md"
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba/SpringCloud Alibaba sentinel.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba/SpringCloudAlibabaSentinel.md"
similarity index 100%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba/SpringCloud Alibaba sentinel.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba/SpringCloudAlibabaSentinel.md"
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba/SpringCloud Alibaba skywalking.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba/SpringCloudAlibabaSkywalking.md"
similarity index 100%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba/SpringCloud Alibaba skywalking.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba/SpringCloudAlibabaSkywalking.md"
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba/SpringCloud Alibaba\346\246\202\350\247\210.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba/SpringCloudAlibaba\346\246\202\350\247\210.md"
similarity index 100%
rename from "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba/SpringCloud Alibaba\346\246\202\350\247\210.md"
rename to "docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba/SpringCloudAlibaba\346\246\202\350\247\210.md"
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudAlibabaNacos\346\272\220\347\240\201\345\210\206\346\236\220\357\274\232\346\234\215\345\212\241\345\217\221\347\216\260.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudAlibabaNacos\346\272\220\347\240\201\345\210\206\346\236\220\357\274\232\346\234\215\345\212\241\345\217\221\347\216\260.md"
new file mode 100644
index 0000000..af691d6
--- /dev/null
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudAlibabaNacos\346\272\220\347\240\201\345\210\206\346\236\220\357\274\232\346\234\215\345\212\241\345\217\221\347\216\260.md"
@@ -0,0 +1,469 @@
+# һ��Nacos����������ͼ
+
+
+
+�������Լ�����һ�����̣�Ҳ���Բο���[Nacos����ע��Դ���������ͼ](https://blog.csdn.net/Saintmm/article/details/121981184)
+
+# ������Դ�����
+
+spring-cloud-commons���ж�����һ�����ֵĹ淶����������`DiscoveryClient`�ӿ��У�
+
+����Spring Cloudʵ�ַ����ֵ��������ʵ��`DiscoveryClient`�ӿڣ�nacos-discovery���µ�`NacosDiscoveryClient`��ʵ��`DiscoveryClient`�ӿڡ�
+
+
+# �����ͻ��˷�����
+
+> 1����nacos�ͻ�����?����֮����ֻ��ȥ������ע�ᡢ���û�ȡ�Ȳ���������������ȥ���������Ϣ��
+> 2������һ������ʱ�Ż�ȥ��ȡ����`�����ػ���`��
+
+#### 1���ȴӱ��ػ���serviceInfoMap�л�ȡ����ʵ����Ϣ����ȡ������ͨ��`NamingProxy`����Nacos ����˻�ȡ����ʵ����Ϣ���������ʱ����ÿ���������� ��ȡʵ����Ϣ�б��������±��ػ���serviceInfoMap��
+
+```
+// NacosDiscoveryClient#getInstances()
+public List getInstances(String serviceId) {
+ try {
+ // ͨ��NacosNamingService��ȡ�����Ӧ��ʵ����Ϣ�����ȥ
+ List instances = discoveryProperties.namingServiceInstance()
+ .selectInstances(serviceId, true);
+ return hostToServiceInstanceList(instances, serviceId);
+ } catch (Exception e) {
+ throw new RuntimeException(
+ "Can not get hosts from nacos server. serviceId: " + serviceId, e);
+ }
+}
+
+// NacosNamingService#selectInstances()
+public List selectInstances(String serviceName, boolean healthy) throws NacosException {
+ return selectInstances(serviceName, new ArrayList(), healthy);
+}
+public List selectInstances(String serviceName, List clusters, boolean healthy)
+ throws NacosException {
+ // Ĭ���߶���ģʽ
+ return selectInstances(serviceName, clusters, healthy, true);
+}
+public List selectInstances(String serviceName, List clusters, boolean healthy,
+ boolean subscribe) throws NacosException {
+ // Ĭ�ϲ�ѯDEFAULT_GROUP�µķ���ʵ����Ϣ
+ return selectInstances(serviceName, Constants.DEFAULT_GROUP, clusters, healthy, subscribe);
+}
+public List selectInstances(String serviceName, String groupName, List clusters, boolean healthy, boolean subscribe) throws NacosException {
+
+ ServiceInfo serviceInfo;
+ // Ĭ���߶���ģʽ����subscribeΪTRUE
+ if (subscribe) {
+ serviceInfo = hostReactor.getServiceInfo(NamingUtils.getGroupedName(serviceName, groupName), StringUtils.join(clusters, ","));
+ } else {
+ serviceInfo = hostReactor.getServiceInfoDirectlyFromServer(NamingUtils.getGroupedName(serviceName, groupName), StringUtils.join(clusters, ","));
+ }
+ return selectInstances(serviceInfo, healthy);
+}
+```
+
+`HostReactor#getServiceInfo()`������������ȡ����ʵ����Ϣ�ĵط���
+
+```
+public ServiceInfo getServiceInfo(final String serviceName, final String clusters) {
+
+ NAMING_LOGGER.debug("failover-mode: " + failoverReactor.isFailoverSwitch());
+ String key = ServiceInfo.getKey(serviceName, clusters);
+ if (failoverReactor.isFailoverSwitch()) {
+ return failoverReactor.getService(key);
+ }
+
+ // 1���ӱ��ػ���serviceInfoMap�л�ȡʵ����Ϣ
+ ServiceInfo serviceObj = getServiceInfo0(serviceName, clusters);
+
+ // 2��������ػ�����û�У�����HTTP���ô�Nacos����˻�ȡ
+ if (null == serviceObj) {
+ serviceObj = new ServiceInfo(serviceName, clusters);
+
+ serviceInfoMap.put(serviceObj.getKey(), serviceObj);
+
+ updatingMap.put(serviceName, new Object());
+ updateServiceNow(serviceName, clusters);
+ updatingMap.remove(serviceName);
+
+ } else if (updatingMap.containsKey(serviceName)) {
+
+ if (UPDATE_HOLD_INTERVAL > 0) {
+ // hold a moment waiting for update finish
+ synchronized (serviceObj) {
+ try {
+ serviceObj.wait(UPDATE_HOLD_INTERVAL);
+ } catch (InterruptedException e) {
+ NAMING_LOGGER.error("[getServiceInfo] serviceName:" + serviceName + ", clusters:" + clusters, e);
+ }
+ }
+ }
+ }
+
+ // 3������һ����ʱ����ÿ��һ���Nacos����˻�ȡ���µķ���ʵ����Ϣ�����µ����ػ���seriveInfoMap��
+ scheduleUpdateIfAbsent(serviceName, clusters);
+
+ // 4�� �ӱ��ػ���serviceInfoMap�л�ȡ����ʵ����Ϣ
+ return serviceInfoMap.get(serviceObj.getKey());
+}
+```
+
+1���ӱ��ػ����л�ȡ����ʵ����Ϣ��
+
+```
+private ServiceInfo getServiceInfo0(String serviceName, String clusters) {
+
+ String key = ServiceInfo.getKey(serviceName, clusters);
+
+ return serviceInfoMap.get(key);
+}
+```
+
+2������HTTP���ô�Nacos����˻�ȡ����ʵ����Ϣ��
+
+```
+public void updateServiceNow(String serviceName, String clusters) {
+ ServiceInfo oldService = getServiceInfo0(serviceName, clusters);
+ try {
+
+ // ͨ��NamingProxy��HTTP�ӿڵ��ã���ȡ����ʵ����Ϣ
+ String result = serverProxy.queryList(serviceName, clusters, pushReceiver.getUDPPort(), false);
+ if (StringUtils.isNotEmpty(result)) {
+ // ���±��ػ���serviceInfoMap
+ processServiceJSON(result);
+ }
+ } catch (Exception e) {
+ NAMING_LOGGER.error("[NA] failed to update serviceName: " + serviceName, e);
+ } finally {
+ if (oldService != null) {
+ synchronized (oldService) {
+ oldService.notifyAll();
+ }
+ }
+ }
+}
+```
+
+3������һ����ʱ����ÿ��һ���Nacos����˻�ȡ���µķ���ʵ����Ϣ�����µ����ػ���seriveInfoMap�У�
+
+```
+public void scheduleUpdateIfAbsent(String serviceName, String clusters) {
+ if (futureMap.get(ServiceInfo.getKey(serviceName, clusters)) != null) {
+ return;
+ }
+
+ synchronized (futureMap) {
+ if (futureMap.get(ServiceInfo.getKey(serviceName, clusters)) != null) {
+ return;
+ }
+
+ // ������ʱ����
+ ScheduledFuture> future = addTask(new UpdateTask(serviceName, clusters));
+ futureMap.put(ServiceInfo.getKey(serviceName, clusters), future);
+ }
+}
+
+// ��ʱ����ִ������UpdateTask#run()
+public void run() {
+ try {
+ ServiceInfo serviceObj = serviceInfoMap.get(ServiceInfo.getKey(serviceName, clusters));
+
+ if (serviceObj == null) {
+ updateServiceNow(serviceName, clusters);
+ executor.schedule(this, DEFAULT_DELAY, TimeUnit.MILLISECONDS);
+ return;
+ }
+
+ if (serviceObj.getLastRefTime() <= lastRefTime) {
+ updateServiceNow(serviceName, clusters);
+ serviceObj = serviceInfoMap.get(ServiceInfo.getKey(serviceName, clusters));
+ } else {
+ // if serviceName already updated by push, we should not override it
+ // since the push data may be different from pull through force push
+ refreshOnly(serviceName, clusters);
+ }
+
+ // ����һ����ʱ����1s֮��ִ��
+ executor.schedule(this, serviceObj.getCacheMillis(), TimeUnit.MILLISECONDS);
+
+ lastRefTime = serviceObj.getLastRefTime();
+ } catch (Throwable e) {
+ NAMING_LOGGER.warn("[NA] failed to update serviceName: " + serviceName, e);
+ }
+
+}
+```
+
+��ѯ����ʵ���б���
+
+```
+public String queryList(String serviceName, String clusters, int udpPort, boolean healthyOnly)
+ throws NacosException {
+
+ final Map params = new HashMap(8);
+ params.put(CommonParams.NAMESPACE_ID, namespaceId);
+ params.put(CommonParams.SERVICE_NAME, serviceName);
+ params.put("clusters", clusters);
+ params.put("udpPort", String.valueOf(udpPort));
+ params.put("clientIP", NetUtils.localIP());
+ params.put("healthyOnly", String.valueOf(healthyOnly));
+
+ return reqAPI(UtilAndComs.NACOS_URL_BASE + "/instance/list", params, HttpMethod.GET);
+}
+```
+
+#### 2����HostReactorʵ������ʱ���ʵ����PushReceiver����������һ���߳���ѭ��ͨ��`DatagramSocket#receive()`����Nacos������з���ʵ����Ϣ����������UDP֪ͨ��
+
+```
+public class PushReceiver implements Runnable {
+ private DatagramSocket udpSocket;
+
+ public PushReceiver(HostReactor hostReactor) {
+ try {
+ this.hostReactor = hostReactor;
+ udpSocket = new DatagramSocket();
+ // ����һ���߳�
+ executorService = new ScheduledThreadPoolExecutor(1, new ThreadFactory() {
+ @Override
+ public Thread newThread(Runnable r) {
+ Thread thread = new Thread(r);
+ thread.setDaemon(true);
+ thread.setName("com.alibaba.nacos.naming.push.receiver");
+ return thread;
+ }
+ });
+
+ executorService.execute(this);
+ } catch (Exception e) {
+ NAMING_LOGGER.error("[NA] init udp socket failed", e);
+ }
+ }
+
+ public void run() {
+ while (true) {
+ try {
+ // byte[] is initialized with 0 full filled by default
+ byte[] buffer = new byte[UDP_MSS];
+ DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
+
+ // ����Nacos����˷���ʵ����Ϣ������֪ͨ
+ udpSocket.receive(packet);
+
+ String json = new String(IoUtils.tryDecompress(packet.getData()), "UTF-8").trim();
+ NAMING_LOGGER.info("received push data: " + json + " from " + packet.getAddress().toString());
+
+ PushPacket pushPacket = JSON.parseObject(json, PushPacket.class);
+ String ack;
+ if ("dom".equals(pushPacket.type) || "service".equals(pushPacket.type)) {
+ hostReactor.processServiceJSON(pushPacket.data);
+
+ // send ack to server
+ ack = "{\"type\": \"push-ack\""
+ + ", \"lastRefTime\":\"" + pushPacket.lastRefTime
+ + "\", \"data\":" + "\"\"}";
+ } else if ("dump".equals(pushPacket.type)) {
+ // dump data to server
+ ack = "{\"type\": \"dump-ack\""
+ + ", \"lastRefTime\": \"" + pushPacket.lastRefTime
+ + "\", \"data\":" + "\""
+ + StringUtils.escapeJavaScript(JSON.toJSONString(hostReactor.getServiceInfoMap()))
+ + "\"}";
+ } else {
+ // do nothing send ack only
+ ack = "{\"type\": \"unknown-ack\""
+ + ", \"lastRefTime\":\"" + pushPacket.lastRefTime
+ + "\", \"data\":" + "\"\"}";
+ }
+
+ udpSocket.send(new DatagramPacket(ack.getBytes(Charset.forName("UTF-8")),
+ ack.getBytes(Charset.forName("UTF-8")).length, packet.getSocketAddress()));
+ } catch (Exception e) {
+ NAMING_LOGGER.error("[NA] error while receiving push data", e);
+ }
+ }
+ }
+
+}
+```
+
+# �ġ�����˷�����
+
+Nacos����˵ķ�������Ҫ�������£�
+
+> 1����ѯ����ʵ���б����ȴӻ���serviceMap���ҵ�service��Ӧ��Cluster���ٴ�Cluster������Set��`persistentInstances`��`ephemeralInstances`��ȡȫ����ʵ����Ϣ��
+> 2�����ͻ��˴�����ip��udp�˿ںż����ӵ�`clientMap`���������������ͣ�clientMap����`NamingSubscriberService`��ʵ����`NamingSubscriberServiceV1Impl`����key��service name��value�Ƕ����˸÷���Ŀͻ����б�(ip+�˿ں�)��
+
+��naming��Ŀ�µ� InstanceController���list()������
+
+#### 1����ȡ����ʵ���б�
+
+```
+@GetMapping("/list")
+@Secured(parser = NamingResourceParser.class, action = ActionTypes.READ)
+public Object list(HttpServletRequest request) throws Exception {
+
+ String namespaceId = WebUtils.optional(request, CommonParams.NAMESPACE_ID, Constants.DEFAULT_NAMESPACE_ID);
+ String serviceName = WebUtils.required(request, CommonParams.SERVICE_NAME);
+ NamingUtils.checkServiceNameFormat(serviceName);
+
+ String agent = WebUtils.getUserAgent(request);
+ String clusters = WebUtils.optional(request, "clusters", StringUtils.EMPTY);
+ String clientIP = WebUtils.optional(request, "clientIP", StringUtils.EMPTY);
+ int udpPort = Integer.parseInt(WebUtils.optional(request, "udpPort", "0"));
+ boolean healthyOnly = Boolean.parseBoolean(WebUtils.optional(request, "healthyOnly", "false"));
+
+ boolean isCheck = Boolean.parseBoolean(WebUtils.optional(request, "isCheck", "false"));
+
+ String app = WebUtils.optional(request, "app", StringUtils.EMPTY);
+ String env = WebUtils.optional(request, "env", StringUtils.EMPTY);
+ String tenant = WebUtils.optional(request, "tid", StringUtils.EMPTY);
+
+ Subscriber subscriber = new Subscriber(clientIP + ":" + udpPort, agent, app, clientIP, namespaceId, serviceName,
+ udpPort, clusters);
+ // ��ȥInstanceOperatorServiceImpl#listInstance()������ȡ����ʵ���б�
+ return getInstanceOperator().listInstance(namespaceId, serviceName, subscriber, clusters, healthyOnly);
+}
+
+//InstanceOperatorServiceImpl#listInstance()
+public ServiceInfo listInstance(String namespaceId, String serviceName, Subscriber subscriber, String cluster,
+ boolean healthOnly) throws Exception {
+ ClientInfo clientInfo = new ClientInfo(subscriber.getAgent());
+ String clientIP = subscriber.getIp();
+ ServiceInfo result = new ServiceInfo(serviceName, cluster);
+ Service service = serviceManager.getService(namespaceId, serviceName);
+ long cacheMillis = switchDomain.getDefaultCacheMillis();
+
+ // now try to enable the push
+ try {
+ // �����������ͷ���UdpPushService��������ʵ����Ϣ�������ʱͨ��UDP�ķ�ʽ֪ͨNacos Client
+ if (subscriber.getPort() > 0 && pushService.canEnablePush(subscriber.getAgent())) {
+ subscriberServiceV1.addClient(namespaceId, serviceName, cluster, subscriber.getAgent(),
+ new InetSocketAddress(clientIP, subscriber.getPort()), pushDataSource, StringUtils.EMPTY,
+ StringUtils.EMPTY);
+ cacheMillis = switchDomain.getPushCacheMillis(serviceName);
+ }
+ } catch (Exception e) {
+ Loggers.SRV_LOG.error("[NACOS-API] failed to added push client {}, {}:{}", clientInfo, clientIP,
+ subscriber.getPort(), e);
+ cacheMillis = switchDomain.getDefaultCacheMillis();
+ }
+
+ if (service == null) {
+ if (Loggers.SRV_LOG.isDebugEnabled()) {
+ Loggers.SRV_LOG.debug("no instance to serve for service: {}", serviceName);
+ }
+ result.setCacheMillis(cacheMillis);
+ return result;
+ }
+
+ // �������Ƿ����
+ checkIfDisabled(service);
+
+ // �����ǻ�ȡ����ע����Ϣ�Ĺؼ����룬��ȡ�������ú���ʱ����ʵ��
+ List srvedIps = service
+ .srvIPs(Arrays.asList(StringUtils.split(cluster, StringUtils.COMMA)));
+
+ // filter ips using selector��ѡ�������˷���
+ if (service.getSelector() != null && StringUtils.isNotBlank(clientIP)) {
+ srvedIps = selectorManager.select(service.getSelector(), clientIP, srvedIps);
+ }
+
+ // ����Ҳ��������ص�ǰ����
+ if (CollectionUtils.isEmpty(srvedIps)) {
+ .......
+ return result;
+ }
+
+// Service#srvIPs()
+public List srvIPs(List clusters) {
+ if (CollectionUtils.isEmpty(clusters)) {
+ clusters = new ArrayList<>();
+ clusters.addAll(clusterMap.keySet());
+ }
+ return allIPs(clusters);
+}
+
+// Service#allIPs()
+public List allIPs(List clusters) {
+ List result = new ArrayList<>();
+ for (String cluster : clusters) {
+ // ����ע���ʱ�Ὣʵ����Ϣд��clusterMap�У����ڴ�����ȡ
+ Cluster clusterObj = clusterMap.get(cluster);
+ if (clusterObj == null) {
+ continue;
+ }
+
+ result.addAll(clusterObj.allIPs());
+ }
+ return result;
+}
+
+// Cluster#allIPs()
+public List allIPs() {
+ List allInstances = new ArrayList<>();
+ // ��ȡ���������еij־û�ʵ��
+ allInstances.addAll(persistentInstances);
+ // ��ȡ���������е���ʱʵ��
+ allInstances.addAll(ephemeralInstances);
+ return allInstances;
+}
+```
+
+#### 2������UDP��ʽ������ʵ������
+
+NamingSubscriberServiceV1Impl#addClient()��
+
+```
+public void addClient(String namespaceId, String serviceName, String clusters, String agent,
+ InetSocketAddress socketAddr, DataSource dataSource, String tenant, String app) {
+
+ // ��ʼ�����Ϳͻ���ʵ��PushClient
+ PushClient client = new PushClient(namespaceId, serviceName, clusters, agent, socketAddr, dataSource, tenant,
+ app);
+ // ��������Ŀ��ͻ���
+ addClient(client);
+}
+
+// ���ط���addClient()
+public void addClient(PushClient client) {
+ // client is stored by key 'serviceName' because notify event is driven by serviceName change
+ // �ͻ����ɼ��� serviceName���洢����Ϊ֪ͨ�¼���serviceName��������
+ String serviceKey = UtilsAndCommons.assembleFullServiceName(client.getNamespaceId(), client.getServiceName());
+ ConcurrentMap clients = clientMap.get(serviceKey);
+ // �����ȡ�����ͻ�������õ�ServiceName��Ӧ�����Ϳͻ��ˣ����½����Ϳͻ��ˣ�������
+ if (clients == null) {
+ clientMap.putIfAbsent(serviceKey, new ConcurrentHashMap<>(1024));
+ clients = clientMap.get(serviceKey);
+ }
+
+ PushClient oldClient = clients.get(client.toString());
+ // �����ϵ�PushClient����ˢ��
+ if (oldClient != null) {
+ oldClient.refresh();
+ } else {
+ // ����PushClient
+ PushClient res = clients.putIfAbsent(client.toString(), client);
+ if (res != null) {
+ Loggers.PUSH.warn("client: {} already associated with key {}", res.getAddrStr(), res);
+ }
+ Loggers.PUSH.debug("client: {} added for serviceName: {}", client.getAddrStr(), client.getServiceName());
+ }
+}
+```
+
+# �塢�ܽ�
+
+�ͻ��ˣ�
+
+> 1�����ȴӱ��ػ����л�ȡ����ʵ����Ϣ��
+> 2��ά����ʱ����ʱ��Nacos����˻�ȡ����ʵ����Ϣ��
+
+����ˣ�
+
+> 1������ָ�������ռ����ڴ�ע��������е�����ʵ������ʱʵ�����ͻ��ˣ�
+> 2������һ��UDP����ʵ����Ϣ������ͷ���
+
+
+# �����
+https://developer.aliyun.com/article/1058262
+https://ost.51cto.com/posts/14835
+https://developer.aliyun.com/article/1048465
+https://zhuanlan.zhihu.com/p/70478036
+https://juejin.cn/post/6999814668390760484#heading-8
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudAlibabaNacos\346\272\220\347\240\201\345\210\206\346\236\220\357\274\232\346\234\215\345\212\241\346\263\250\345\206\214.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudAlibabaNacos\346\272\220\347\240\201\345\210\206\346\236\220\357\274\232\346\234\215\345\212\241\346\263\250\345\206\214.md"
new file mode 100644
index 0000000..1a59865
--- /dev/null
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudAlibabaNacos\346\272\220\347\240\201\345\210\206\346\236\220\357\274\232\346\234\215\345\212\241\346\263\250\345\206\214.md"
@@ -0,0 +1,357 @@
+# һ�� Nacos����ע��Դ�����
+
+
+
+* * *
+
+
+
+## 1.1 Դ�뷽ʽ���
+
+
+
+* * *
+
+
+
+�ͻ���Դ�������Ӵ����ʽ����Դ��������
+
+
+
+
+
+
+
+``` org.apache.maven.plugins maven-source-plugin 3.2.1 true compile jar ```
+
+
+
+
+
+
+
+Ȼ������
+
+
+
+
+
+
+
+```mvn install -DskipTests ```
+
+
+
+
+
+
+
+## 1.2 ���
+
+
+
+* * *
+
+
+
+[github.com/alibaba/nac��](https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Falibaba%2Fnacos%2Ftree%2F1.4.1)
+
+�������ǻ��Դ���������������ǻ�ͨ��Դ��ķ�ʽ���������� �����ͨ��debug�ķ�ʽ�����������ж��������й��̡�
+
+���Ǵ�Դ��ĽǶ�������һ�£����������������ϱ���ע�����ģ�
+
+NacosNamingService ���Ƿ���ע��ͷ�����ص��࣬�����������ォ��ǰ�����ķ������ע��ʵ���ķ��������ǿ�һ�����������ʲô�ˣ�
+
+
+
+
+
+������ƴ����һЩ��������http���������ע�����Ľ��з��֣�����ľ������·����
+
+
+
+������Ƕ�Ӧ��·�������ǻص��ٷ��ĵ���ָ�ϵ���
+
+[nacos.io/zh-cn/docs/��](https://link.juejin.cn?target=https%3A%2F%2Fnacos.io%2Fzh-cn%2Fdocs%2Fopen-api.html)
+
+
+
+�ã��������ǽ�������Ͳ����������濴�ˣ����ǿ��Ե��ȥ��һ�£�
+
+
+
+�������ĵ��ø����������
+
+
+
+
+
+
+
+
+
+����������
+
+
+
+������ͬѧ������ô֪���ϵ�ʹﵽ��������ǿ�һ�������鿴Դ���������·�������ǿ�һ�����Ƕ��������·��������Ҫ����nacos�ķ����ֹ��ܣ�����Ҫ�������ǵ�discovery�İ�������һ��starter��ǰ������ѧ��springboot����֪���κ�starter����һ���и�spring.factories����Ϊһ�����
+
+
+
+�����涯̬���ص���ܶ࣬NacosServiceRegistryAutoConfiguration �������������ܷ�������һ��nacos����ע����Զ������࣬
+
+
+
+������ʵ���������࣬���ǿ�һ�������NacosAUtoServiceRegistration
+
+
+
+�Զ�ע���࣬���ǿ��Կ�һ�����ļ��ɹ�ϵ����һ��ApplicationListener spring������ɺᷢ��һ����Ϣ��applicaitonListener����ͨ�����������ϢȻ�����ִ�еġ���������֪����һ������Ӧ����ô����
+
+
+
+���Բ鿴���ij����ࡣ
+
+
+
+�鿴onApplicationEvent�����������ڷ�������ͻᷢ������һ����Ϣ���յ������Ϣ�ͻ�������bind����
+
+
+
+�����и�if return ���Ǿ�ֱ����������һ���Ƿ�֧���룬�������ķ�֧�������ǾͲ�Ҫ������һ ��Ҫ�����ߣ���������ֱ�ӿ������start�����������������û�ж�Ӧ�Ĵ��������ǿ��Խ��������֧������ �ã�������start, begin��init��register�������Ǻ���Ҫ�ķ���������һ��Ҫ��ȥ��
+
+
+
+��һ��if�Ͳ��ÿ����ڶ���if��Ҫ������Ϊ�����û�������㿴���register()��Ӧ�þ��������������Ϊ����Dz鿴ע������̡�
+
+
+
+
+
+
+
+
+
+������Ҫ��֪��SpringBoot�Զ�װ��Ļ���֪ʶ�����Ҫ֪��Spring�������ֵ� ����֪ʶ��
+
+## 1.3 ����ע��
+
+
+
+* * *
+
+
+
+Nacos�߲���֧���첽�������ڴ��������
+
+�ղ����ڷ����ṩ�����潲�����ݣ��������Ƿ���ע����������һ��
+
+�������instanceʵ���������һ��springmvc��controller���������ǿ���ȫ������ Controller��������instanceʵ���ɣ�������������InstanceController
+
+
+
+��֮ǰ�����õ���post�����������Dz鿴post������������delete,update...,��������ʲô��� restFul
+
+���Ƿ�������û�ж�Ӧ��DefaultGroup���ڷ���ע��ͷ��ֵ���������group�Dz������õġ����õĻ�ֻ���Լ��Ĺ淶�ͷ�������ġ��ڷ���ע��ͷ�����Դ���ж�û���á��������ռ䣬��������Ȼ�����Dz���ת��Ϊʵ����������Ƿ���ģ���е�����ģ�͡�
+
+
+
+�����ǿ�һ������ע��ʵ����������ʲô�� ����������ע��������ע��instance�����Ǿ�Χ�����������з������Dz��Ǿ�����addInstance��
+
+
+
+createEmptyService
+
+
+
+1����ȡservice ���λ�ȡһ��Ϊ�գ����ǿ��Խ�ȥ����һ��
+
+
+
+
+
+�������ע���������ǰ��˵��nacos��������ģ�͡����Բο�ͼ�������map���Ƕ�Ӧ��ע���
+
+
+
+���������÷���ͳ�ʼ��
+
+
+
+
+
+�����ʼ��������
+
+
+
+�������Ǹ�scheduleNamingHealth��һ����ʱ��������ֻ��Ҫ��һ��task����Ϳ���
+
+
+
+task����������Ҫ��һ��run������
+
+���������ǿ��ǻ�ȡ���е�ʵ�������Ե��ȥ��һ�¡�
+
+��ǰʱ�� - �ϴ�����ʱ�� �������15�� ��ʵ������Ϊ�ǽ����� ������30��û���յ�������ֱ����
+
+
+
+
+
+�ã����ǻ�����������������ر�ã�createEmtyService���Ǵ���һ���շ��������ǵ�ʵ�����Dz��ǻ���ע�ᵽ���棬
+
+
+
+> ���ǿ��Կ�һ�·���ģ�ͣ���������ǰ˵����һ��
+>
+> �����ռ� ��cluster ��Ⱥ����
+>
+> 
+>
+> 
+>
+> ��Ⱥ�ж�Ӧ��ʵ����
+>
+> 
+
+���ǿ�һ��addinstance
+
+
+
+������Ӧ��key:
+
+
+
+
+
+
+
+```String key = KeyBuilder.buildInstanceListKey(namespaceId, serviceName, ephemeral); ```
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```//��ȡע��ʵ����IP�˿��б� List instanceList = addIpAddresses(service, ephemeral, ips); ```
+
+
+
+
+
+
+
+���ǽ���Ŀ�һ�£����Ƿ������add,remove����������������Ƴ�ʵ��
+
+
+
+������Ҫ������дע�������ips�������Ǿ͵��ips����������ʾ������Ȼ���������ѭ��instance���������ǿ��Կ�����������Ƴ��ʹ�map�����Ƴ���ȥ���������������instanceMap������һ�£�����ڷ��ء�
+
+
+
+
+
+
+
+
+
+���࣬���ǿ��Բ²�һ�£�����debug��ȥ����Ȼ����࣬���ǵ��һ�£��������ĵط�
+
+
+
+��ָ�������ƣ�
+
+
+
+�ã�����ȫ��������һ�£�
+
+
+
+
+
+����֪��ǰ��˵��ephemeral��true����ѡ���һ���� �����ʣ�
+
+
+
+����Ӧ�õ���EphemeralConsistencyService��Ӧ��put����������EphemeralConsistencyServiceֻ��һ���ӿڣ�����Ӧ�õ��ö�Ӧ��ʵ��ʵ����
+
+
+
+
+
+���ǿ�һ������onput������
+
+���ڷŵ������У�
+
+
+
+��������ǰѺ��ĵ�����ŵ�blockquene���棬Ҳ����һ������������
+
+
+
+
+
+����ע��Ĺ��̾���ô��һ��������������ս�����ע������ŵ����ǵ��������е��У��ŵ���ɫ����֮�������������оͷ����ˡ��Ƿŵ���������֮�������з�������������С�
+
+���ע�����Notifier��һ���̣߳���ʦ�����һ�����ɣ��������һ���߳̾���Ҫ������run������Ϊrun���������� ����ִ�д���ĵط���
+
+
+
+�����������ѭ���������ݴ��������ϵĴ����ͻ���ע�����Ϣ����������ʵ�ֺ�����첽ע����Ϣ��
+
+����̻߳�һֱ��ת��һֱ���У������������˵����������ҵ��ˣ��ã��㿴��������쳣Ҳ�Ե��ˣ�����һֱ�����У����û�����������������������ó�cpu
+
+
+
+ע����ṹ�ķ�����
+
+
+
+���ȵ����Ǹ�change��ʱ�����Ǿͽ���onChange�����Ǹ������������ǽ�������service����ȥ����
+
+
+
+������Ͳ��ÿ��ˣ��ȿ�Ȩ�أ�Ȩ�ش��ڶ��ٵ�ʱ���������ֵ��Ȩ��С�ڶ��ٵ�ʱ������һ����Сֵ��Ȼ����Ǻ��ĵķ���updateIP
+
+
+
+�����updateIPs����ʲô�أ� ���ľ����ұ���������Ҫע���ʵ����Ȼ��ͷŵ����ǵ�clusterMap����
+
+
+
+
+
+�ǵ������ҿ��ܾ��������ˣ���ʲôʱ����������̣߳���ʵʱ����������Ϣ�����������أ� �̴�������һ������������������ڿ��Ÿ����Notifier����Ϊ����������һ���̣߳����ᶪ��һ���̳߳��н������У����ǿ�һ����������������ʵ�����ģ�
+
+
+
+���ǿ���������������ע����ǵ����spring��һ������г�ʼ��֮����е��õģ������ǿ�һ�����init��������������ʲô
+
+
+
+
+
+��һ��Scheduled�̳߳أ�
+
+
+
+Ҳ�����ڶ����ʼ����ʱ��ͽ�������һ���̳߳أ�ȥ����notifier��Ӧ�ķ��������run������������run�ġ�������ͻ�ʵʱ�����첽���С�����д�ĺô������ǽ�д�ʹ�����ȫ�����ˡ�ͨ�����������ܵ��ڴ���У�������������飬�������ĺô���1���������
+
+
+
+# �����
+https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF
+https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA
+https://juejin.cn/post/6931922457741770760
+https://github.com/D2C-Cai/herring
+http://c.biancheng.net/springcloud
+https://github.com/macrozheng/springcloud-learning
\ No newline at end of file
diff --git "a/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudAlibabaNacos\346\272\220\347\240\201\345\210\206\346\236\220\357\274\232\346\246\202\350\247\210.md" "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudAlibabaNacos\346\272\220\347\240\201\345\210\206\346\236\220\357\274\232\346\246\202\350\247\210.md"
new file mode 100644
index 0000000..dc517a0
--- /dev/null
+++ "b/docs/Spring\345\205\250\345\256\266\346\241\266/SpringCloudAlibaba\346\272\220\347\240\201\345\210\206\346\236\220/SpringCloudAlibabaNacos\346\272\220\347\240\201\345\210\206\346\236\220\357\274\232\346\246\202\350\247\210.md"
@@ -0,0 +1,501 @@
+�ڿ���ƪ����֮ǰ����ö�NACOS��ع��������˽⣬�Ƽ�����[Spring Cloud Alibaba Nacos������ƪ��](https://zhuanlan.zhihu.com/p/68700978)��
+
+��Թ��ܣ���Ŀ�ĵ�ȥ�����Ӧ��Դ���룬��һ���˽������α�ʵ�ֳ����ġ�
+
+���������һ��Դ�����Ķ��������Ⱥ����������̫���ϸ�ڣ�����Ҫ���ߴ�Դ����٣�������ᡣ
+
+## һ������
+
+����GitHub��Ӧ��[ҳ��](https://link.zhihu.com/?target=https%3A//github.com/alibaba/nacos)����NACOS����clone������Ŀ¼���ļ����������߳������Ƕ��ڿ�Դ���������а����IJ��ֲ����ࡣ
+
+
+
+
+
+
+nacos����Ŀ¼�ṹ
+
+
+
+
+
+
+
+
+ģ������ͼ
+
+
+
+
+
+
+
+
+nacos�����
+
+
+
+����������ͼ������˳���ҵ�ͻ�ƿ��ˣ��������ݾͼ�����nacos-console��nacos-naming��nacos-config��˳�����ϣ����ܿ������������ˡ�
+
+������Ǹо������ֵĻ����Ǿ��Ʋ�nacos-example����������Ҫҵ��ĵ�����ڣ�һ����֪��
+
+## �������÷���
+
+���ȴ�һ��������˵��com.alibaba.nacos.api.NacosFactory��
+
+����ľ�̬�������ڴ���ConfigService��NamingService���������ƣ��Դ���ConfigServiceΪ����
+
+
+
+```
+public static ConfigService createConfigService(Properties properties) throws NacosException {
+ try {
+ Class> driverImplClass = Class.forName("com.alibaba.nacos.client.config.NacosConfigService");
+ Constructor constructor = driverImplClass.getConstructor(Properties.class);
+ ConfigService vendorImpl = (ConfigService) constructor.newInstance(properties);
+ return vendorImpl;
+ } catch (Throwable e) {
+ throw new NacosException(-400, e.getMessage());
+ }
+}
+```
+
+
+
+û��ʲô���ӵ�����ʹ�õ��ǻ����ķ���ԭ�����������������properties����Щ���Կ���ͨ��bootstrap.yml��ָ������Ӧ����NacosConfigProperties��
+
+��Ҫϸ�����ǹ��캯���ж���namespace��ʼ�����Dz������ݡ�
+
+
+
+```
+private void initNamespace(Properties properties) {
+ String namespaceTmp = null;
+
+ String isUseCloudNamespaceParsing =
+ properties.getProperty(PropertyKeyConst.IS_USE_CLOUD_NAMESPACE_PARSING,
+ System.getProperty(SystemPropertyKeyConst.IS_USE_CLOUD_NAMESPACE_PARSING,
+ String.valueOf(Constants.DEFAULT_USE_CLOUD_NAMESPACE_PARSING)));
+
+ if (Boolean.valueOf(isUseCloudNamespaceParsing)) {
+ namespaceTmp = TemplateUtils.stringBlankAndThenExecute(namespaceTmp, new Callable() {
+ @Override
+ public String call() {
+ return TenantUtil.getUserTenantForAcm();
+ }
+ });
+
+ namespaceTmp = TemplateUtils.stringBlankAndThenExecute(namespaceTmp, new Callable() {
+ @Override
+ public String call() {
+ String namespace = System.getenv(PropertyKeyConst.SystemEnv.ALIBABA_ALIWARE_NAMESPACE);
+ return StringUtils.isNotBlank(namespace) ? namespace : EMPTY;
+ }
+ });
+ }
+
+ if (StringUtils.isBlank(namespaceTmp)) {
+ namespaceTmp = properties.getProperty(PropertyKeyConst.NAMESPACE);
+ }
+ namespace = StringUtils.isNotBlank(namespaceTmp) ? namespaceTmp.trim() : EMPTY;
+ properties.put(PropertyKeyConst.NAMESPACE, namespace);
+}
+```
+
+
+
+�����properties��ָ���Ƿ�����ƻ����е�namespace����������ǵģ�����ȥ��ȡ�����ƻ�����ϵͳ������������ǣ���ô�Ͷ�ȡproperties��ָ����namespace��û��ָ���Ļ������ս����������ǿ��ַ������Ӵ����Ͽ���������ȡ�ƻ�����namespace�������첽������ʽ������Ŀǰ�汾����ʹ�õ�ͬ�����á�
+
+��������ConfigService�����涨����һϵ�нӿڷ���������������Ҫ���ġ�
+
+ÿ��ҵ��ʵ�����ն����ΪHttp���������õ�serverAddr�������ַ��������תʹ�ã���Ȼ����һ����ʱʱ���������������ɹ��ˣ��Ǿͻ��׳��쳣��
+
+������nacos-client�����շ����ն����䵽nacos-config�����ϣ����ʹ��JdbcTemplate�������ݳ־û���
+
+��һ���ֵĴ���һ�������ף��������ã���ȡ���ú�ɾ�����ö��������֣��Ͳ�չ�������ˡ�
+
+�ص����һ�����ü������ֵ�Դ���롣
+
+�Ƚ�ע��������com.alibaba.nacos.client.config.impl.CacheData������ݽṹ�ϣ��Ǹ����͵ij�Ѫģ�ͣ���Ҫ�dz䵱listener�����ߵĽ�ɫ����������������ȡ�ò�������ô�Ѻ��ˡ�
+
+ʵ���ϣ����Կ���CacheData��������Ϣ��namespace, content����listener�ۺ���һ���ˣ�������Ϊһ�����ÿ��Ը��Ӷ���listenerʵʩ��������Ϊlistener�ӿڿ����ж���ʵ�֣���ÿ��listenerֻ����һ��ʵ�������������ϡ�
+
+
+
+```
+public void addListener(Listener listener) {
+ if (null == listener) {
+ throw new IllegalArgumentException("listener is null");
+ }
+ ManagerListenerWrap wrap = new ManagerListenerWrap(listener);
+ if (listeners.addIfAbsent(wrap)) {
+ LOGGER.info("[{}] [add-listener] ok, tenant={}, dataId={}, group={}, cnt={}", name, tenant, dataId, group,
+ listeners.size());
+ }
+}
+```
+
+
+
+ʹ����CopyOnWriteArrayList.addIfAbsent�����������������Ҫ����equals������ManagerListenerWrap�Ƕ�listener������һ����ʽ�İ�������ʵ����equals������
+
+
+
+```
+@Override
+public boolean equals(Object obj) {
+ if (null == obj || obj.getClass() != getClass()) {
+ return false;
+ }
+ if (obj == this) {
+ return true;
+ }
+ ManagerListenerWrap other = (ManagerListenerWrap) obj;
+ return listener.equals(other.listener);
+}
+```
+
+
+
+�����ϲ㷭�������ҵ�����listener���߲�Ĺ���API��com.alibaba.nacos.client.config.impl.ClientWorker��
+
+ͬ���Ƕ�listener�Ĺ����������������ظ�У�飬����cacheMap�ǹؼ������¶��壺
+
+
+
+```
+private final AtomicReference