diff --git a/README.md b/README.md index ad5763f9..fc9f667e 100755 --- a/README.md +++ b/README.md @@ -1,43 +1,41 @@ -## 👏 重大更新!!!重磅! +> [JavaGuide 官方知识星球](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)来啦!!!如果你需要专属面试小册/一对一交流/简历修改/专属求职指南/学习打卡,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc) (一定要确定自己真的需要再加入,一定要看完详细介绍之后再加我)。 -- JavaGuide 在线阅读版(新版,推荐👍):https://javaguide.cn/ -- JavaGuide 在线阅读版(老版):https://snailclimb.gitee.io/javaguide/#/ -- [《JavaGuide 面试突击版》PDF 版本下载](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=100029614&idx=1&sn=62993c5cf10265cb7018db7f1ec67250&chksm=4ea1fb6579d67273499b7243641d4ef372decd08047bfbb6dfb5843ef81c7ccba209086cf345#rd) - - - -> 1. **介绍**:关于 JavaGuide 的相关介绍请看:[关于 JavaGuide 的一些说明](https://www.yuque.com/snailclimb/dr6cvl/mr44yt) 。 -> 2. **贡献指南** :欢迎参与 [JavaGuide的维护工作](https://github.com/Snailclimb/JavaGuide/issues/1235),这是一件非常有意义的事情。 -> 3. **PDF版本** : [《JavaGuide 面试突击版》PDF 版本](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=100029614&idx=1&sn=62993c5cf10265cb7018db7f1ec67250&chksm=4ea1fb6579d67273499b7243641d4ef372decd08047bfbb6dfb5843ef81c7ccba209086cf345#rd) 。 -> 4. **图解计算机基础** :[图解计算机基础 PDF 下载](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=100021725&idx=1&sn=2db9664ca25363139a81691043e9fd8f&chksm=4ea19a1679d61300d8990f7e43bfc7f476577a81b712cf0f9c6f6552a8b219bc081efddb5c54#rd) 。 -> 5. **知识星球** : 简历指导/Java学习/面试指导/面试小册。欢迎加入[我的知识星球](https://sourl.cn/psyWaE) 。 -> 6. **面试专版** :准备面试的小伙伴可以考虑面试专版:[《Java面试进阶指北 》](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7) (质量很高,专为面试打造,星球用户免费) -> 7. **转载须知** :以下所有文章如非文首说明皆为我(Guide哥)的原创,转载在文首注明出处,如发现恶意抄袭/搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!⛽️ - -

- - - -

-

- 阅读 - stars - forks - issues -

-

推荐

- - - - - - -
+
+

- -

+ + +

+

+ + + +

+

+ 阅读 + stars + forks + issues +

+ +> 1. **面试专版** :准备面试的小伙伴可以考虑面试专版:[《Java 面试进阶指北 》](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7) (质量很高,专为面试打造,配合 JavaGuide 食用)。 +> 1. **知识星球** :专属面试小册/一对一交流/简历修改/专属求职指南,欢迎加入 [JavaGuide 知识星球](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)(点击链接即可查看星球的详细介绍,一定一定一定确定自己真的需要再加入,一定一定要看完详细介绍之后再加我)。 +> 2. **转载须知** :以下所有文章如非文首说明为转载皆为我(Guide 哥)的原创,转载在文首注明出处,如发现恶意抄袭/搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境! + +推荐你通过在线阅读网站进行阅读,体验更好,速度更快! + +- [JavaGuide 在线阅读网站(新版,推荐👍)](https://javaguide.cn/) +- [JavaGuide 在线阅读版(老版)](https://snailclimb.gitee.io/javaguide/#/) + +你可能需要: + +- [项目介绍](./docs/javaguide/intro) +- [贡献指南](./docs/javaguide/contribution-guideline) +- [常见问题](./docs/javaguide/faq) +- [项目代办](./docs/javaguide/todo) + ## Java ### 基础 diff --git a/docs/distributed-system/distributed-transaction.md b/docs/distributed-system/distributed-transaction.md index 67fc9415..c020c89e 100644 --- a/docs/distributed-system/distributed-transaction.md +++ b/docs/distributed-system/distributed-transaction.md @@ -13,12 +13,11 @@ category: 分布式 ![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211231206733.png) -专属面试小册/一对一交流/简历修改/专属求职指南,欢迎加入我的[知识星球](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)!。 +如果你需要专属面试小册/一对一交流/简历修改/专属求职指南/学习打卡,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc) (一定要确定自己真的需要再加入,一定要看完详细介绍之后再加我)。 星球目前的定价为 **159/年**,即将调整为 **199/年**。如果的认可 JavaGuide,相信我,并且需要星球提供的专属服务,那欢迎你加入我的星球。你可以添加我的私人微信领取星球专属优惠券,限时 **100/年** 加入。一定要备注“**星球优惠券**”! ![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211231926486.png) -**用心做内容,不割韭菜。加油!!!** +**用心做内容,真心希望帮助到你,拒绝知识付费割韭菜。加油!!!** -知识星球详细介绍请看(一定一定一定确定自己真的需要再加入,一定一定要看完详细介绍之后再加我):[https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)。 diff --git a/docs/high-availability/降级&熔断.md b/docs/high-availability/降级&熔断.md index 59f6c368..acc7b673 100644 --- a/docs/high-availability/降级&熔断.md +++ b/docs/high-availability/降级&熔断.md @@ -10,14 +10,13 @@ ![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211231206733.png) -专属面试小册/一对一交流/简历修改/专属求职指南,欢迎加入我的[知识星球](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)!。 +如果你需要专属面试小册/一对一交流/简历修改/专属求职指南/学习打卡,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc) (一定要确定自己真的需要再加入,一定要看完详细介绍之后再加我)。 星球目前的定价为 **159/年**,即将调整为 **199/年**。如果的认可 JavaGuide,相信我,并且需要星球提供的专属服务,那欢迎你加入我的星球。你可以添加我的私人微信领取星球专属优惠券,限时 **100/年** 加入。一定要备注“**星球优惠券**”! ![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211231926486.png) -**用心做内容,不割韭菜。加油!!!** - -知识星球详细介绍请看(一定一定一定确定自己真的需要再加入,一定一定要看完详细介绍之后再加我):[https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)。 +**用心做内容,真心希望帮助到你,拒绝知识付费割韭菜。加油!!!** + diff --git a/docs/java/basis/generics.md b/docs/java/basis/generics.md index e6f35e96..164794b6 100644 --- a/docs/java/basis/generics.md +++ b/docs/java/basis/generics.md @@ -15,16 +15,13 @@ tag: ![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211231206733.png) -专属面试小册/一对一交流/简历修改/专属求职指南,欢迎加入我的[知识星球](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)!。 +如果你需要专属面试小册/一对一交流/简历修改/专属求职指南/学习打卡,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc) (一定要确定自己真的需要再加入,一定要看完详细介绍之后再加我)。 星球目前的定价为 **159/年**,即将调整为 **199/年**。如果的认可 JavaGuide,相信我,并且需要星球提供的专属服务,那欢迎你加入我的星球。你可以添加我的私人微信领取星球专属优惠券,限时 **100/年** 加入。一定要备注“**星球优惠券**”! ![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211231926486.png) -**用心做内容,不割韭菜。加油!!!** - -知识星球详细介绍请看(一定一定一定确定自己真的需要再加入,一定一定要看完详细介绍之后再加我):[https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)。 - +**用心做内容,真心希望帮助到你,拒绝知识付费割韭菜。加油!!!** diff --git a/docs/readme.md b/docs/readme.md index 42cb7db1..39d35129 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -15,11 +15,9 @@ action: ## 👍官方知识星球 -专属面试小册/一对一交流/简历修改/专属求职指南。欢迎加入 JavaGuide [知识星球](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc),星球详细介绍:[https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)。 + [JavaGuide 官方知识星球](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)来啦!!!如果你需要专属面试小册/一对一交流/简历修改/专属求职指南/学习打卡,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc) (一定要确定自己真的需要再加入,一定要看完详细介绍之后再加我)。 -**最优质良心的 Java 面试交流星球,多次被官方推荐!** - -**真诚欢迎准备面试的小伙伴加入星球一起交流!真心希望能够帮助到更多小伙伴!相信一定不会让你失望的!** +**用心做内容,真心希望帮助到你,拒绝知识付费割韭菜。加油!!!** ## 👉推荐阅读 diff --git a/docs/system-design/framework/netty.md b/docs/system-design/framework/netty.md index e5e94990..19b03f87 100644 --- a/docs/system-design/framework/netty.md +++ b/docs/system-design/framework/netty.md @@ -13,12 +13,11 @@ Netty 相关的面试题为我的[知识星球](https://www.yuque.com/docs/share ![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211231206733.png) -专属面试小册/一对一交流/简历修改/专属求职指南,欢迎加入我的[知识星球](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)!。 +如果你需要专属面试小册/一对一交流/简历修改/专属求职指南/学习打卡,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc) (一定要确定自己真的需要再加入,一定要看完详细介绍之后再加我)。 星球目前的定价为 **159/年**,即将调整为 **199/年**。如果的认可 JavaGuide,相信我,并且需要星球提供的专属服务,那欢迎你加入我的星球。你可以添加我的私人微信领取星球专属优惠券,限时 **100/年** 加入。一定要备注“**星球优惠券**”! ![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211231926486.png) -**用心做内容,不割韭菜。加油!!!** +**用心做内容,真心希望帮助到你,拒绝知识付费割韭菜。加油!!!** -知识星球详细介绍请看(一定一定一定确定自己真的需要再加入,一定一定要看完详细介绍之后再加我):[https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)。 diff --git a/docs/system-design/framework/springcloud/springcloud-intro.md b/docs/system-design/framework/springcloud/springcloud-intro.md index edcc68ca..8a3e83ab 100644 --- a/docs/system-design/framework/springcloud/springcloud-intro.md +++ b/docs/system-design/framework/springcloud/springcloud-intro.md @@ -4,13 +4,11 @@ > > 授权转载自:https://juejin.im/post/5de2553e5188256e885f4fa3 - - 首先我给大家看一张图,如果大家对这张图有些地方不太理解的话,我希望你们看完我这篇文章会恍然大悟。 ![Spring Cloud 总体架构](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/spring-cloud总体架构.jpg) -## 什么是Spring Cloud +## 什么是 Spring Cloud > 构建分布式系统不仅复杂而且容易出错。Spring Cloud 为最常见的分布式系统模式提供了一种简单且易于接受的编程模型,帮助开发人员构建有弹性的、可靠的、协调的应用程序。Spring Cloud 构建于 Spring Boot 之上,使得开发者很容易入手并快速应用于生产中。 @@ -26,7 +24,7 @@ ## Spring Cloud 的服务发现框架——Eureka -> `Eureka`是基于`REST`(代表性状态转移)的服务,主要在 `AWS` 云中用于定位服务,以实现负载均衡和中间层服务器的故障转移。我们称此服务为`Eureka`服务器。Eureka还带有一个基于 `Java` 的客户端组件 `Eureka Client`,它使与服务的交互变得更加容易。客户端还具有一个内置的负载平衡器,可以执行基本的循环负载平衡。在 `Netflix`,更复杂的负载均衡器将 `Eureka` 包装起来,以基于流量,资源使用,错误条件等多种因素提供加权负载均衡,以提供出色的弹性。 +> `Eureka`是基于`REST`(代表性状态转移)的服务,主要在 `AWS` 云中用于定位服务,以实现负载均衡和中间层服务器的故障转移。我们称此服务为`Eureka`服务器。Eureka 还带有一个基于 `Java` 的客户端组件 `Eureka Client`,它使与服务的交互变得更加容易。客户端还具有一个内置的负载平衡器,可以执行基本的循环负载平衡。在 `Netflix`,更复杂的负载均衡器将 `Eureka` 包装起来,以基于流量,资源使用,错误条件等多种因素提供加权负载均衡,以提供出色的弹性。 总的来说,`Eureka` 就是一个服务发现框架。何为服务,何又为发现呢? @@ -66,33 +64,33 @@ **服务注册 Register**: -官方解释:当 `Eureka` 客户端向 `Eureka Server` 注册时,它提供自身的**元数据**,比如IP地址、端口,运行状况指示符URL,主页等。 +官方解释:当 `Eureka` 客户端向 `Eureka Server` 注册时,它提供自身的**元数据**,比如 IP 地址、端口,运行状况指示符 URL,主页等。 结合中介理解:房东 (提供者 `Eureka Client Provider`)在中介 (服务器 `Eureka Server`) 那里登记房屋的信息,比如面积,价格,地段等等(元数据 `metaData`)。 **服务续约 Renew**: -官方解释:**`Eureka` 客户会每隔30秒(默认情况下)发送一次心跳来续约**。 通过续约来告知 `Eureka Server` 该 `Eureka` 客户仍然存在,没有出现问题。 正常情况下,如果 `Eureka Server` 在90秒没有收到 `Eureka` 客户的续约,它会将实例从其注册表中删除。 +官方解释:**`Eureka` 客户会每隔 30 秒(默认情况下)发送一次心跳来续约**。 通过续约来告知 `Eureka Server` 该 `Eureka` 客户仍然存在,没有出现问题。 正常情况下,如果 `Eureka Server` 在 90 秒没有收到 `Eureka` 客户的续约,它会将实例从其注册表中删除。 结合中介理解:房东 (提供者 `Eureka Client Provider`) 定期告诉中介 (服务器 `Eureka Server`) 我的房子还租(续约) ,中介 (服务器`Eureka Server`) 收到之后继续保留房屋的信息。 -**获取注册列表信息 Fetch Registries**: +**获取注册列表信息 Fetch Registries**: -官方解释:`Eureka` 客户端从服务器获取注册表信息,并将其缓存在本地。客户端会使用该信息查找其他服务,从而进行远程调用。该注册列表信息定期(每30秒钟)更新一次。每次返回注册列表信息可能与 `Eureka` 客户端的缓存信息不同, `Eureka` 客户端自动处理。如果由于某种原因导致注册列表信息不能及时匹配,`Eureka` 客户端则会重新获取整个注册表信息。 `Eureka` 服务器缓存注册列表信息,整个注册表以及每个应用程序的信息进行了压缩,压缩内容和没有压缩的内容完全相同。`Eureka` 客户端和 `Eureka` 服务器可以使用JSON / XML格式进行通讯。在默认的情况下 `Eureka` 客户端使用压缩 `JSON` 格式来获取注册列表的信息。 +官方解释:`Eureka` 客户端从服务器获取注册表信息,并将其缓存在本地。客户端会使用该信息查找其他服务,从而进行远程调用。该注册列表信息定期(每 30 秒钟)更新一次。每次返回注册列表信息可能与 `Eureka` 客户端的缓存信息不同, `Eureka` 客户端自动处理。如果由于某种原因导致注册列表信息不能及时匹配,`Eureka` 客户端则会重新获取整个注册表信息。 `Eureka` 服务器缓存注册列表信息,整个注册表以及每个应用程序的信息进行了压缩,压缩内容和没有压缩的内容完全相同。`Eureka` 客户端和 `Eureka` 服务器可以使用 JSON / XML 格式进行通讯。在默认的情况下 `Eureka` 客户端使用压缩 `JSON` 格式来获取注册列表的信息。 结合中介理解:租客(消费者 `Eureka Client Consumer`) 去中介 (服务器 `Eureka Server`) 那里获取所有的房屋信息列表 (客户端列表 `Eureka Client List`) ,而且租客为了获取最新的信息会定期向中介 (服务器 `Eureka Server`) 那里获取并更新本地列表。 **服务下线 Cancel**: -官方解释:Eureka客户端在程序关闭时向Eureka服务器发送取消请求。 发送请求后,该客户端实例信息将从服务器的实例注册表中删除。该下线请求不会自动完成,它需要调用以下内容:`DiscoveryManager.getInstance().shutdownComponent();` +官方解释:Eureka 客户端在程序关闭时向 Eureka 服务器发送取消请求。 发送请求后,该客户端实例信息将从服务器的实例注册表中删除。该下线请求不会自动完成,它需要调用以下内容:`DiscoveryManager.getInstance().shutdownComponent();` -结合中介理解:房东 (提供者 `Eureka Client Provider`) 告诉中介 (服务器 `Eureka Server`) 我的房子不租了,中介之后就将注册的房屋信息从列表中剔除。 +结合中介理解:房东 (提供者 `Eureka Client Provider`) 告诉中介 (服务器 `Eureka Server`) 我的房子不租了,中介之后就将注册的房屋信息从列表中剔除。 **服务剔除 Eviction**: -官方解释:在默认的情况下,**当Eureka客户端连续90秒(3个续约周期)没有向Eureka服务器发送服务续约,即心跳,Eureka服务器会将该服务实例从服务注册列表删除**,即服务剔除。 +官方解释:在默认的情况下,**当 Eureka 客户端连续 90 秒(3 个续约周期)没有向 Eureka 服务器发送服务续约,即心跳,Eureka 服务器会将该服务实例从服务注册列表删除**,即服务剔除。 -结合中介理解:房东(提供者 `Eureka Client Provider`) 会定期联系 中介 (服务器 `Eureka Server`) 告诉他我的房子还租(续约),如果中介 (服务器 `Eureka Server`) 长时间没收到提供者的信息,那么中介会将他的房屋信息给下架(服务剔除)。 +结合中介理解:房东(提供者 `Eureka Client Provider`) 会定期联系 中介 (服务器 `Eureka Server`) 告诉他我的房子还租(续约),如果中介 (服务器 `Eureka Server`) 长时间没收到提供者的信息,那么中介会将他的房屋信息给下架(服务剔除)。 下面就是 `Netflix` 官方给出的 `Eureka` 架构图,你会发现和我们前面画的中介图别无二致。 @@ -100,7 +98,7 @@ 当然,可以充当服务发现的组件有很多:`Zookeeper` ,`Consul` , `Eureka` 等。 -更多关于 `Eureka` 的知识(自我保护,初始注册策略等等)可以自己去官网查看,或者查看我的另一篇文章 [深入理解 Eureka]()。 +更多关于 `Eureka` 的知识(自我保护,初始注册策略等等)可以自己去官网查看,或者查看我的另一篇文章 [深入理解 Eureka](https://juejin.im/post/5dd497e3f265da0ba7718018)。 ## 负载均衡之 Ribbon @@ -110,7 +108,7 @@ 我不听我不听我不听:hear_no_evil::hear_no_evil::hear_no_evil:。 -我就说一句!**`RestTemplate`是`Spring`提供的一个访问Http服务的客户端类**,怎么说呢?就是微服务之间的调用是使用的 `RestTemplate` 。比如这个时候我们 消费者B 需要调用 提供者A 所提供的服务我们就需要这么写。如我下面的伪代码。 +我就说一句!**`RestTemplate`是`Spring`提供的一个访问 Http 服务的客户端类**,怎么说呢?就是微服务之间的调用是使用的 `RestTemplate` 。比如这个时候我们 消费者 B 需要调用 提供者 A 所提供的服务我们就需要这么写。如我下面的伪代码。 ```java @Autowired @@ -124,11 +122,12 @@ public boolean judge(@RequestBody Request request) { return restTemplate.postForObject(url, request, Boolean.class); } ``` - 如果你对源码感兴趣的话,你会发现上面我们所讲的 `Eureka` 框架中的 **注册**、**续约** 等,底层都是使用的 `RestTemplate` 。 + +如果你对源码感兴趣的话,你会发现上面我们所讲的 `Eureka` 框架中的 **注册**、**续约** 等,底层都是使用的 `RestTemplate` 。 ### 为什么需要 Ribbon? -`Ribbon` 是 `Netflix` 公司的一个开源的负载均衡 项目,是一个客户端/进程内负载均衡器,**运行在消费者端**。 +`Ribbon` 是 `Netflix` 公司的一个开源的负载均衡 项目,是一个客户端/进程内负载均衡器,**运行在消费者端**。 我们再举个:chestnut:,比如我们设计了一个秒杀系统,但是为了整个系统的 **高可用** ,我们需要将这个系统做一个集群,而这个时候我们消费者就可以拥有多个秒杀系统的调用途径了,如下图。 @@ -160,9 +159,9 @@ public boolean judge(@RequestBody Request request) { 负载均衡,不管 `Nginx` 还是 `Ribbon` 都需要其算法的支持,如果我没记错的话 `Nginx` 使用的是 轮询和加权轮询算法。而在 `Ribbon` 中有更多的负载均衡调度算法,其默认是使用的 `RoundRobinRule` 轮询策略。 -* **`RoundRobinRule`**:轮询策略。`Ribbon` 默认采用的策略。若经过一轮轮询没有找到可用的 `provider`,其最多轮询 10 轮。若最终还没有找到,则返回 `null`。 -* **`RandomRule`**: 随机策略,从所有可用的 `provider` 中随机选择一个。 -* **`RetryRule`**: 重试策略。先按照 `RoundRobinRule` 策略获取 `provider`,若获取失败,则在指定的时限内重试。默认的时限为 500 毫秒。 +- **`RoundRobinRule`**:轮询策略。`Ribbon` 默认采用的策略。若经过一轮轮询没有找到可用的 `provider`,其最多轮询 10 轮。若最终还没有找到,则返回 `null`。 +- **`RandomRule`**: 随机策略,从所有可用的 `provider` 中随机选择一个。 +- **`RetryRule`**: 重试策略。先按照 `RoundRobinRule` 策略获取 `provider`,若获取失败,则在指定的时限内重试。默认的时限为 500 毫秒。 🐦🐦🐦 还有很多,这里不一一举:chestnut:了,你最需要知道的是默认轮询算法,并且可以更换默认的负载均衡算法,只需要在配置文件中做出修改就行。 @@ -176,7 +175,7 @@ providerName: ## 什么是 Open Feign -有了 `Eureka` ,`RestTemplate` ,`Ribbon`, 我们就可以愉快地进行服务间的调用了,但是使用 `RestTemplate` 还是不方便,我们每次都要进行这样的调用。 +有了 `Eureka` ,`RestTemplate` ,`Ribbon`, 我们就可以愉快地进行服务间的调用了,但是使用 `RestTemplate` 还是不方便,我们每次都要进行这样的调用。 ```java @Autowired @@ -187,18 +186,18 @@ private static final String SERVICE_PROVIDER_A = "http://localhost:8081"; @PostMapping("/judge") public boolean judge(@RequestBody Request request) { String url = SERVICE_PROVIDER_A + "/service1"; - // 是不是太麻烦了???每次都要 url、请求、返回类型的 + // 是不是太麻烦了???每次都要 url、请求、返回类型的 return restTemplate.postForObject(url, request, Boolean.class); } ``` 这样每次都调用 `RestRemplate` 的 `API` 是否太麻烦,我能不能像**调用原来代码一样进行各个服务间的调用呢?** -:bulb::bulb::bulb:聪明的小朋友肯定想到了,那就用 **映射** 呀,就像域名和IP地址的映射。我们可以将被调用的服务代码映射到消费者端,这样我们就可以 **“无缝开发” **啦。 +:bulb::bulb::bulb:聪明的小朋友肯定想到了,那就用 **映射** 呀,就像域名和 IP 地址的映射。我们可以将被调用的服务代码映射到消费者端,这样我们就可以 **“无缝开发” **啦。 -> `OpenFeign` 也是运行在消费者端的,使用 `Ribbon` 进行负载均衡,所以 `OpenFeign` 直接内置了 `Ribbon`。 +> `OpenFeign` 也是运行在消费者端的,使用 `Ribbon` 进行负载均衡,所以 `OpenFeign` 直接内置了 `Ribbon`。 -在导入了 `Open Feign` 之后我们就可以进行愉快编写 `Consumer` 端代码了。 +在导入了 `Open Feign` 之后我们就可以进行愉快编写 `Consumer` 端代码了。 ```java // 使用 @FeignClient 注解来指定提供者的名字 @@ -229,17 +228,17 @@ public class TestController { ## 必不可少的 Hystrix -### 什么是 Hystrix之熔断和降级 +### 什么是 Hystrix 之熔断和降级 -> 在分布式环境中,不可避免地会有许多服务依赖项中的某些失败。Hystrix是一个库,可通过添加等待时间容限和容错逻辑来帮助您控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点,停止服务之间的级联故障并提供后备选项来实现此目的,所有这些都可以提高系统的整体弹性。 +> 在分布式环境中,不可避免地会有许多服务依赖项中的某些失败。Hystrix 是一个库,可通过添加等待时间容限和容错逻辑来帮助您控制这些分布式服务之间的交互。Hystrix 通过隔离服务之间的访问点,停止服务之间的级联故障并提供后备选项来实现此目的,所有这些都可以提高系统的整体弹性。 总体来说 `Hystrix` 就是一个能进行 **熔断** 和 **降级** 的库,通过使用它能提高整个系统的弹性。 -那么什么是 熔断和降级 呢?再举个:chestnut:,此时我们整个微服务系统是这样的。服务A调用了服务B,服务B再调用了服务C,但是因为某些原因,服务C顶不住了,这个时候大量请求会在服务C阻塞。 +那么什么是 熔断和降级 呢?再举个:chestnut:,此时我们整个微服务系统是这样的。服务 A 调用了服务 B,服务 B 再调用了服务 C,但是因为某些原因,服务 C 顶不住了,这个时候大量请求会在服务 C 阻塞。 -服务C阻塞了还好,毕竟只是一个系统崩溃了。但是请注意这个时候因为服务C不能返回响应,那么服务B调用服务C的的请求就会阻塞,同理服务B阻塞了,那么服务A也会阻塞崩溃。 +服务 C 阻塞了还好,毕竟只是一个系统崩溃了。但是请注意这个时候因为服务 C 不能返回响应,那么服务 B 调用服务 C 的的请求就会阻塞,同理服务 B 阻塞了,那么服务 A 也会阻塞崩溃。 > 请注意,为什么阻塞会崩溃。因为这些请求会消耗占用系统的线程、IO 等资源,消耗完你这个系统服务器不就崩了么。 @@ -255,9 +254,9 @@ public class TestController { 所谓 **熔断** 就是服务雪崩的一种有效解决方案。当指定时间窗内的请求失败率达到设定阈值时,系统将通过 **断路器** 直接将此请求链路断开。 -也就是我们上面服务B调用服务C在指定时间窗内,调用的失败率到达了一定的值,那么 `Hystrix` 则会自动将 服务B与C 之间的请求都断了,以免导致服务雪崩现象。 +也就是我们上面服务 B 调用服务 C 在指定时间窗内,调用的失败率到达了一定的值,那么 `Hystrix` 则会自动将 服务 B 与 C 之间的请求都断了,以免导致服务雪崩现象。 -其实这里所讲的 **熔断** 就是指的 `Hystrix` 中的 **断路器模式** ,你可以使用简单的 `@HystrixCommand` 注解来标注某个方法,这样 `Hystrix` 就会使用 **断路器** 来“包装”这个方法,每当调用时间超过指定时间时(默认为1000ms),断路器将会中断对这个方法的调用。 +其实这里所讲的 **熔断** 就是指的 `Hystrix` 中的 **断路器模式** ,你可以使用简单的 `@HystrixCommand` 注解来标注某个方法,这样 `Hystrix` 就会使用 **断路器** 来“包装”这个方法,每当调用时间超过指定时间时(默认为 1000ms),断路器将会中断对这个方法的调用。 当然你可以对这个注解的很多属性进行设置,比如设置超时时间,像这样。 @@ -270,7 +269,7 @@ public List getXxxx() { } ``` -但是,我查阅了一些博客,发现他们都将 **熔断** 和 **降级** 的概念混淆了,以我的理解,**降级是为了更好的用户体验,当一个方法调用异常时,通过执行另一种代码逻辑来给用户友好的回复**。这也就对应着 `Hystrix` 的 **后备处理** 模式。你可以通过设置 `fallbackMethod` 来给一个方法设置备用的代码逻辑。比如这个时候有一个热点新闻出现了,我们会推荐给用户查看详情,然后用户会通过id去查询新闻的详情,但是因为这条新闻太火了(比如最近什么*易对吧),大量用户同时访问可能会导致系统崩溃,那么我们就进行 **服务降级** ,一些请求会做一些降级处理比如当前人数太多请稍后查看等等。 +但是,我查阅了一些博客,发现他们都将 **熔断** 和 **降级** 的概念混淆了,以我的理解,**降级是为了更好的用户体验,当一个方法调用异常时,通过执行另一种代码逻辑来给用户友好的回复**。这也就对应着 `Hystrix` 的 **后备处理** 模式。你可以通过设置 `fallbackMethod` 来给一个方法设置备用的代码逻辑。比如这个时候有一个热点新闻出现了,我们会推荐给用户查看详情,然后用户会通过 id 去查询新闻的详情,但是因为这条新闻太火了(比如最近什么\*易对吧),大量用户同时访问可能会导致系统崩溃,那么我们就进行 **服务降级** ,一些请求会做一些降级处理比如当前人数太多请稍后查看等等。 ```java // 指定了后备方法调用 @@ -279,16 +278,16 @@ public List getXxxx() { public News getNews(@PathVariable("id") int id) { // 调用新闻系统的获取新闻api 代码逻辑省略 } -// +// public News getHystrixNews(@PathVariable("id") int id) { // 做服务降级 // 返回当前人数太多,请稍后查看 } ``` -### 什么是Hystrix之其他 +### 什么是 Hystrix 之其他 -我在阅读 《Spring微服务实战》这本书的时候还接触到了一个 **舱壁模式** 的概念。在不使用舱壁模式的情况下,服务A调用服务B,这种调用默认的是 **使用同一批线程来执行** 的,而在一个服务出现性能问题的时候,就会出现所有线程被刷爆并等待处理工作,同时阻塞新请求,最终导致程序崩溃。而舱壁模式会将远程资源调用隔离在他们自己的线程池中,以便可以控制单个表现不佳的服务,而不会使该程序崩溃。 +我在阅读 《Spring 微服务实战》这本书的时候还接触到了一个 **舱壁模式** 的概念。在不使用舱壁模式的情况下,服务 A 调用服务 B,这种调用默认的是 **使用同一批线程来执行** 的,而在一个服务出现性能问题的时候,就会出现所有线程被刷爆并等待处理工作,同时阻塞新请求,最终导致程序崩溃。而舱壁模式会将远程资源调用隔离在他们自己的线程池中,以便可以控制单个表现不佳的服务,而不会使该程序崩溃。 具体其原理我推荐大家自己去了解一下,本篇文章中对 **舱壁模式** 不做过多解释。当然还有 **`Hystrix` 仪表盘**,它是**用来实时监控 `Hystrix` 的各项指标信息的**,这里我将这个问题也抛出去,希望有不了解的可以自己去搜索一下。 @@ -296,9 +295,9 @@ public News getHystrixNews(@PathVariable("id") int id) { > ZUUL 是从设备和 web 站点到 Netflix 流应用后端的所有请求的前门。作为边界服务应用,ZUUL 是为了实现动态路由、监视、弹性和安全性而构建的。它还具有根据情况将请求路由到多个 Amazon Auto Scaling Groups(亚马逊自动缩放组,亚马逊的一种云计算方式) 的能力 -在上面我们学习了 `Eureka` 之后我们知道了 *服务提供者* 是 *消费者* 通过 `Eureka Server` 进行访问的,即 `Eureka Server` 是 *服务提供者* 的统一入口。那么整个应用中存在那么多 *消费者* 需要用户进行调用,这个时候用户该怎样访问这些 *消费者工程* 呢?当然可以像之前那样直接访问这些工程。但这种方式没有统一的消费者工程调用入口,不便于访问与管理,而 Zuul 就是这样的一个对于 *消费者* 的统一入口。 +在上面我们学习了 `Eureka` 之后我们知道了 _服务提供者_ 是 _消费者_ 通过 `Eureka Server` 进行访问的,即 `Eureka Server` 是 _服务提供者_ 的统一入口。那么整个应用中存在那么多 _消费者_ 需要用户进行调用,这个时候用户该怎样访问这些 _消费者工程_ 呢?当然可以像之前那样直接访问这些工程。但这种方式没有统一的消费者工程调用入口,不便于访问与管理,而 Zuul 就是这样的一个对于 _消费者_ 的统一入口。 -> 如果学过前端的肯定都知道 Router 吧,比如 Flutter 中的路由,Vue,React中的路由,用了 Zuul 你会发现在路由功能方面和前端配置路由基本是一个理。:smile: 我偶尔撸撸 Flutter。 +> 如果学过前端的肯定都知道 Router 吧,比如 Flutter 中的路由,Vue,React 中的路由,用了 Zuul 你会发现在路由功能方面和前端配置路由基本是一个理。:smile: 我偶尔撸撸 Flutter。 大家对网关应该很熟吧,简单来讲网关是系统唯一对外的入口,介于客户端与服务器端之间,用于对请求进行**鉴权**、**限流**、 **路由**、**监控**等功能。 @@ -332,7 +331,7 @@ emmm,信息量有点大,我来解释一下。关于前面的知识我就不 拿到这些元数据有什么好处呢?拿到了我们是不是直接可以做**路由映射**?比如原来用户调用 `Consumer1` 的接口 `localhost:8001/studentInfo/update` 这个请求,我们是不是可以这样进行调用了呢?`localhost:9000/consumer1/studentInfo/update` 呢?你这样是不是恍然大悟了? -> 这里的url为了让更多人看懂所以没有使用 restful 风格。 +> 这里的 url 为了让更多人看懂所以没有使用 restful 风格。 上面的你理解了,那么就能理解关于 `Zuul` 最基本的配置了,看下面。 @@ -370,7 +369,7 @@ zuul: consumer2: /FrancisQ2/** ``` -这个时候你就可以使用 ` `localhost:9000/zuul/FrancisQ1/studentInfo/update` 进行访问了。 +这个时候你就可以使用 ``localhost:9000/zuul/FrancisQ1/studentInfo/update` 进行访问了。 #### 服务名屏蔽 @@ -392,15 +391,15 @@ zuul: 这样关于 auto 的请求我们就可以过滤掉了。 -> ** 代表匹配多级任意路径 +> \*\* 代表匹配多级任意路径 > -> *代表匹配一级任意路径 +> \*代表匹配一级任意路径 #### 敏感请求头屏蔽 默认情况下,像 `Cookie`、`Set-Cookie` 等敏感请求头信息会被 `zuul` 屏蔽掉,我们可以将这些默认屏蔽去掉,当然,也可以添加要屏蔽的请求头。 -### Zuul 的过滤功能 +### Zuul 的过滤功能 如果说,路由功能是 `Zuul` 的基操的话,那么**过滤器**就是 `Zuul`的利器了。毕竟所有请求都经过网关(Zuul),那么我们可以进行各种过滤,这样我们就能实现 **限流**,**灰度发布**,**权限控制** 等等。 @@ -447,8 +446,6 @@ public class PreRequestFilter extends ZuulFilter { } ``` - - ```java // lombok的日志 @Slf4j @@ -553,13 +550,13 @@ public class RouteFilter extends ZuulFilter { 这样我们就能将请求数量控制在一秒两个,有没有觉得很酷? -### 关于 Zuul 的其他 +### 关于 Zuul 的其他 `Zuul` 的过滤器的功能肯定不止上面我所实现的两种,它还可以实现 **权限校验**,包括我上面提到的 **灰度发布** 等等。 当然,`Zuul` 作为网关肯定也存在 **单点问题** ,如果我们要保证 `Zuul` 的高可用,我们就需要进行 `Zuul` 的集群配置,这个时候可以借助额外的一些负载均衡器比如 `Nginx` 。 -##Spring Cloud配置管理——Config +## Spring Cloud 配置管理——Config ### 为什么要使用进行配置管理? @@ -589,7 +586,7 @@ public class RouteFilter extends ZuulFilter { 什么?那怎么进行动态修改配置文件呢?这不是出现了 **配置漂移** 吗?你个渣男:rage:,你又骗我! -别急嘛,你可以使用 `Webhooks` ,这是 `github` 提供的功能,它能确保远程库的配置文件更新后客户端中的配置信息也得到更新。 +别急嘛,你可以使用 `Webhooks` ,这是 `github` 提供的功能,它能确保远程库的配置文件更新后客户端中的配置信息也得到更新。 噢噢,这还差不多。我去查查怎么用。 @@ -613,12 +610,12 @@ public class RouteFilter extends ZuulFilter { 这篇文章中我带大家初步了解了 `Spring Cloud` 的各个组件,他们有 -* `Eureka` 服务发现框架 -* `Ribbon` 进程内负载均衡器 -* `Open Feign` 服务调用映射 -* `Hystrix` 服务降级熔断器 -* `Zuul` 微服务网关 -* `Config` 微服务统一配置中心 -* `Bus` 消息总线 +- `Eureka` 服务发现框架 +- `Ribbon` 进程内负载均衡器 +- `Open Feign` 服务调用映射 +- `Hystrix` 服务降级熔断器 +- `Zuul` 微服务网关 +- `Config` 微服务统一配置中心 +- `Bus` 消息总线 如果你能这个时候能看懂文首那张图,也就说明了你已经对 `Spring Cloud` 微服务有了一定的架构认识。 diff --git a/docs/system-design/system-design-questions.md b/docs/system-design/system-design-questions.md index 6b7f13c9..76c77f69 100644 --- a/docs/system-design/system-design-questions.md +++ b/docs/system-design/system-design-questions.md @@ -13,12 +13,11 @@ category: Java面试指北 ![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211231206733.png) -专属面试小册/一对一交流/简历修改/专属求职指南,欢迎加入我的[知识星球](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)!。 +如果你需要专属面试小册/一对一交流/简历修改/专属求职指南/学习打卡,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc) (一定要确定自己真的需要再加入,一定要看完详细介绍之后再加我)。 星球目前的定价为 **159/年**,即将调整为 **199/年**。如果的认可 JavaGuide,相信我,并且需要星球提供的专属服务,那欢迎你加入我的星球。你可以添加我的私人微信领取星球专属优惠券,限时 **100/年** 加入。一定要备注“**星球优惠券**”! ![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/xingqiu/image-20220211231926486.png) -**用心做内容,不割韭菜。加油!!!** +**用心做内容,真心希望帮助到你,拒绝知识付费割韭菜。加油!!!** -知识星球详细介绍请看(一定一定一定确定自己真的需要再加入,一定一定要看完详细介绍之后再加我):[https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)。 \ No newline at end of file