From a1a79a39fd32f407b7d1b2cb37c7c5f027573163 Mon Sep 17 00:00:00 2001 From: Guide Date: Sat, 22 Apr 2023 10:34:42 +0800 Subject: [PATCH] =?UTF-8?q?[docs=20fix]Heap=20=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?=E7=9A=84=E6=97=B6=E9=97=B4=E5=A4=8D=E6=9D=82=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + docs/.vuepress/sidebar.ts | 1 + docs/cs-basics/data-structure/heap.md | 4 +- docs/database/redis/redis-cluster.md | 2 +- .../redis-common-blocking-problems-summary.md | 2 +- .../redis/redis-memory-fragmentation.md | 2 +- docs/distributed-system/api-gateway.md | 2 +- docs/distributed-system/distributed-id.md | 2 +- docs/high-performance/load-balancing.md | 242 +++++++++++++++--- docs/home.md | 3 +- .../key-points-of-interview.md | 37 +++ .../project-experience-guide.md | 4 + .../why-there-only-value-passing-in-java.md | 2 +- docs/java/collection/arraylist-source-code.md | 2 +- .../concurrent-hash-map-source-code.md | 2 +- docs/java/collection/hashmap-source-code.md | 2 +- .../java-collection-precautions-for-use.md | 2 +- docs/java/concurrent/aqs.md | 2 +- docs/java/concurrent/atomic-classes.md | 2 +- .../concurrent/completablefuture-intro.md | 2 +- .../java-concurrent-questions-01.md | 2 +- .../java-concurrent-questions-02.md | 2 +- .../java-concurrent-questions-03.md | 2 +- .../concurrent/java-thread-pool-summary.md | 2 +- docs/java/io/io-basis.md | 2 +- docs/java/io/io-design-patterns.md | 2 +- docs/java/io/io-model.md | 2 +- docs/java/jvm/classloader.md | 2 +- docs/java/jvm/jvm-intro.md | 2 +- docs/java/jvm/jvm-parameters-intro.md | 2 +- docs/java/jvm/memory-area.md | 2 +- .../spring-knowledge-and-questions-summary.md | 2 +- .../framework/spring/spring-transaction.md | 2 +- ...ingboot-knowledge-and-questions-summary.md | 2 +- .../jwt-authentication process.drawio | 1 - ...ssion-cookie-authentication-process.drawio | 1 - .../sso.drawio | 1 - ...ity-system-design-access-flow-chart.drawio | 1 - .../design-of-authority-system/rbac.drawio | 1 - .../sentive-words-filter/brower-trie.png | Bin 10501 -> 0 bytes .../common-collections-trie.png | Bin 11741 -> 0 bytes .../sentive-words-filter/hutool-dfa.png | Bin 7471 -> 0 bytes .../images/sentive-words-filter/trie.drawio | 1 - .../images/sentive-words-filter/trie.png | Bin 50950 -> 0 bytes .../security/sentive-words-filter.md | 6 +- docs/tools/docker/docker-in-action.md | 2 +- docs/tools/docker/docker-intro.md | 2 +- docs/tools/git/git-intro.md | 2 +- docs/tools/git/github-tips.md | 2 +- docs/tools/gradle/gradle-core-concepts.md | 2 +- docs/tools/maven/maven-core-concepts.md | 2 +- 51 files changed, 293 insertions(+), 77 deletions(-) create mode 100644 docs/interview-preparation/key-points-of-interview.md delete mode 100644 docs/system-design/security/images/basis-of-authority-certification/jwt-authentication process.drawio delete mode 100644 docs/system-design/security/images/basis-of-authority-certification/session-cookie-authentication-process.drawio delete mode 100644 docs/system-design/security/images/basis-of-authority-certification/sso.drawio delete mode 100644 docs/system-design/security/images/design-of-authority-system/new-authority-system-design-access-flow-chart.drawio delete mode 100644 docs/system-design/security/images/design-of-authority-system/rbac.drawio delete mode 100644 docs/system-design/security/images/sentive-words-filter/brower-trie.png delete mode 100644 docs/system-design/security/images/sentive-words-filter/common-collections-trie.png delete mode 100644 docs/system-design/security/images/sentive-words-filter/hutool-dfa.png delete mode 100644 docs/system-design/security/images/sentive-words-filter/trie.drawio delete mode 100644 docs/system-design/security/images/sentive-words-filter/trie.png diff --git a/README.md b/README.md index 2df66d2e..a8c86512 100755 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@
+ ## 项目相关 * [项目介绍](./docs/javaguide/intro.md) diff --git a/docs/.vuepress/sidebar.ts b/docs/.vuepress/sidebar.ts index 872610db..8dfc946b 100644 --- a/docs/.vuepress/sidebar.ts +++ b/docs/.vuepress/sidebar.ts @@ -25,6 +25,7 @@ export const sidebarConfig = sidebar({ prefix: "interview-preparation/", children: [ "teach-you-how-to-prepare-for-the-interview-hand-in-hand", + "key-points-of-interview", "project-experience-guide", "interview-experience", "self-test-of-common-interview-questions", diff --git a/docs/cs-basics/data-structure/heap.md b/docs/cs-basics/data-structure/heap.md index 8ce67e60..1a70629e 100644 --- a/docs/cs-basics/data-structure/heap.md +++ b/docs/cs-basics/data-structure/heap.md @@ -32,7 +32,9 @@ tag: 有小伙伴可能会想到用有序数组,初始化一个有序数组时间复杂度是 `O(nlog(n))`,查找最大值或者最小值时间复杂度都是 `O(1)`,但是,涉及到更新(插入或删除)数据时,时间复杂度为 `O(n)`,即使是使用复杂度为 `O(log(n))` 的二分法找到要插入或者删除的数据,在移动数据时也需要 `O(n)` 的时间复杂度。 -**相对于有序数组而言,堆的主要优势在于更新数据效率较高。** 堆的初始化时间复杂度为 `O(nlog(n))`,堆可以做到`O(1)`时间复杂度取出最大值或者最小值,`O(log(n))`时间复杂度插入或者删除数据,具体操作在后续章节详细介绍。 +**相对于有序数组而言,堆的主要优势在于插入和删除数据效率较高。** 因为堆是基于完全二叉树实现的,所以在插入和删除数据时,只需要在二叉树中上下移动节点,时间复杂度为 `O(log(n))`,相比有序数组的 `O(n)`,效率更高。而最大值或最小值的获取,则是堆的另一个优势,时间复杂度为 `O(1)`,相比有序数组的 `O(log(n))`,更快速。 + +不过,需要注意的是:Heap 初始化的时间复杂度为 `O(n)`,而非`O(nlogn)`。 ## 堆的分类 diff --git a/docs/database/redis/redis-cluster.md b/docs/database/redis/redis-cluster.md index 3b140eb4..73224676 100644 --- a/docs/database/redis/redis-cluster.md +++ b/docs/database/redis/redis-cluster.md @@ -1,5 +1,5 @@ --- -title: Redis 集群详解(付费) +title: Redis集群详解(付费) category: 数据库 tag: - Redis diff --git a/docs/database/redis/redis-common-blocking-problems-summary.md b/docs/database/redis/redis-common-blocking-problems-summary.md index 646c4ed4..a601bdf7 100644 --- a/docs/database/redis/redis-common-blocking-problems-summary.md +++ b/docs/database/redis/redis-common-blocking-problems-summary.md @@ -1,5 +1,5 @@ --- -title: Redis 常见阻塞原因总结 +title: Redis常见阻塞原因总结 category: 数据库 tag: - Redis diff --git a/docs/database/redis/redis-memory-fragmentation.md b/docs/database/redis/redis-memory-fragmentation.md index b6e755a6..7de708a7 100644 --- a/docs/database/redis/redis-memory-fragmentation.md +++ b/docs/database/redis/redis-memory-fragmentation.md @@ -1,5 +1,5 @@ --- -title: Redis 内存碎片详解 +title: Redis内存碎片详解 category: 数据库 tag: - Redis diff --git a/docs/distributed-system/api-gateway.md b/docs/distributed-system/api-gateway.md index 5daa6d47..29a3546d 100644 --- a/docs/distributed-system/api-gateway.md +++ b/docs/distributed-system/api-gateway.md @@ -1,5 +1,5 @@ --- -title: API 网关详解 +title: API网关详解 category: 分布式 icon: "gateway" --- diff --git a/docs/distributed-system/distributed-id.md b/docs/distributed-system/distributed-id.md index f9387a7f..17ff01b8 100644 --- a/docs/distributed-system/distributed-id.md +++ b/docs/distributed-system/distributed-id.md @@ -1,5 +1,5 @@ --- -title: 分布式 ID 详解 +title: 分布式ID详解 category: 分布式 icon: "id" --- diff --git a/docs/high-performance/load-balancing.md b/docs/high-performance/load-balancing.md index eee37922..7f3017d3 100644 --- a/docs/high-performance/load-balancing.md +++ b/docs/high-performance/load-balancing.md @@ -1,5 +1,5 @@ --- -title: 负载均衡详解(付费) +title: 负载均衡详解 category: 高性能 icon: "fuzaijunheng" head: @@ -11,48 +11,226 @@ head: content: 负载均衡指的是将用户请求分摊到不同的服务器上处理,以提高系统整体的并发处理能力。负载均衡可以简单分为服务端负载均衡和客户端负载均衡 这两种。服务端负载均衡涉及到的知识点更多,工作中遇到的也比较多,因为,我会花更多时间来介绍。 --- -**负载均衡** 相关的面试题为我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)(点击链接即可查看详细介绍以及加入方法)专属内容,已经整理到了[《Java 面试指北》](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html)中。 +## 什么是负载均衡? -[《Java 面试指北》](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html)(点击链接即可查看详细介绍)的部分内容展示如下,你可以将其看作是 [JavaGuide](https://javaguide.cn) 的补充完善,两者可以配合使用。 +**负载均衡** 指的是将用户请求分摊到不同的服务器上处理,以提高系统整体的并发处理能力以及可靠性。负载均衡服务可以有由专门的软件或者硬件来完成,一般情况下,硬件的性能更好,软件的价格更便宜(后文会详细介绍到)。 -![](https://oss.javaguide.cn/xingqiu/image-20220304102536445.png) +下图是[《Java 面试指北》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247519384&idx=1&sn=bc7e71af75350b755f04ca4178395b1a&chksm=cea1c353f9d64a458f797696d4144b4d6e58639371a4612b8e4d106d83a66d2289e7b2cd7431&token=660789642&lang=zh_CN&scene=21#wechat_redirect) 「高并发篇」中的一篇文章的配图,从图中可以看出,系统的商品服务部署了多份在不同的服务器上,为了实现访问商品服务请求的分流,我们用到了负载均衡。 -最近几年,市面上有越来越多的“技术大佬”开始办培训班/训练营,动辄成千上万的学费,却并没有什么干货,单纯的就是割韭菜。 +![多服务实例-负载均衡](https://oss.javaguide.cn/github/javaguide/high-performance/load-balancing/multi-service-load-balancing.drawio.png) -为了帮助更多同学准备 Java 面试以及学习 Java ,我创建了一个纯粹的知识星球。虽然收费只有培训班/训练营的百分之一,但是知识星球里的内容质量更高,提供的服务也更全面。 +负载均衡是一种比较常用且实施起来较为简单的提高系统并发能力和可靠性的手段,不论是单体架构的系统还是微服务架构的系统几乎都会用到。 -欢迎准备 Java 面试以及学习 Java 的同学加入我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html),干货非常多,学习氛围也很不错!收费虽然是白菜价,但星球里的内容或许比你参加上万的培训班质量还要高。 +## 负载均衡分为哪几种? -
- - - -
+负载均衡可以简单分为 **服务端负载均衡** 和 **客户端负载均衡** 这两种。 -下面是星球提供的部分服务(点击下方图片即可获取知识星球的详细介绍): +服务端负载均衡涉及到的知识点更多,工作中遇到的也比较多,因为,我会花更多时间来介绍。 -
- - - -
+### 服务端负载均衡 -**我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!** +**服务端负载均衡** 主要应用在 **系统外部请求** 和 **网关层** 之间,可以使用 **软件** 或者 **硬件** 实现。 -如果你感兴趣的话,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)。 +下图是我画的一个简单的基于 Nginx 的服务端负载均衡示意图: -这里再送一个 30 元的新人优惠券(续费半价)。 +![基于 Nginx 的服务端负载均衡](https://oss.javaguide.cn/github/javaguide/high-performance/load-balancing/server-load-balancing.png) -
- - - -
+**硬件负载均衡** 通过专门的硬件设备(比如 **F5、A10、Array** )实现负载均衡功能。 -进入星球之后,记得添加微信,我会发你详细的星球使用指南。 +硬件负载均衡的优势是性能很强且稳定,缺点就是实在是太贵了。像基础款的 F5 最低也要 20 多万,绝大部分公司是根本负担不起的,业务量不大的话,真没必要非要去弄个硬件来做负载均衡,用软件负载均衡就足够了! -
- - - -
\ No newline at end of file +在我们日常开发中,一般很难接触到硬件负载均衡,接触的比较多的还是 **软件负载均衡** 。软件负载均衡通过软件(比如 **LVS、Nginx、HAproxy** )实现负载均衡功能,性能虽然差一些,但价格便宜啊!像基础款的 Linux 服务器也就几千,性能好一点的 2~3 万的就很不错了。 + +根据 OSI 模型,服务端负载均衡还可以分为: + +- 二层负载均衡 +- 三层负载均衡 +- 四层负载均衡 +- 七层负载均衡 + +最常见的是四层和七层负载均衡,因此,本文也是重点介绍这两种负载均衡。 + +> Nginx 官网对四层负载和七层负载均衡均衡做了详细介绍,感兴趣的可以看看。 +> +> - [What Is Layer 4 Load Balancing?](https://www.nginx.com/resources/glossary/layer-4-load-balancing/) +> - [What Is Layer 7 Load Balancing?](https://www.nginx.com/resources/glossary/layer-7-load-balancing/) + +![OSI 七层模型](https://oss.javaguide.cn/github/javaguide/cs-basics/network/osi-7-model.png) + +- **四层负载均衡** 工作在 OSI 模型第四层,也就是传输层,这一层的主要协议是 TCP/UDP,负载均衡器在这一层能够看到数据包里的源端口地址以及目的端口地址,会基于这些信息通过一定的负载均衡算法将数据包转发到后端真实服务器。也就是说,四层负载均衡的核心就是 IP+端口层面的负载均衡,不涉及具体的报文内容。 +- **七层负载均衡** 工作在 OSI 模型第七层,也就是应用层,这一层的主要协议是 HTTP 。这一层的负载均衡比四层负载均衡路由网络请求的方式更加复杂,它会读取报文的数据部分(比如说我们的 HTTP 部分的报文),然后根据读取到的数据内容(如 URL、Cookie)做出负载均衡决策。也就是说,七层负载均衡器的核心是报文内容(如 URL、Cookie)层面的负载均衡,执行第七层负载均衡的设备通常被称为 **反向代理服务器** 。 + +七层负载均衡比四层负载均衡会消耗更多的性能,不过,也相对更加灵活,能够更加智能地路由网络请求,比如说你可以根据请求的内容进行优化如缓存、压缩、加密。 + +简单来说,**四层负载均衡性能更强,七层负载均衡功能更强!** 不过,对于绝大部分业务场景来说,四层负载均衡和七层负载均衡的性能差异基本可以忽略不计的。 + +下面这段话摘自 Nginx 官网的 [What Is Layer 4 Load Balancing?](https://www.nginx.com/resources/glossary/layer-4-load-balancing/) 这篇文章。 + +> Layer 4 load balancing was a popular architectural approach to traffic handling when commodity hardware was not as powerful as it is now, and the interaction between clients and application servers was much less complex. It requires less computation than more sophisticated load balancing methods (such as Layer 7), but CPU and memory are now sufficiently fast and cheap that the performance advantage for Layer 4 load balancing has become negligible or irrelevant in most situations. +> +> 第 4 层负载平衡是一种流行的流量处理体系结构方法,当时商用硬件没有现在这么强大,客户端和应用程序服务器之间的交互也不那么复杂。它比更复杂的负载平衡方法(如第 7 层)需要更少的计算量,但是 CPU 和内存现在足够快和便宜,在大多数情况下,第 4 层负载平衡的性能优势已经变得微不足道或无关紧要。 + +在工作中,我们通常会使用 **Nginx** 来做七层负载均衡,LVS(Linux Virtual Server 虚拟服务器, Linux 内核的 4 层负载均衡)来做四层负载均衡。 + +关于 Nginx 的常见知识点总结,[《Java 面试指北》](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html) 中「技术面试题篇」中已经有对应的内容了,感兴趣的小伙伴可以去看看。 + +![](https://oss.javaguide.cn/github/javaguide/image-20220328105759300.png) + +不过,LVS 这个绝大部分公司真用不上,像阿里、百度、腾讯、eBay 等大厂才会使用到,用的最多的还是 Nginx。 + +### 客户端负载均衡 + +**客户端负载均衡** 主要应用于系统内部的不同的服务之间,可以使用现成的负载均衡组件来实现。 + +在客户端负载均衡中,客户端会自己维护一份服务器的地址列表,发送请求之前,客户端会根据对应的负载均衡算法来选择具体某一台服务器处理请求。 + +客户端负载均衡器和服务运行在同一个进程或者说 Java 程序里,不存在额外的网络开销。不过,客户端负载均衡的实现会受到编程语言的限制,比如说 Spring Cloud Load Balancer 就只能用于 Java 语言。 + +Java 领域主流的微服务框架 Dubbo、Spring Cloud 等都内置了开箱即用的客户端负载均衡实现。Dubbo 属于是默认自带了负载均衡功能,Spring Cloud 是通过组件的形式实现的负载均衡,属于可选项,比较常用的是 Spring Cloud Load Balancer(官方,推荐) 和 Ribbon(Netflix,已被启用)。 + +下图是我画的一个简单的基于 Spring Cloud Load Balancer(Ribbon 也类似) 的客户端负载均衡示意图: + +![](https://oss.javaguide.cn/github/javaguide/high-performance/load-balancing/spring-cloud-lb-gateway.png) + +## 负载均衡常见的算法有哪些? + +### 随机法 + +**随机法** 是最简单粗暴的负载均衡算法。 + +如果没有配置权重的话,所有的服务器被访问到的概率都是相同的。如果配置权重的话,权重越高的服务器被访问的概率就越大。 + +未加权重的随机算法适合于服务器性能相近的集群,其中每个服务器承载相同的负载。加权随机算法适合于服务器性能不等的集群,权重的存在可以使请求分配更加合理化。 + +不过,随机算法有一个比较明显的缺陷:部分机器在一段时间之内无法被随机到,毕竟是概率算法,就算是大家权重一样, 也可能会出现这种情况。 + +于是,**轮询法** 来了! + +### 轮询法 + +轮询法是挨个轮询服务器处理,也可以设置权重。 + +如果没有配置权重的话,每个请求按时间顺序逐一分配到不同的服务器处理。如果配置权重的话,权重越高的服务器被访问的次数就越多。 + +未加权重的轮询算法适合于服务器性能相近的集群,其中每个服务器承载相同的负载。加权轮询算法适合于服务器性能不等的集群,权重的存在可以使请求分配更加合理化。 + +### 一致性 Hash 法 + +相同参数的请求总是发到同一台服务器处理,比如同个 IP 的请求。 + +### 最小连接法 + +当有新的请求出现时,遍历服务器节点列表并选取其中活动连接数最小的一台服务器来响应当前请求。活动连接数可以理解为当前正在处理的请求数。 + +最小连接法可以尽可能最大地使请求分配更加合理化,提高服务器的利用率。不过,这种方法实现起来也最复杂,需要监控每一台服务器处理的请求连接数。 + +## 七层负载均衡可以怎么做? + +简单介绍两种项目中常用的七层负载均衡解决方案:DNS 解析和反向代理。 + +除了我介绍的这两种解决方案之外,HTTP 重定向等手段也可以用来实现负载均衡,不过,相对来说,还是 DNS 解析和反向代理用的更多一些,也更推荐一些。 + +### DNS 解析 + +DNS 解析是比较早期的七层负载均衡实现方式,非常简单。 + +DNS 解析实现负载均衡的原理是这样的:在 DNS 服务器中为同一个主机记录配置多个 IP 地址,这些 IP 地址对应不同的服务器。当用户请求域名的时候,DNS 服务器采用轮询算法返回 IP 地址,这样就实现了轮询版负载均衡。 + +![](https://oss.javaguide.cn/github/javaguide/high-performance/load-balancing/6997605302452f07e8b28d257d349bf0.png) + +现在的 DNS 解析几乎都支持 IP 地址的权重配置,这样的话,在服务器性能不等的集群中请求分配会更加合理化。像我自己目前正在用的阿里云 DNS 就支持权重配置。 + +![](https://oss.javaguide.cn/github/javaguide/aliyun-dns-weight-setting.png) + +### 反向代理 + +客户端将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器,获取数据后再返回给客户端。对外暴露的是反向代理服务器地址,隐藏了真实服务器 IP 地址。反向代理“代理”的是目标服务器,这一个过程对于客户端而言是透明的。 + +Nginx 就是最常用的反向代理服务器,它可以将接收到的客户端请求以一定的规则(负载均衡策略)均匀地分配到这个服务器集群中所有的服务器上。 + +反向代理负载均衡同样属于七层负载均衡。 + +![](https://oss.javaguide.cn/github/javaguide/nginx-load-balance.png) + +## 客户端负载均衡通常是怎么做的? + +我们上面也说了,客户端负载均衡可以使用现成的负载均衡组件来实现。 + +**Netflix Ribbon** 和 **Spring Cloud Load Balancer** 就是目前 Java 生态最流行的两个负载均衡组件。 + +Ribbon 是老牌负载均衡组件,由 Netflix 开发,功能比较全面,支持的负载均衡策略也比较多。 Spring Cloud Load Balancer 是 Spring 官方为了取代 Ribbon 而推出的,功能相对更简单一些,支持的负载均衡也少一些。 + +Ribbon 支持的 7 种负载均衡策略: + +- `RandomRule` :随机策略。 +- `RoundRobinRule`(默认) :轮询策略 +- `WeightedResponseTimeRule` :权重(根据响应时间决定权重)策略 +- `BestAvailableRule` :最小连接数策略 +- `RetryRule`:重试策略(按照轮询策略来获取服务,如果获取的服务实例为 null 或已经失效,则在指定的时间之内不断地进行重试来获取服务,如果超过指定时间依然没获取到服务实例则返回 null) +- `AvailabilityFilteringRule` :可用敏感性策略(先过滤掉非健康的服务实例,然后再选择连接数较小的服务实例) +- `ZoneAvoidanceRule` :区域敏感性策略(根据服务所在区域的性能和服务的可用性来选择服务实例) + +Spring Cloud Load Balancer 支持的 2 种负载均衡策略: + +- `RandomLoadBalancer` :随机策略 +- `RoundRobinLoadBalancer`(默认) :轮询策略 + +```java +public class CustomLoadBalancerConfiguration { + + @Bean + ReactorLoadBalancer randomLoadBalancer(Environment environment, + LoadBalancerClientFactory loadBalancerClientFactory) { + String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); + return new RandomLoadBalancer(loadBalancerClientFactory + .getLazyProvider(name, ServiceInstanceListSupplier.class), + name); + } +} +``` + +不过,Spring Cloud Load Balancer 支持的负载均衡策略其实不止这两种,`ServiceInstanceListSupplier` 的实现类同样可以让其支持类似于 Ribbon 的负载均衡策略。这个应该是后续慢慢完善引入的,不看官方文档还真发现不了,所以说阅读官方文档真的很重要! + +这里举两个官方的例子: + +- `ZonePreferenceServiceInstanceListSupplier` :实现基于区域的负载平衡 +- `HintBasedServiceInstanceListSupplier` :实现基于 hint 提示的负载均衡 + +```java +public class CustomLoadBalancerConfiguration { + // 使用基于区域的负载平衡方法 + @Bean + public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier( + ConfigurableApplicationContext context) { + return ServiceInstanceListSupplier.builder() + .withDiscoveryClient() + .withZonePreference() + .withCaching() + .build(context); + } +} +``` + +关于Spring Cloud Load Balancer更详细更新的介绍,推荐大家看看官方文档:https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#spring-cloud-loadbalancer ,一切以官方文档为主。 + +轮询策略基本可以满足绝大部分项目的需求,我们的实际项目中如果没有特殊需求的话,通常使用的就是默认的轮询策略。并且,Ribbon 和 Spring Cloud Load Balancer 都支持自定义负载均衡策略。 + +个人建议如非必需 Ribbon 某个特有的功能或者负载均衡策略的话,就优先选择 Spring 官方提供的 Spring Cloud Load Balancer。 + +最后再说说为什么我不太推荐使用 Ribbon 。 + +Spring Cloud 2020.0.0 版本移除了 Netflix 除 Eureka 外的所有组件。Spring Cloud Hoxton.M2 是第一个支持 Spring Cloud Load Balancer 来替代 Netfix Ribbon 的版本。 + +我们早期学习微服务,肯定接触过 Netflix 公司开源的 Feign、Ribbon、Zuul、Hystrix、Eureka 等知名的微服务系统构建所必须的组件,直到现在依然有非常非常多的公司在使用这些组件。不夸张地说,Netflix 公司引领了 Java 技术栈下的微服务发展。 + +![](https://oss.javaguide.cn/github/javaguide/SpringCloudNetflix.png) + +**那为什么 Spring Cloud 这么急着移除 Netflix 的组件呢?** 主要是因为在 2018 年的时候,Netflix 宣布其开源的核心组件 Hystrix、Ribbon、Zuul、Eureka 等进入维护状态,不再进行新特性开发,只修 BUG。于是,Spring 官方不得不考虑移除 Netflix 的组件。 + +**Spring Cloud Alibaba** 是一个不错的选择,尤其是对于国内的公司和个人开发者来说。 + +## 参考 + +- 干货 | eBay 的 4 层软件负载均衡实现:https://mp.weixin.qq.com/s/bZMxLTECOK3mjdgiLbHj-g +- HTTP Load Balancing(Nginx 官方文档):https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/ +- 深入浅出负载均衡 - vivo 互联网技术:https://www.cnblogs.com/vivotech/p/14859041.html \ No newline at end of file diff --git a/docs/home.md b/docs/home.md index fbae8ef2..f1deff3d 100644 --- a/docs/home.md +++ b/docs/home.md @@ -26,8 +26,6 @@ title: JavaGuide(Java学习&&面试指南) Gitee

- -

@@ -36,6 +34,7 @@ title: JavaGuide(Java学习&&面试指南)

+ ## 项目相关 * [项目介绍](./javaguide/intro.md) diff --git a/docs/interview-preparation/key-points-of-interview.md b/docs/interview-preparation/key-points-of-interview.md new file mode 100644 index 00000000..bfe6eab4 --- /dev/null +++ b/docs/interview-preparation/key-points-of-interview.md @@ -0,0 +1,37 @@ +--- +title: Java面试重点总结 +category: 面试准备 +--- + +::: tip 友情提示 +本文节选自 **[《Java 面试指北》](../zhuanlan/java-mian-shi-zhi-bei.md)**。这是一份教你如何更高效地准备面试的小册,涵盖常见八股文(系统设计、常见框架、分布式、高并发 ......)、优质面经等内容。 +::: + +## Java 后端面试哪些知识点是重点? + +**准备面试的时候,具体哪些知识点是重点呢?** + +给你几点靠谱的建议: + +1. Java 基础、集合、并发、MySQL、Redis 、Spring、Spring Boot 这些 Java 后端开发必备的知识点。大厂以及中小厂的面试问的比较多的就是这些知识点(不信的话,你可以去多找一些面经看看)。我这里没有提到计算机基础相关的内容,这个会在下面提到。 +2. 你的项目经历涉及到的知识点,有水平的面试官都是会根据你的项目经历来问的。举个例子,你的项目经历使用了 Redis 来做限流,那 Redis 相关的八股文(比如 Redis 常见数据结构)以及限流相关的八股文(比如常见的限流算法)你就应该多花更多心思来搞懂!吃透!你把项目经历上的知识点吃透之后,再把你简历上哪些写熟练掌握的技术给吃透。最后,再去花时间准备其他知识点。 +3. 针对自身找工作的需求,你又可以适当地调整复习的重点。像中小厂一般问计算机基础比较少一些,有些大厂比如字节比较重视计算机基础尤其是算法。这样的话,如果你的目标是中小厂的话,计算机基础就准备面试来说不是那么重要了。如果复习时间不够的话,可以暂时先放放。 +4. 一般校招的面试不会强制要求你会分布式/微服务、高并发的知识(不排除个别岗位有这方面的硬性要求),所以到底要不要掌握还是要看你个人当前的实际情况。如果你会这方面的知识的话,对面试相对来说还是会更有利一些(想要让项目经历有亮点,还是得会一些性能优化的知识。性能优化的知识这也算是高并发知识的一个小分支了)。如果你的技能介绍或者项目经历涉及到分布式/微服务、高并发的知识,那建议你尽量也要抽时间去认真准备一下,面试中很可能会被问到,尤其是项目经历用到的时候。不过,也还是主要准备写在简历上的那些知识点就好。 +5. JVM 相关的知识点,一般是大厂才会问到,面试中小厂就没必要准备了。JVM 面试中比较常问的是 [Java 内存区域](https://javaguide.cn/java/jvm/memory-area.html)、[JVM 垃圾回收](https://javaguide.cn/java/jvm/jvm-garbage-collection.html)、[类加载器和双亲委派模型](https://javaguide.cn/java/jvm/classloader.html) 以及 JVM 调优和问题排查(我之前分享过一些[常见的线上问题案例](https://t.zsxq.com/0bsAac47U),里面就有 JVM 相关的)。 +6. 不同的大厂面试侧重点也会不同。比如说你要去阿里这种公司的话,项目和八股文就是重点,阿里笔试一般会有代码题,进入面试后就很少问代码题了,但是对原理性的问题问的比较深,经常会问一些你对技术的思考。再比如说你要面试字节这种公司,那计算机基础,尤其是算法是重点,字节的面试十分注重代码功底,有时候开始面试就会直接甩给你一道代码题,写出来再谈别的。也会问面试八股文,以及项目,不过,相对来说要少很多。建议你看一下这篇文章 [为了解开互联网大厂秋招内幕,我把他们全面了一遍](https://mp.weixin.qq.com/s/pBsGQNxvRupZeWt4qZReIA),了解一下常见大厂的面试题侧重点。 + +看似 Java 后端八股文很多,实际把复习范围一缩小,重要的东西就是那些。考虑到时间问题,你不可能连一些比较冷门的知识点也给准备了。这没必要,主要精力先放在那些重要的知识点即可。 + +## 如何更高效地准备八股文? + +对于技术八股文来说,尽量不要死记硬背,这种方式非常枯燥且对自身能力提升有限!但是!想要一点不背是不太现实的,只是说要结合实际应用场景和实战来理解记忆。 + +我一直觉得面试八股文最好是和实际应用场景和实战相结合。很多同学现在的方向都错了,上来就是直接背八股文,硬生生学成了文科,那当然无趣了。 + +举个例子:你的项目中需要用到 Redis 来做缓存,你对照着官网简单了解并实践了简单使用 Redis 之后,你去看了 Redis 对应的八股文。你发现 Redis 可以用来做限流、分布式锁,于是你去在项目中实践了一下并掌握了对应的八股文。紧接着,你又发现 Redis 内存不够用的情况下,还能使用 Redis Cluster 来解决,于是你就又去实践了一下并掌握了对应的八股文。 + +**一定要记住你的主要目标是理解和记关键词,而不是像背课文一样一字一句地记下来!** + +另外,记录博客或者用自己的理解把对应的知识点讲给别人听也是一个不错的选择。 + +最后,准备技术面试的同学一定要定期复习(自测的方式非常好),不然确实会遗忘的。 \ No newline at end of file diff --git a/docs/interview-preparation/project-experience-guide.md b/docs/interview-preparation/project-experience-guide.md index 4439fc2f..b0aa15a4 100644 --- a/docs/interview-preparation/project-experience-guide.md +++ b/docs/interview-preparation/project-experience-guide.md @@ -3,6 +3,10 @@ title: 项目经验指南 category: 面试准备 --- +::: tip 友情提示 +本文节选自 **[《Java 面试指北》](../zhuanlan/java-mian-shi-zhi-bei.md)**。这是一份教你如何更高效地准备面试的小册,涵盖常见八股文(系统设计、常见框架、分布式、高并发 ......)、优质面经等内容。 +::: + ## 没有项目经验怎么办? 没有项目经验是大部分应届生会碰到的一个问题。甚至说,有很多有工作经验的程序员,对自己在公司做的项目不满意,也想找一个比较有技术含量的项目来做。 diff --git a/docs/java/basis/why-there-only-value-passing-in-java.md b/docs/java/basis/why-there-only-value-passing-in-java.md index 56083354..ca6880cf 100644 --- a/docs/java/basis/why-there-only-value-passing-in-java.md +++ b/docs/java/basis/why-there-only-value-passing-in-java.md @@ -1,5 +1,5 @@ --- -title: 为什么 Java 中只有值传递? +title: Java 值传递详解 category: Java tag: - Java基础 diff --git a/docs/java/collection/arraylist-source-code.md b/docs/java/collection/arraylist-source-code.md index 5d20436e..02ce2390 100644 --- a/docs/java/collection/arraylist-source-code.md +++ b/docs/java/collection/arraylist-source-code.md @@ -1,5 +1,5 @@ --- -title: ArrayList源码&扩容机制分析 +title: ArrayList 源码分析 category: Java tag: - Java集合 diff --git a/docs/java/collection/concurrent-hash-map-source-code.md b/docs/java/collection/concurrent-hash-map-source-code.md index 6a3bc057..34eecb44 100644 --- a/docs/java/collection/concurrent-hash-map-source-code.md +++ b/docs/java/collection/concurrent-hash-map-source-code.md @@ -1,5 +1,5 @@ --- -title: ConcurrentHashMap源码&底层数据结构分析 +title: ConcurrentHashMap 源码分析 category: Java tag: - Java集合 diff --git a/docs/java/collection/hashmap-source-code.md b/docs/java/collection/hashmap-source-code.md index c3af8193..07f7ee16 100644 --- a/docs/java/collection/hashmap-source-code.md +++ b/docs/java/collection/hashmap-source-code.md @@ -1,5 +1,5 @@ --- -title: HashMap源码&底层数据结构分析 +title: HashMap 源码分析 category: Java tag: - Java集合 diff --git a/docs/java/collection/java-collection-precautions-for-use.md b/docs/java/collection/java-collection-precautions-for-use.md index d2ea2eef..2c4c6937 100644 --- a/docs/java/collection/java-collection-precautions-for-use.md +++ b/docs/java/collection/java-collection-precautions-for-use.md @@ -1,5 +1,5 @@ --- -title: Java集合使用注意事项总结 +title: Java集合使用注意事项总结 category: Java tag: - Java集合 diff --git a/docs/java/concurrent/aqs.md b/docs/java/concurrent/aqs.md index 8181239b..84b044cc 100644 --- a/docs/java/concurrent/aqs.md +++ b/docs/java/concurrent/aqs.md @@ -1,5 +1,5 @@ --- -title: AQS 详解 +title: AQS 详解 category: Java tag: - Java并发 diff --git a/docs/java/concurrent/atomic-classes.md b/docs/java/concurrent/atomic-classes.md index 16510073..f95831ad 100644 --- a/docs/java/concurrent/atomic-classes.md +++ b/docs/java/concurrent/atomic-classes.md @@ -1,5 +1,5 @@ --- -title: Atomic 原子类总结 +title: Atomic 原子类总结 category: Java tag: - Java并发 diff --git a/docs/java/concurrent/completablefuture-intro.md b/docs/java/concurrent/completablefuture-intro.md index fefbf8ca..1137058a 100644 --- a/docs/java/concurrent/completablefuture-intro.md +++ b/docs/java/concurrent/completablefuture-intro.md @@ -1,5 +1,5 @@ --- -title: CompletableFuture详解 +title: CompletableFuture 详解 category: Java tag: - Java并发 diff --git a/docs/java/concurrent/java-concurrent-questions-01.md b/docs/java/concurrent/java-concurrent-questions-01.md index 4285ad41..747d311b 100644 --- a/docs/java/concurrent/java-concurrent-questions-01.md +++ b/docs/java/concurrent/java-concurrent-questions-01.md @@ -1,5 +1,5 @@ --- -title: Java 并发常见面试题总结(上) +title: Java并发常见面试题总结(上) category: Java tag: - Java并发 diff --git a/docs/java/concurrent/java-concurrent-questions-02.md b/docs/java/concurrent/java-concurrent-questions-02.md index 88d14ef6..23a25112 100644 --- a/docs/java/concurrent/java-concurrent-questions-02.md +++ b/docs/java/concurrent/java-concurrent-questions-02.md @@ -1,5 +1,5 @@ --- -title: Java 并发常见面试题总结(中) +title: Java并发常见面试题总结(中) category: Java tag: - Java并发 diff --git a/docs/java/concurrent/java-concurrent-questions-03.md b/docs/java/concurrent/java-concurrent-questions-03.md index 3af67dd1..69089eb6 100644 --- a/docs/java/concurrent/java-concurrent-questions-03.md +++ b/docs/java/concurrent/java-concurrent-questions-03.md @@ -1,5 +1,5 @@ --- -title: Java 并发常见面试题总结(下) +title: Java并发常见面试题总结(下) category: Java tag: - Java并发 diff --git a/docs/java/concurrent/java-thread-pool-summary.md b/docs/java/concurrent/java-thread-pool-summary.md index d7c08333..a544d83c 100644 --- a/docs/java/concurrent/java-thread-pool-summary.md +++ b/docs/java/concurrent/java-thread-pool-summary.md @@ -1,5 +1,5 @@ --- -title: Java 线程池详解 +title: Java 线程池详解 category: Java tag: - Java并发 diff --git a/docs/java/io/io-basis.md b/docs/java/io/io-basis.md index 9101ea15..566dd1f4 100755 --- a/docs/java/io/io-basis.md +++ b/docs/java/io/io-basis.md @@ -1,5 +1,5 @@ --- -title: Java IO基础知识总结 +title: Java IO 基础知识总结 category: Java tag: - Java IO diff --git a/docs/java/io/io-design-patterns.md b/docs/java/io/io-design-patterns.md index be662302..df1ee8f0 100644 --- a/docs/java/io/io-design-patterns.md +++ b/docs/java/io/io-design-patterns.md @@ -1,5 +1,5 @@ --- -title: Java IO设计模式总结 +title: Java IO 设计模式总结 category: Java tag: - Java IO diff --git a/docs/java/io/io-model.md b/docs/java/io/io-model.md index 3741c415..8c443f3c 100644 --- a/docs/java/io/io-model.md +++ b/docs/java/io/io-model.md @@ -1,5 +1,5 @@ --- -title: Java IO模型详解 +title: Java IO 模型详解 category: Java tag: - Java IO diff --git a/docs/java/jvm/classloader.md b/docs/java/jvm/classloader.md index bbb91e02..51431bf0 100644 --- a/docs/java/jvm/classloader.md +++ b/docs/java/jvm/classloader.md @@ -1,5 +1,5 @@ --- -title: 类加载器详解(重点) +title: 类加载器详解(重点) category: Java tag: - JVM diff --git a/docs/java/jvm/jvm-intro.md b/docs/java/jvm/jvm-intro.md index 8bb0fb51..3d949bb3 100644 --- a/docs/java/jvm/jvm-intro.md +++ b/docs/java/jvm/jvm-intro.md @@ -1,5 +1,5 @@ --- -title: 大白话带你认识 JVM +title: 大白话带你认识 JVM category: Java tag: - JVM diff --git a/docs/java/jvm/jvm-parameters-intro.md b/docs/java/jvm/jvm-parameters-intro.md index 6af3a1c2..07e254d1 100644 --- a/docs/java/jvm/jvm-parameters-intro.md +++ b/docs/java/jvm/jvm-parameters-intro.md @@ -1,5 +1,5 @@ --- -title: 最重要的 JVM 参数总结 +title: 最重要的 JVM 参数总结 category: Java tag: - JVM diff --git a/docs/java/jvm/memory-area.md b/docs/java/jvm/memory-area.md index 9c3d130f..858e45af 100644 --- a/docs/java/jvm/memory-area.md +++ b/docs/java/jvm/memory-area.md @@ -1,5 +1,5 @@ --- -title: Java 内存区域详解(重点) +title: Java 内存区域详解(重点) category: Java tag: - JVM diff --git a/docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md b/docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md index c95f83ba..eb7387ec 100644 --- a/docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md +++ b/docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md @@ -1,5 +1,5 @@ --- -title: Spring 常见面试题总结 +title: Spring常见面试题总结 category: 框架 tag: - Spring diff --git a/docs/system-design/framework/spring/spring-transaction.md b/docs/system-design/framework/spring/spring-transaction.md index 6f0f98e7..52ad30c4 100644 --- a/docs/system-design/framework/spring/spring-transaction.md +++ b/docs/system-design/framework/spring/spring-transaction.md @@ -1,5 +1,5 @@ --- -title: Spring 事务详解 +title: Spring 事务详解 category: 框架 tag: - Spring diff --git a/docs/system-design/framework/spring/springboot-knowledge-and-questions-summary.md b/docs/system-design/framework/spring/springboot-knowledge-and-questions-summary.md index 1c773424..75f7dbf0 100644 --- a/docs/system-design/framework/spring/springboot-knowledge-and-questions-summary.md +++ b/docs/system-design/framework/spring/springboot-knowledge-and-questions-summary.md @@ -1,5 +1,5 @@ --- -title: SpringBoot常见面试题总结(付费) +title: SpringBoot常见面试题总结(付费) category: 框架 tag: - Spring diff --git a/docs/system-design/security/images/basis-of-authority-certification/jwt-authentication process.drawio b/docs/system-design/security/images/basis-of-authority-certification/jwt-authentication process.drawio deleted file mode 100644 index 1e9934e4..00000000 --- a/docs/system-design/security/images/basis-of-authority-certification/jwt-authentication process.drawio +++ /dev/null @@ -1 +0,0 @@ -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 \ No newline at end of file diff --git a/docs/system-design/security/images/basis-of-authority-certification/session-cookie-authentication-process.drawio b/docs/system-design/security/images/basis-of-authority-certification/session-cookie-authentication-process.drawio deleted file mode 100644 index ed5b965b..00000000 --- a/docs/system-design/security/images/basis-of-authority-certification/session-cookie-authentication-process.drawio +++ /dev/null @@ -1 +0,0 @@ -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 \ No newline at end of file diff --git a/docs/system-design/security/images/basis-of-authority-certification/sso.drawio b/docs/system-design/security/images/basis-of-authority-certification/sso.drawio deleted file mode 100644 index ad8f211d..00000000 --- a/docs/system-design/security/images/basis-of-authority-certification/sso.drawio +++ /dev/null @@ -1 +0,0 @@ -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 \ No newline at end of file diff --git a/docs/system-design/security/images/design-of-authority-system/new-authority-system-design-access-flow-chart.drawio b/docs/system-design/security/images/design-of-authority-system/new-authority-system-design-access-flow-chart.drawio deleted file mode 100644 index 7c5e23fd..00000000 --- a/docs/system-design/security/images/design-of-authority-system/new-authority-system-design-access-flow-chart.drawio +++ /dev/null @@ -1 +0,0 @@ -7Ztbb6M4FIB/jR9nFHPnERLS1V6kWXWl2d03F5yEKcFZ4jTp/Pr1MYYE7HYzm1slolaqfWxj8HduNhTZ4+XuoSKrxW8sowWyRtkO2RNkWXjkBeIPSF5rSeDZtWBe5ZnqtBc85t9pM1JJN3lG152OnLGC56uuMGVlSVPekZGqYttutxkrurOuyJxqgseUFLr0a57xhZJiL9w3/ETz+aKZ2nOdumVJmt7qUdYLkrHtgchOkD2uGON1abkb0wJWr1mYetz0jdb2zipa8mMG0HwafNkt6Pevv2x/9wK6+Pvh8RNWz7Hmr80j00ysgKqyii/YnJWkSPbSuGKbMqNwWSxq+z6/MrZSwm+U81eFk2w4E6IFXxaqVdxx9fqnqIyayl9Q+ew21cnusHHyqmozVnJ1UQvqa16x5xYMXFks8gqaZwXdRcBfXqNRLBt6PFOeNt3rh4cnfnNRlWjNNlVK31lJpdecVHPK31tx3LIXVkPZkoonFAMrWhCev3RvhCj1nbf99oBFQTH+Ad7qLl9IsVEzafy7dLeLnNPHFZHPvhVG3iU5y4tizApWybF2RmgwS1syBy1eGtCnmWhJ2TJP97RqkzDD1HDr6F5oxenufXj6WqsBjrJM5ZvsxlK3e0u3PCVbHBp5OLoQnsbtHfJJXBQEKIyhEMcojlDio9iGMhRiFE41hmJNeBdUF0jJStqjp0SkyOelqKZiDamQx7DCuXCIkWpY5lkmvYBJM7q6c2l+2OoBdHSAeGQAaF2KX+vrr+pOP7JbPNndqaFfWC6mbtEHPfQOdruXqP2wGtWj2t7GCYaK7470wJHaPUMcucd50stZIrY0QH+AU/yYnvLcQMIeEHeke0bnmo4RGxIPQ2ALUDBF4Vg2TVDoykIEEQ6aRMyboMRD4QTKSYhC8at73I+B9OI257tdm7MNwc+/avDDGor7XuL/BU2F9r83E/6J0fU0o3bvQfAgJekHwQ+wnfCO8roeeNp4BAXhdaPE4GOTKYrHMBCGT1E0haZghIKwadIPEobhhwPX+tzzxIZtiNXYynWirX83zMNtIu5ZJj7SMtuB5ycUHJkPRT4KLZn9hCjWKQ7DxrAV9giakp3r7vT1/QWyvIKr1ehQ8v7ZsKbh01quUyQ6YG+12zeK0lz+BefrSXf8znlPPZO483oyNfQ0G+9B7Nk8xZlLfZPNh55vE+8Su5ge9MAA3WS29sWgm45PzwNdQ5w4KBaBFsuojJuIK/dF0EfG6UGqgePeXA2cq9q+iAiQk7kAXSRq1tSwTwahGGtL9XBkz/FA1EPbCPs31w/Tvug8+qG5APAOiUwRXFAXoRagCi4oTSxbI5Gk+wNVBceQ6F1ZFQw7MMVivSLlKaogeGMUWFIVIsgTwQGMpc+QiWTsHVCvJxsI9dsHCNP+6zzUfTgPFWjB7keQGLyXFQyKenhz6oY93Zmo62nBEWc2w9CDwP9ou4Tmwneffz3qt/f5tumN8KWsXz8XGgR13J7SNcbu3Rz72+dAZ8DeO4T3wfbjcLAxX+PvGN5rX5n/20dCp/IP5UlQIK09QZFzN/sWu+lDr+tif/sI6PQYL2w7tiVkjEJHHgE5KApkridivD9Y7LdP7QwnOzWwaCzP3cYo9NU7UsGpfjUaRj+TF/IAX7I35J6q0/aAcL6HoRDFEBuaeb6JeeQX85/TUtOG278qArUqyBMtYpI+z6W8P/leCbGn6geqFssfeU1OeM5KddGO5nXeNp5BDb2gq4WWSQtNH9p4P66Forr/h4D6W8X9/1XYyb8= \ No newline at end of file diff --git a/docs/system-design/security/images/design-of-authority-system/rbac.drawio b/docs/system-design/security/images/design-of-authority-system/rbac.drawio deleted file mode 100644 index 63d1e1ae..00000000 --- a/docs/system-design/security/images/design-of-authority-system/rbac.drawio +++ /dev/null @@ -1 +0,0 @@ -3VjbcpswEP0aPSaDuPMImLTT+0ym7bMMAtNg5Ar5kn59V0IyYOw07SRtpmOPLc6uVpc9eyQbOen68IqTzeo9K2iDbKs4IGeBbBtjy4cvidz3SBQFPVDxutBOA3Bb/6AatDS6rQvaTRwFY42oN1MwZ21LczHBCOdsP3UrWTMddUMqOgNuc9LM0a91IVZmXX40GF7TulqZoX3P7S1rYrz1UroVKdh+BDkZclLOmOhb60NKG7l7ZmP6fjcXrMeZcdqKx3RYlMHb3ffPXz7WH96nn9K3a//15kqnpxP3ZsW0gA3Qj4yLFatYS5psQBPOtm1BZVQLngafd4xtAMQAfqNC3Otskq1gAK3EutHWThAuYpkdAPKGdF2dG/imboxbPzU5n4sr1lDHtjynDyzTUIfwiooH/OxjXoDRlK2p4PfQj9OGiHo3nQfR1KqOfsPmQ0Pv/2/kIuzj7kiz1SMh229guknJYMHjLPnft8wYrjq1zzE4YG9zGIzQqtR3FqDIRXGIMh+FIUoClHkowSjKUOaiJEZh3whRaOlGHGvnyJfOsYuieGSCT4hpy0YYoeQ4UVh3P1c98jlyvSNLEIkJIUhTV63kAiSWcgB2lIsaqjDWhnVdFD33KKyWLFU8yb4Nq1uhEuElyFscx5QB6AGdkQjdeajLMZ8u18icFDr6lXVtO7auI61yPY9+gzc6+ie5miG0A6HPBzYxWFl2QOhT5h1n+edkxHMyzml0mt5BGWRW96ta0NsNUZW5h/NhmvQSKj1lDeOqr1MQGpa9DHB2R0cWPw/psgRLztZSKHoNMWpqHbsYgca6MLT+2MrjjorcGC9SZCYtF7PuWpO8OIZM++GQiILrQJ8Fq9EJ4VnPJB/zdPyXUm4/Usrdfynl0bNJ+Ux5ZTEmKPZkI0olKBFoKJWPMyXcgfwMXeWzQKGDsghF8Lb+a+EOfiXc2IKtmOgrfhLhxv5MuE9iPJ9w22eEe35cP6Fwl2Vp52eFu/CXvue/MOGG3OBp0l+CeDtnsuahEAo4VdeuFEWqnsMbdX27UUj8huzIK/kLyZTxkj9KW/xL18RkgSIsG3Ei9cGM8w3GUb/ErvN2xh3IhTg9FMZEaFlLT1ijocerxzlGTs+uRopTQvK7SuGngw+swr5+HhE1US8VU0Dds9bQc0y+CXGfgIlOOL1DuHhOQxxYcxLi5yKhe4aE8wPjSaWD+hekI4iWlvWypCPEf/PSB4/DfwP94TD8xeJkPwE= \ No newline at end of file diff --git a/docs/system-design/security/images/sentive-words-filter/brower-trie.png b/docs/system-design/security/images/sentive-words-filter/brower-trie.png deleted file mode 100644 index df981ed47fcf996d93678ce0842ceab33fe10205..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10501 zcmbVybx@pNlkNz`swNE;o*UXhUV_>{_6Vr@aW{?`~q=$szDqJ+kkEF?69z~{5m)=F)>L@ zOdK8=5f>Nl>h5Z5Ynz;!$|@-P^yw2gA|@;>?Ay0*gWrERd-!^LdoL|7&&@BWD691K z^~uS}+1uNno&C17w7j{wf$!~o`0!zC2Ob?At*58w@9#f0K0ZA&S6Ws!+P2Qm&%Zjc zfA#w|Ot%ICfk=d3&JJ#O_kS<1uGgna-h-VM6%`FNt+sUZR8>{k@#o|R^_}crtgNnW zFCEv_)gA4g`>K?uxpjPv8A?x2cXf5m&dv@BjndH2$S?UClK`o%|8{fvr@gzst8}iZ zr2~?g>*)vfkS)o}%Paj_GuaJGv}+0bk`NV})RH%q<=s^hJ{V`!4i^ z_}--uL`I-MP^)Ph#OwhcADMq+cF>!$I0X6EQLLkkT3XvE4)}ad>SwIdmQA+{4KuNC zr&hjf2T=L5OaOx+S>a+2x6<3830D46i9&?y{^Xj(`e+gg1JbmC+2-Vv6|usq+v7s} zcbsM-@hKr5LwQ`>g!?&4dp=N?VVCc@D#Iqn{3&rm;=|lAnRIYI^UQ|Yi1XLPev?He zpA7fNhjXeq0WYNUq9!Xai1lAdL}!0W>Bj=DhmoIuupE;P7Uk!tEFb{(<5d+~`i zdq0$)bhPW6$(a1i{(DJYZ@Q+^cOT!{kQi|4TVA9UhBUnMoNL6}${bJ2p59I4H@}|h z8rq~0P#^2^>gRl~2vx)C85llo`~Z?%5U_nQ#L1!x9bk8d^_pb$XuX8?KClmD|s6FjzB}~{9e4%p`2R&)3W#xk9b18zuoP;)r zu~`NR6904iHJ&Y$sLXbqK;ivshXPrIfr&##b7le3^2t?4)F<9B zz&zNKMt9+JL&h#dTLsbdh3s%2hO7yT-q1c@d8tywVE%#|857pKK;6w6Bt<$?I+0h> z%(w&m2}&Y7s02|jtkGMZzX8Z_i55uV;>l)rF4(4$-|d1mjrjA8yEXAOH@p8ln1k|< zk8{S2O9-+e_&W_Gs!5kv5#sew+!?`G0B%&0`0vgpFwNc<=7C5 zE>VZL4qsHfn9x(y7^+`!8T#>_6Hg;p(@0uovsg+n#Jz%UvvUWuW7s&j8;(Mpn zzokf5b)XJ1HW1T{UWt_@G}b@CF+S#PI-lw;MeI)@mMKb=k5p zTY%)-5v%3{j&UswU!9>~HB2YeT*@ zFDgDxCf1>6FS#=$dQ%|R|3{`D$BiEw4{76zJgkFFbI4kWr@YISGAR1z8vN(^QL2jv zf2RKrWdD(8G^}Rf5`G-(dig+z&DZ@b_Gp$dT6EK1rQ=2! z%X_g9NOU46z6QMn zR7x)M#lOsjlJK54`JW3dH)k)(1oOr3_Vzp62_S!i@S>z>%=nC=e2O) zhGl#gN-6ie|C>;yTzXKZ=vC+kx&Wf*hL*E&#w#Gclh7R)-nK$kY9eDBe$a@TuAyr1 zNkFh zF|AX{JfpFYvj1xNUFp+XJ}kWMh=NP{S}>h(<+ilIqi+tNI zhq4WJHX&H0A?x>u4mQAnop_l&CpN#Vs~r7KZ-u^4jBZ)ozw_i>Vu=tOAFxQ#qYF)C zI)}`#ZOchDcwj2d+kC|zo4p?J?GB90qefoFF8lU<4oUJY?Hg=fUnLT>XgPaJDZ8XF zAl(7G#Rq=L?FihMz6$=I3$xD4Knx3!hp;17up|0j;^u23)fIc;(sfQ3bMe2kdWrZ~ z1J|T|Y0eDu(*y5o>V3SG*b3Ecb4#m-Ili7%%j9u-3LDa?WVJmGn=KLMogIS#ITtI(83 zYu>8zhqz^M@&x8Jssc~I)UntU$?k1^jORGh`8U%|?GsuMgKLnZKV zbOd5n&6i_!QJT){ZSb|Duuj>>Tdp)!T`LhOv9BRgVS<$(tAzs5@ZZUOeXaDv{IE?f zji9}bMOc*t6(*Z>;VvXcvbXzX$ITaKao^v1=L+ItlU7xu)oah>9b8vxTk_7_{QlKA z#b6;oz>a`SA6Q>p-phKZ+c9?sJ$t=o1c=?PrA!p?A}7*e_$i(opUW;ZoHtRQ;H|s; zOXkg7wg2~gI!#i$ZxfsgNJ|mQ=DLJ083`!Pq{CtvP!{Uzho;FOZtk{D2Klt1haTr) zX!5>-s1Iaj1k7qluEfLuedUwaLW2YKHOTTPVmDq9rr%wv2bVmMG1r!u%i{ z=U{mMWSm_>;aNZ(GX58~@7Ca0XwPdr)LG*vp}=mT5dunirIZOVftH|X(!a~#1ocDY zUzRETmn!w0L*WCpj^l;VoG$ zM*Qin;yLJbO4swsNM}bVSE-r*L7TPn!{HP%(NX+y*o{xLZ_6?LA+vp4IYRViW#35~ zfiONie6)l{ZUpBb720Ene|uMT6F4hd>*gzfKvr=fKt##-9|-G4{4bdO&!j(%9d={R zNeqv|vV*NLwGlCMAE&dfcU^)6#`ESKX;1eEsaLZW?u(>6_`lHQEK2CMf&JF`?4(ch zUSr=rEq;@(x{>CnCI2xNJ)bsKns2BpBj$h-oB1y?iQw#szU2h1f*>OPGJBF|I;G`( z8q@k>cB4RRGCvLj)c0hR42Np{gwF2ec2Y{L$EiO|WPsKro>hTbr_tWsMvM$e$lv8P zIh&oa8biM<+&}OVYbXxM&(`{+2w4o@bVeiSxf3a#3)h(};GXtU?Wiz;1%9RLYy>}hR43{g?^a?K5U+fH)O&5(_!@^r|DVbzrg!@q3&zn`RTevUjMvRK zsI)T)y`NjGhVf?aUE*c>I`Iv*o4)z_7N(MVJL}ho^*^@!e=f|w4~jxtpU=hVDDy+w zMSJY{iLm|Z)30O0#~)UHfv9#jh&?J%+0%QRsJ}K)ClMjJfX*+Q%gpQV)5n%vnnKo9 zKwd{42a{`@XO(AdZEjXINbCMuL(oCw5+=kZjoYqGsm2QOOs~S-L}(qNHq9yM@eg^g zJ6wgP>AvyIGbreZRBibTsqcggT`)n5sZ;E3J%$zz|-21G;N#v}L+_=-G_MN3atR9T7h3;X9^ zr^1$(<^0O=kU3Ah&P}f6JA8TiIu^RS?s!>N;7<1Je=+4EBS*`dj+oetkoE-3KDjrXfA9;F9rK z9=?@$9@nl6|F>YmVbf9g?KOTB6%`dltY4{VrfVtO;FMV~XTsD|$Ho7!lp&{vGgrn& z$0!xueD$C#Qf$g#iyysSwftAv*bmxP>hI{9l!l!ZLjDXEF@=F4JhJhhD>)sOjyyZL zN+Lw+eaHC*Vrb!l$@pl&SIM0Iq+{gtKZmM?(ceTWah~_QAUygp;MO@m8Y@fvzIU&W zr(=FC2Tj7C9iDweoVr>2zH8Xhs>I=s*5QT|;P|U0{rQJH?-&P|wV9K8nZYzZ9%n}h7N$5ZYdf{WM;;*f@d&~VW)P^; z>_HM(7mrFP#kx;7{*xQISz9NIfpB&e$-L(lUZVFC8^=$x$%2V+nN9zAXMx$h1Tqus zDiJCfeB-75N7Y<6`uTAi~g?weD@vvJojgE<6CWu-`fzy8a88= ziu_F{ehy-?NY?o<5kT{A->`BDYTY7*l_@h;q(^1w;)JrTTH9=-h^#Nwt-*WRkFj}3 zFhywVK^4S_7o$?YY@D#(j7q{^2oAl`;}JR{ckjqVy7}f8) z9E|jb&Wkb3owI4Y2+%n*ThO>;o_qEVPO@~p1RCi5)aN$i?O#|`w)&^v$|^5o|oi&C5u^T7x34_q?qrPh*?dK z$WN?{q#SBn`xDcqijRKcWe(Duv{l=ct;=io6?HCYAge)`1H~s#FI-(pV2$B~L!Q)mXsUM6N zDk4yp(|sZT&-Wp&goRW>gAkhr6cdpMk(QK$7SYgI%-|(ATK}UC`!CcY{f7as3#Ua^ zD!RH{RNY>vmoMD6sNhBp4uaeFeFEIuJ~7@xw9CHe)xfIklbn-tGAxw7KwPGV@7x8j z4_=pdX(-HFUIk9+oN!*bf7IT1QOfS&%@Kyjt=p~LupN%J6{ZHgc_b*_fdn|K=P&qW z^q(C^1JYutZ&IbPwGqKibx@{V9SuTmgKl)Cy?h_iPh)>CetTnO5bhI7%$r|Pvd647 ziR~VLGZ5j_C!~F$p0IEql6f`h8kd}}2QJ^QcX*+m{w%V(93W1a9aqbu04nvmH`m}X?{oGoJx;%_Le9j?Kk&8UM9&@X&- zhbNKe%l23Mf1vvRL7i`MWfWyu4a1y?UAX7nTjTe?rjhE_LToP2hD>pURV*DolI4}K z*tYxj^4v#Ly4R~l!etNULTsk?N1YqdOmGQTzr!a6-fCw4z{~f#g1t>=pwOXU1uDfq zvZgnvdZwTb*CWxdVVilE$TKS5?p)Nu{454U@)KEKM;P?3_p@Vgv@W~g@*NNC;^=UN z;pMwu!FDnFcJPl5SJwjN?kHGJH`8Ruj|ziqS;!bYhLW%ZdA6USGBB9F0- z;DKbvJ6){y$bW4vMyekLuh3dvwnD5(!^0Fb2=fE3V9ZqkTfiu5s8Or^V`}4Y+XIKJ z9CW9t4(7KW_Bc9#x|f9vVDKHR1FfxxRgv5zH{M=W-B5CIQWPf6p>MHd0q=B`;!8Yyfogs@)4_ZuOxs8x}xzjn~9uc$P(*{+?% zYV8;Mctt%ROd1g8ZwA4e+HAhp(x%?IaX|bv6MJd;0q{0nj3OSYAsvR4q?&IYHR1`w zEE||KuEde`d3^E@28P@Fz(jm&4vX2y|HVM49=zbU|8qMEL&q%bc!7Q!RczVLm#!|r}H-^(>2 z0PmBKncx)fQauS1m;k$bM(Dw&AlVTWsLJWUKl*WlGObL53su z1L;}0Kttek3SOM0;~y@#A#D>{yrhY9c4IDwMdj@CFnIa08;}k;s*Rm=igc@NuCQ!z zBqRh0CYeG%E<7KElHiu^GW!_F=I+Kb@3si`-0vIV2^z#!HssF$>xaTa31HFAvK-+z zAS&Qf^5LRkWZykjX)2=QFQe*;6W2dZx?K{^eja3p9Tm|kCuN1ip_rK6m%B=k6 zEBdl=($t|Aw5te}&$*Af|GaD9s=OkX4$@53LTtxM^V}vkw$Z*j5A#+r`F>m5uoQ7R1V zNCM`B#wt$_fdJ~#S_suyWOnf&WFb^ukp4ZRtVw&?<*x#~+6`6=`Mp}KYV!d^z{ku5 zKdZ2*aa!^1<_#lmfK|%Yz=}6xhGbKhRoe&Z9b<(2oB!rg_TNpY|Gvt7G`Y%?8$A?G zN?!1zeIBZ%rW<^N%vyRx@KwtW{%RrgsdPJRXo))cjxeS~ew}I|j_mG!DdvOby6a%W zoQ$lLIE%GE^z@JP1R?FsFQZOvt^!3^a8&WizcSlosrcDs$tRZK|09MqGoGP@o(5cr zFxI*hp=p*08h5vH0#(ijAP1A$h_}B5*T!jie>?L8>@BlwY#a*v){Z2KMo(|l!H|cl zLVulVBccI+ukxZmDLnrkwf~*S|9oBTHSB&$$kWEbSbOIfzVQbJV1MtwlX>*sDAA9d zaXvwFn)f1d;r_{z1~+e?+qO}na8cl5IO&pJjFI^=B;RPe&51jwlnkK4Q}?!&AV`Q3 zA+|ZPSq(GhHV-vc;?;CF59^&L+`op)eeH&@%fAYhbIbwc(DfW2qB~G0-+hP7#&PsX zW?@4it)|30;+rG+T8JkRcpM*bm+TY7^#a|`tErg&wV2Dp`rE}3RFs!MeM!8 ztDS*1_1zv-_UGRRd}lgAdM$&;q3EV{)^2D)G=(G-otIa%Mdag0!ZUtSMiusY8KfF( zhb>lTfW7(N`34~vKfaQ^s~%_28RI1U!T##+HsqfEi4p##Rfj`Ymq8Ca#i*V2YWtNJ znqUg61@VZGg}yfzai!6!ONYazlu==KVx$)0hlmwvclmM6J55~nbd6P!Ym56?p{rnf z(230DejiK05f;EjS>6xpy9!NJ;0eqW;wmg|<-GN-E}eyV7lJ%u?F(hl69Pnzy^Dwv zkW6(Qewco$A$LJ%??2_)@X3+%qrt6#X^(sHWV6Cwx-q1EON2r}{I;Pr4==ft7@4!n z|B_RVFUQ(Cqe(GoGr_Y6r>FJVQ7o^~aIh;N7w5=Q9TYwJ znCVpDFK*j=NQ`ZLab!`?xoqpc;S;xFnkjK(mB}&u4EX)3x@-)I$15fmz*&Tu(V(z$ zc}@O#NHd>P#2AIE4hO}bblPa-ZPktD;$eipP$h&W?BGXiJ$!8*@CTw@4PeoFyh{|n zm$c#mvnMkagl9iEK06^^K6A%yFwb)`+>=pHNAKIAbZ@k1Xq(AT3xL)l)(oM2Ns`nh zE9ETT6RGgk)07IklV!CKq8F^1AU0MyMHxBQKGL9##GF~V z#E>0M6cD96{K{|mRvxO5?`kBgZ$jxpdpV(GH1^Dh2qwVPu^EI}Nl77N)(VtisozCU zZA?52FU{%A$5a3+ZP=@z;{iosnx{*rK}!6hgDbfPeI*~`;`yr_8dS8|7b!a+2}{g| z>7peb^QsvEnZCJMW6AhS^$S9&rRX55r4Y>_$nRfvn_ zFU0NL(OvxYCEZ28LI=T9oX~%`k<&d>!4OPW1UR)bWI#ns!_(1n-z2`YB7pMdqs`u z#ULq1$j`kTc=9*zyiIjQJESk6Rci=YNv2}sO~lRw&$&C``1Yg{6aB^A&@|QiAv0t= zVmXGLFfE-yh_-eR>5T%VLAP-xQuj=KkhAD($>4Z)(aU|rl=d(G4+RgtCp|4BhH(5B zaHcU-9Ee7;RfZMtLp(Tn1t>gDyq(d=d&y_C6bTSyHS~fU#jqQVB3Io!$z9wL$cTVb z(O-z!m(@sZp_lD?BMni4>-SQ07qi6u2WGzGQK{UA_H>WN%%sEYR3*x*gpn6}?ObL7|g3bFJIugBza4P=*0qc%PdVve%4=25~FihThJ>+~d#+cu^ zU8k8?V6{IL>s}%}>${HMRROOekiU@@Ox>VVmnC$WA4{TBFb~x zF80_1`mD&)Tlsp_5Pbor2uDwXa3sd~e82BDC~QX5C|FTChu9j?m|pa(^p21=1i|g! zI`*w4cfyp+(R$lcHXAp|qf;k|Sjsq~=Xrd6T|T~1*#1q^;CuLfMgW`#3bF^>zk$=} z7jeaZgDmL6g{Y$ekgCk3tPlHM@!)fJTlV<6>V2-a0WfCm99ru7N*p+hgO^x_t?K4Y zQ%xBfD@#`51ouB+a(OD_;EYw_l(z=$u2m7u8oIz003(y2y$_|u3u=L{NcoQJbeV&D zf0ND&wuDS-Mvq@DvBy$sAvBFTj5{9X0fo1#We;xSB0rCP@#0BM3aCJ`m@Z7B5_Xf? z0lz4(lg_uQ{!DE9;UP0(iZ#CR0!?)>p&P`Xf+SfE!3T71!Mhj{GlPeZ!6M)|nF(%i zGQt5WI(#gNU9dfCi9+38-sPNQ0Gdc~?hx7LP(GOYlq)dVYWrL6?lsDv=~AqDe(FYl zXH^nHf7FljS?{olBNzPA%>dCoRC}?VkbJXiQ#2DK}70rf!o}3^Xp7x-PJHetp}^S-z`qxeuwhiGfmz-r9x(p zxBKw~Y?E5dQeqW9dV= z)A6YIEfy#Rw5GH8X8h=-M-hC^FH-@7ydLBnNYw3v6Nv;^jmrIowsEp802IrdkGeGl z{>Sj55YvaJ!$)sX6sbU&u|`zNG(r&q4-D#^i^_meo3U|QuGD4vJ~)p#Ro@NJK*)ew z<2Nd+gLjq}MrjLizCpG7w$ueG*6x!w!h!I58BQ2fzfx@+pdj?ZOLV{&t1l0TM649B zd6Ra#@O`5exQ0%BeC03_h-MdeC)PDk>-C!%t2n(C=0uSk-A6V4W^~*iKWZlZuV#df zs_}0kdnc^HTl76-^$1f9o*u%K#^2HzkhnVW3^v<`{#uIE=O3xz4U zNUq&RsVyW}Kq;n*nOL$=b4Cz>=`{tONvn3qi>nf)kd;=n-drwgAA%PHXPwo01}L~M zsWyn*UM5k-F8xf7x#X(|Yon$M5`TJX=(O&cP1Eqb;m1xH_F^3rqjoWaDI4ak^tP$|b(Ak`*setHJ~uj~@{0Jx$)Cf;!+R4sLWYSS*dpH&R&P;RlXh$7 zdsaNf@zAdYQuqFraX~L|RS57pMS7>ro7yMMXZQ1Ji@dWS8kA4OfM)yJr%U)^rZEn$ ztHSg2`ZT=`1}`F9N`6eHte4yup2sDLZ%X+vo{V`_`ojf5Phf96OaKRaSnh~gp9waA zc27iQ$ecK}Y+S4ojJ{B)k}%AjBwZwSkozs(v0DHXWcVY?$hy-hm#g#O#kyS=EM+_C zQ~R9{v{ioY3A@QSQ{#p|h~rx?xikMpbK$0iY*%)GC?ZVmS0`3J)ld2>tuWrk(UHSZ z$jC7Hg(oYc1Zzs6B-_V$tk$ApdRrcn(9tK9kipfp=d=`cV_{5uw zoK5HEy4l?rwGcJHUqskNF*%-X#ZG3z(c>s|pi0uG)INe{Ux#H5hhx(Xzw z`gn)bzTr2?q9?QlY%GF{bX^nO$yIJqQ%koQ^AjC9yMp_g&}sE_fJLFc3w?o{Lcond zH5yB#ur+c|y}6&YANjRa8<5uDdwT&tWP6E*|8cMBngf1N!kb$cFmViKi6bd2u&Fo{ zPAoUNx^hOlV!+2Fl zCZaXf5qt{X`kHj=VQ`-cxLf;?d-Ysjp_lI>jsY7pR~U<;jLQkrA}qKqb;a?Hb&Hv{ m&i;Y@swx&ukpBZqZdp43 diff --git a/docs/system-design/security/images/sentive-words-filter/common-collections-trie.png b/docs/system-design/security/images/sentive-words-filter/common-collections-trie.png deleted file mode 100644 index a6455205d9abcfe68954cce5953d6dc91db814f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11741 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 E53;EwhyVZp diff --git a/docs/system-design/security/images/sentive-words-filter/hutool-dfa.png b/docs/system-design/security/images/sentive-words-filter/hutool-dfa.png deleted file mode 100644 index 18356ced3bc06dcc1b96d98f2053ee31b0a37463..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7471 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 diff --git a/docs/system-design/security/images/sentive-words-filter/trie.drawio b/docs/system-design/security/images/sentive-words-filter/trie.drawio deleted file mode 100644 index 6bb1a6e4..00000000 --- a/docs/system-design/security/images/sentive-words-filter/trie.drawio +++ /dev/null @@ -1 +0,0 @@ -3Vpdk5s2FP01erQHISGJR/zZyUzStNtNu08dFrQ2WWw5GK/t/voKEDYI1nVJMMSzD8u9Eldw7tHRFRZA49VhHrmb5Ufh8xCYhn8AaAJME1LI5L/Ec8w8FsKZYxEFvup0djwE/3DlNJR3F/h8W+oYCxHGwabs9MR6zb245HOjSOzL3V5EWB514y54xfHguWHV+2fgx8vMy0x69v/Cg8UyHxkSO2t5dr3XRSR2azUeMNGMzGYzhcfKzWOpF90uXV/sCy40BWgcCRFnV6vDmIcJtjls2X2zd1pPzx3xdXzNDd4fPnuai6+/Op/8T3/vB/P943qgory54U7h8XvyQNkDx8ccJBlJ5kMao/0yiPnDxvWSlr2khPQt41UoLSgvX8Q6VjmGJLGDMByLUERpHPTCPO550r+NI/HK85a1WCexTwgZifHKY2+pjOq75g/Oo5gfCi717nMuVjyOjrKLajVtxUvF0xMB9+eswzxXy0LGmfK5imiLU+gz2PJC4f0/sDcr2IOpDZwRsFlrCfBdzl66SQAkRikBiHSdAFSTAAxGDNjje0wANvqWAFyTAJIkgFn3mABWxh/bXeNv1eDPgEMBI/eI/8AsJ4DgrhNAKgm4S+XRpZ+groG3K8B/aQ14Dn2L026KHlQGntKugc+rLr3qMYEN7zEDA6iJDmWdp6Ba9Kd1jwOcu1QfjMsZsIzOM1BTeVaAX/tOsr09g3QBbAlOdPxLQZYaT6pnakwOxabJMbcOQZzeNLSU9VRoOd+UGPk9DTK1FbvI4xfgUC8fu9GCx5dgy/pxv7Sjr+a9kFerJq25L+KhGwdv5e8AdblWI3wWgXyzE63Qe+V0HiJ7b3VXcWOuB7K0QFALlAFTCZRS7/Ta38HGmjK8UzYSAxf4ODCGhkUukjIxPvMokEjwqEWi4iuJavaKqFrxhZvyFEIt0K15WrNd+T6e9kT/rCtphXtFK30zpbPhWlpRbXXW6dk2q6p7sC7UrwGv/pMvVq/4MtB0iFLWkDBD02KQGZDJpRNixMphDXto2wTaNkNY0vK2ZKJtkQk2W0oxQkVpGxoQ9WIlJT+n5GmVGjGblnxa7WjRG4se+8E8bYMj9pUcIb3iiF7N06bllv65nt663Kp+I+tWy7ot0tCVbOzXJtXSqiukC821bCRauYd06WuZjflwHbOxDWbBnlEGoaFFy8uTCYfUbChjJK3HsEEYhdA2KSqFxlgWJQaW6mZiimXZhm5Lq7pvoRQwBJxJlV8//+doq3c/geXzuIX915Bhszi5jaEtNwtNJ3jaT6+Nm8/6q3dxfZMHWpEHQprLg2WU5cEuCw/T1OG24lB3QMRKDic44/QXkzGwaeqZgZG8mKUe54P75s6TU23AJKEEf/QclehMvu2SM18pcQfblLmO7ADJ5pAyKm+XV4v0fzLUJDmUMmVAzkM5fj5UNox8AimbTvXMhBSFuDxZahWnKE/K5YbBYi1NT/I6IfsokZjAc0NHNawC3w/fk8L0VBz31RwJ3Wcejk6n5fTBda2UdkErR+lfGjOWtBXJ2APUzm+l5QNiVt0BMVYzsfS6vIk08m9fl7Pw8ePj9LdwwFcfBD74NYfzUrKRhGx3uDbpO6ebrk21CfjRS9OFxaXBLueqtecSsXqyomC9JkGNS822vqpI83xQN+t+Pg2Npv8C \ No newline at end of file diff --git a/docs/system-design/security/images/sentive-words-filter/trie.png b/docs/system-design/security/images/sentive-words-filter/trie.png deleted file mode 100644 index 8d8117b4765764ec10dca0441af72bd64d7effdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50950 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%0A)Xz?XW?d#G?-2}Lu<@zdlF6(YZE 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 z%0D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 trie = new PatriciaTrie<>(); @@ -62,7 +62,7 @@ AC 自动机算法使用 Trie 树来存放模式串的前缀,通过失败匹 [Hutool](https://hutool.cn/docs/#/dfa/%E6%A6%82%E8%BF%B0) 提供了 DFA 算法的实现: -![](./images/sentive-words-filter/hutool-dfa.png) +![Hutool 的 DFA 算法](https://oss.javaguide.cn/github/javaguide/system-design/security/hutool-dfa.png) ```java WordTree wordTree = new WordTree(); diff --git a/docs/tools/docker/docker-in-action.md b/docs/tools/docker/docker-in-action.md index 867aa024..03418fb3 100644 --- a/docs/tools/docker/docker-in-action.md +++ b/docs/tools/docker/docker-in-action.md @@ -1,5 +1,5 @@ --- -title: Docker 实战 +title: Docker实战 category: 开发工具 tag: - Docker diff --git a/docs/tools/docker/docker-intro.md b/docs/tools/docker/docker-intro.md index b521041d..2a7b95e4 100644 --- a/docs/tools/docker/docker-intro.md +++ b/docs/tools/docker/docker-intro.md @@ -1,5 +1,5 @@ --- -title: Docker 核心概念总结 +title: Docker核心概念总结 category: 开发工具 tag: - Docker diff --git a/docs/tools/git/git-intro.md b/docs/tools/git/git-intro.md index 69c1f9d5..ebb1ee56 100644 --- a/docs/tools/git/git-intro.md +++ b/docs/tools/git/git-intro.md @@ -1,5 +1,5 @@ --- -title: Git 核心概念总结 +title: Git核心概念总结 category: 开发工具 tag: - Git diff --git a/docs/tools/git/github-tips.md b/docs/tools/git/github-tips.md index c88ea831..4de1dace 100644 --- a/docs/tools/git/github-tips.md +++ b/docs/tools/git/github-tips.md @@ -1,5 +1,5 @@ --- -title: Github 实用小技巧总结 +title: Github实用小技巧总结 category: 开发工具 tag: - Git diff --git a/docs/tools/gradle/gradle-core-concepts.md b/docs/tools/gradle/gradle-core-concepts.md index 282d3e2f..006c899c 100644 --- a/docs/tools/gradle/gradle-core-concepts.md +++ b/docs/tools/gradle/gradle-core-concepts.md @@ -1,5 +1,5 @@ --- -title: Gradle 核心概念总结 +title: Gradle核心概念总结 category: 开发工具 head: - - meta diff --git a/docs/tools/maven/maven-core-concepts.md b/docs/tools/maven/maven-core-concepts.md index eea9da60..cf852a71 100644 --- a/docs/tools/maven/maven-core-concepts.md +++ b/docs/tools/maven/maven-core-concepts.md @@ -1,5 +1,5 @@ --- -title: Maven 核心概念总结 +title: Maven核心概念总结 category: 开发工具 head: - - meta