未分类

在线导航

《林老师带你学编程》知识星球是由多个工作10年以上的一线大厂开发人员联合创建,希望通过我们的分享,帮助大家少走弯路,可以在技术的领域不断突破和发展。

🔥 具体的加入方式:

一、在线教程

首先列出少量在线教程网站,这些在线教程网站通常都比较适合入门,可以作为开发学习路上的第一个阶梯,也可以作为工作中的在线文档。

1、how2j.cn

地       址:how2j.cn

简       介:一个Java全栈开发教程网站,内容全面,简洁易懂,非常适合入门。

推荐指数:⭐⭐⭐⭐⭐

2、w3cschool

地       址:w3cschool

简       介:前台和脚本语言为主的在线教程网站,前台的内容非常不错。

推荐指数:⭐⭐⭐⭐⭐

3、菜鸟教程

地       址:菜鸟教程

简       介:和w3cschool相似的在线教程网站,前台学习看这两个网站就够了。

推荐指数:⭐⭐⭐⭐⭐

4、易百教程

地       址:易百教程

简       介:内容比较全面的在线教程网站。

推荐指数:⭐⭐⭐

5、码农教程

地       址:码农教程

简       介:大量IT编程入门教程(JAVA, PHP, JAVASCRIPT, C, C++, HTML, CSS等)。

推荐指数:⭐⭐⭐

6、简单教程

地       址:简单教程

简       介:大量IT编程入门教程(前台、手机端、Java、.net等)。

推荐指数:⭐⭐⭐

7、Break易站

地       址:Break易站

简       介:比较多的编程教程(Java、前台、服务端部署等)。

推荐指数:⭐⭐⭐

8、C语言中文网

地       址:C语言中文网

简       介:以C语言为主,也包含数据结构、C++、Linux等。

推荐指数:⭐⭐

9、并发编程网

地       址:并发编程网

简       介:比较不错的技术网站,以Java为主,关注并发、NIO、JVM、框架等方面的内容。

推荐指数:⭐⭐

10、jenkov.com

地       址:jenkov.com

简       介:一个国外的技术网站,提供了非常不错的Java教程。

推荐指数:⭐⭐⭐

11、baeldung.com

地       址:baeldung.com

简       介:也是一个国外的技术网站,提供了非常不错的Java教程。

推荐指数:⭐⭐⭐

二、视频教程

上面的在线教程网站以文字性内容为主,同样收藏了少量以视频为主的少量网站,相比较而言,更容易上手,当然,也更加耗时间。

1、B站

地       址:bilibili

简       介:没错,bilibili也可以用来学习,除了番剧、鬼畜之外,b站同样有非常多的高质量的编程教学视频,搜索就行了。

推荐指数:⭐⭐⭐⭐⭐

2、慕课网

地       址:慕课网

简       介:比较不错的编程视频教学网站,可以找到比较体系的东西,当然,有些内容要花钱就是了。

推荐指数:⭐⭐⭐⭐

3、中国大学MOOC

地       址:中国大学MOOC

简       介:有很多名校的课程,当然不止CS。

推荐指数:⭐⭐⭐⭐

4、网易云课堂

地       址:网易云课堂

简       介:有少量计算机编程方面的视频教程。

推荐指数:⭐⭐⭐

5、试验楼

地       址:试验楼

简       介:IT技术课程网站。

推荐指数:⭐⭐

6、我要自学网

地       址:(敏感词,自行百度)

简       介:比较多的自学教程,有程序设计内容的分类。

推荐指数:⭐⭐

7、大学生自学网

地       址:大学生自学网

简       介:有少量计算机软件的大学课程。

推荐指数:⭐⭐

8、极客学院

简       介:IT编程课程网站,付费内容居多。

地       址:极客学院

推荐指数:⭐⭐

三、电子书

学习编程,有些书是必需要看的,例如博主是学Java的,《Java编程思想》、《Java核心技术》等等少量经典书籍是不可绕过的。实体书就不多说了,某宝、某东等等电商平台都能买到。假如是想做少量笔记或者者不方便携带纸质书的时候,电子书是个不错的选择。(有条件请支持实体书)

1、图灵社区

地       址:图灵社区

简       介:书籍比较全面的图书社区,电子书的价格是纸质书的一半。

推荐指数:⭐⭐⭐

2、博文视点

地       址:博文视点

简       介:博文视点也是有少量好书的。

推荐指数:⭐⭐

3、书栈网

地       址:书栈网

简       介:电子书门类比较全,支持在线查看和下载。

推荐指数:⭐⭐⭐⭐

4、脚本之家

地       址:脚本之家

简       介:脚本之家电子书区有不少电子书,需要关注公众号。

推荐指数:⭐⭐⭐

5、Java知识分享网

地       址:Java知识分享网

简       介:如网站名字,主要分享Java知识,电子书一般不会挂太久,删的比较快。

推荐指数:⭐⭐⭐

6、码农之家

地       址:码农之家

简       介:比较多的电子书,下载需要关注公众号。

推荐指数:⭐⭐⭐

7、绿色资源网

地       址:绿色资源网

简       介:以软件下载为主,也有不少编程电子书,搜索就行了。

推荐指数:⭐⭐⭐

8、鸠摩搜书

地       址:鸠摩搜书

简       介:比较不错的图书搜索引擎。

推荐指数:⭐⭐⭐

9、计算机书籍控

地       址:计算机书籍控

简       介:有数百本编程电子书。

推荐指数:⭐⭐

10、淘链客

地       址:淘链客

简       介:可以搜索电子书下载链接。

推荐指数:⭐⭐

11、hello girl

地       址:hello girl

简       介:有不少电子书资源的网站。

推荐指数:⭐⭐

12、工联信息网

地       址:工联信息网

简       介:有很多优质的技术资料。

推荐指数:⭐⭐

13、it熊猫

地       址:it熊猫

简       介:有数百本技术书籍。

推荐指数:⭐⭐

14、极客图书

地       址:极客图书

简       介:可观的技术书籍资源。

推荐指数:⭐⭐⭐

15、搬书匠

地       址:搬书匠

简       介:可观的技术书籍资源。

推荐指数:⭐⭐⭐

16、ai books

地       址:ai books

简       介:比较多的开发技术图书。

推荐指数:⭐⭐⭐

17、爱分享电子书

地       址:爱分享电子书

简       介:比较多的计算机、软件书籍。

推荐指数:⭐⭐

有条件请支持正规渠道实体书籍!

四、官网

毫无疑问,一项技术,最权威的文档肯定是它的官方文档,所有的教程、书籍都是直接或者者间接在官方相关文档的基础上完成。所以,编程学习,后面最好还是要看官网的。当然,官网大部分都是英文——其实配合少量翻译插件,没有想象中的那么难。

1、Java

地       址:Java|Oracle 、Java官方API

简       介:这个不需要多详情,Java官网和Java官方API。

推荐指数:⭐⭐⭐⭐⭐

2、Spring

地       址:Spring

简       介:毫无疑问Spring已经成为Java EE事实上的标准。

推荐指数:⭐⭐⭐⭐⭐

3、MySQL

地       址:MySQL

简       介:MySQL官网

推荐指数:⭐⭐⭐⭐

4、MyBatis

地       址:mybatis中文文档

简       介:国内最流行的Java持久层框架,而且幸运的是,MyBatis文档是有中文版的。

推荐指数:⭐⭐⭐⭐

5、Vue.js

地       址:Vue.js

简       介:国内最流行的前台SOP框架,Vue.js的文档是中文的。😀

推荐指数:⭐⭐⭐⭐

6、Linux

地       址:Linux

简       介:后台程序员必会的Linux.

推荐指数:⭐⭐⭐⭐

7、Git

地       址:Git

简       介:版本管理推荐用Git,同样有中文版本的文档。

推荐指数:⭐⭐⭐⭐

8、Dubbo

地       址:Dubbo

简       介:一款高性能的Java RPC框架,国内用的还是比较广泛,源于阿里,中文文档是有的。

推荐指数:⭐⭐⭐⭐

9、Redis

地       址:Redis

简       介:最流行的No SQL数据库。

推荐指数:⭐⭐⭐⭐

五、国内博客社区

理解技术动态、处理各种问题都会用到技术博客。有些优质博主同样创作了少量比较优秀的技术教程。

1、csdn

地       址:csdn

简       介:最大的中文技术博客社区,内容最多,SEO做的也不错。

推荐指数:⭐⭐⭐

2、博客园

地       址:博客园

简       介:老牌中文技术博客社区,博客质量比较高,商业化气息也比较淡,之前广为诟病的UI风格也在今年进行了改进,自己设置主题也让能让博客百花争艳。

推荐指数:⭐⭐⭐⭐⭐

3、掘金

地       址:掘金

简       介:UI做的最漂亮的中文技术博客社区,内容以前台和面试居多。

推荐指数:⭐⭐⭐⭐

4、简书

地       址:简书

简       介:并不是纯粹的技术博客社区,很多伤春悲秋的东西。

推荐指数:⭐⭐⭐

5、思否

地       址:思否

简       介:包含博客、问答的技术社区。

推荐指数:⭐⭐⭐

6、开源中国

地       址:开源中国

简       介:一个技术博客社区。

推荐指数:⭐⭐⭐

7、51CTO.COM

地       址: 51CTO.COM

简       介:一个IT技术网站。

推荐指数:⭐⭐

8、V2EX

简       介:逼格很高,只支持谷歌邮箱登录。

地       址: V2EX

推荐指数:⭐⭐

9、腾讯云社区

地       址: 腾讯云社区

简       介:腾讯云的开发者社区。

推荐指数:⭐⭐⭐

10、阿里云社区

地       址: 阿里云社区

简       介:阿里云的开发者社区。

推荐指数:⭐⭐⭐

11、开发者头条

地       址: 开发者头条

简       介:一个程序员分享平台。

推荐指数:⭐⭐

12、GitChat

地       址:GitChat

简       介:一个技术博客社区

推荐指数:⭐⭐

13、知乎

地       址: 知乎

简       介:知乎是个综合性的问答社区,但是聚集的程序员也比较多,有少量高质量的问答和专栏。

推荐指数:⭐⭐⭐

六、国外技术博客社区

上面详情了少量国内的博客社区,事实上,放眼看世界也很重要,毕竟我们用的技术大部分都来自国外。当然,其实更加建议想办法访问谷歌,个人觉得一个谷歌足矣。

1、Stack Overflow

地       址: Stack Overflow

简       介:全球最活跃的程序员技术问答交流社区,有人说程序员的所有问题都能在上面找到答案。

推荐指数:⭐⭐⭐⭐⭐

2、dev.io

地       址: dev.io

简       介:可以说是掘金的国外版。

推荐指数:⭐⭐⭐⭐

3、DZone

地       址: DZone

简       介:DZone.com是世界上最大的在线社区之一。

推荐指数:⭐⭐⭐

4、Bytes

地       址: Bytes

简       介:一个面向开发人员和IT专业人员的交流社区。

推荐指数:⭐⭐⭐

5、Google Developers

地       址: Google Developers

简       介:google开发社区。

推荐指数:⭐⭐⭐

七、小微型博客

上面列出的博客都是比较大型、综合的博客社区,实际上还有很多比较优质某个技术分类的博客、大厂技术博客、小而美的个人博客。这些博客可能也会发布到各大博客社区,但是这些博客网站风格不一,各有个性,也是很值得单独拿出来看的。

1、美团技术团队

地       址: 美团技术团队

简       介:美团技术团队的博客,干货满满。

推荐指数:⭐⭐⭐⭐⭐

2、阮一峰的网络日志

地       址: 阮一峰的网络日志

简       介:大神阮一峰,博客风格真正做到深入浅出。

推荐指数:⭐⭐⭐⭐⭐

3、Spring Boot中文导航

地       址: Spring Boot中文导航

简       介:汇总了少量比较优秀的Spring Boot博客、开源作品等。

推荐指数:⭐⭐⭐⭐

4、Spring Cloud中文导航

地       址: Spring Cloud中文导航

简       介:汇总了少量比较优秀的Spring Cloud 博客、开源作品等。

推荐指数:⭐⭐⭐⭐

上面两个索引里已经有了少量比较优秀的个人博主的相关博客地址,所以里面出现的个人博客,后面就不再列出了。

5、Web前台导航

地       址: Web前台导航

简       介:比较全的Web前台导航,包括 团队组织 、开发社区 、 前台门户、框架类库 等等网站的导航。

推荐指数:⭐⭐⭐⭐

6、Spring For All

地       址: Spring For All

简       介:目标是做最专业的的民间Sptng组织。

推荐指数:⭐⭐⭐⭐

7、廖雪峰的官方网站

地       址: 廖雪峰的官方网站

简       介:廖雪峰老师的网站,有少量不错的入门教程。

推荐指数:⭐⭐⭐

8、bugstack

地       址: bugstack

简       介:博主是京东架构师,产出非常丰富,包括框架、源码、设计模式等。

推荐指数:⭐⭐⭐

9、Java技术驿站

地       址: Java技术驿站

简       介:有很多不错的Java系列文章。

推荐指数:⭐⭐⭐

10、酷壳

地       址: 酷壳

简       介:可以理解陈皓,是个很有个性的人。

推荐指数:⭐⭐⭐

11、床长人工智能教程

地       址: 床长人工智能教程

简       介:不搞人工智能也可以看看,写的很有意思的教程,可以作为科普看看。

推荐指数:⭐⭐⭐

12、五分钟学算法

地       址: 五分钟学算法

简       介:有少量非常不错的数据结构、算法相关的内容。

推荐指数:⭐⭐⭐

13、犬小哈教程网

地       址: 犬小哈教程网

简       介:少量哈士奇的技术问答漫画很有意思。

推荐指数:⭐⭐⭐

15、原创技术大联盟

地       址: 原创技术大联盟

简       介:优秀的技术博主实在太多了,列不完,也看不完,这里有一个导航页,有上百个优秀博主的博客链接,感兴趣的按需去找吧。

推荐指数:⭐⭐⭐

八、开源社区

在学习的过程中,可以学习开源社区的优秀项目,也可以把自己的项目发布到开源社区。

1、GitHub

地       址: GitHub

简       介:全球最大开源社区,被戏称为全球最大同性交友网站。

推荐指数:⭐⭐⭐⭐⭐

2、码云

地       址: 码云

简       介:可以看做GitHub的国内版,GitHub虽好,但GitHub服务器在美国,网络方面main一直是个问题,这种情况下,码云是个不错的替代者。

推荐指数:⭐⭐⭐⭐

九、面试刷题

1、LeetCode

地       址: LeetCode

简       介:经典的刷题网站,主要是算法题。

推荐指数:⭐⭐⭐⭐⭐

2、LintCode

地       址: LintCode

简       介:和LeetCode相似

推荐指数:⭐⭐⭐⭐

3、牛客网

地       址: 牛客网

简       介:一个联网求职学习交流社区。

推荐指数:⭐⭐⭐⭐

最后

我目前从事Java开发,给各位Java程序员推荐一下干货知识点和聚集地。在学习过程中,我喜欢找少量电子书,视频结合起来学习

开源框架集合

《林老师带你学编程》知识星球是由多个工作10年以上的一线大厂开发人员联合创建,希望通过我们的分享,帮助大家少走弯路,可以在技术的领域不断突破和发展。

🔥 具体的加入方式:

导入 ja-netfilter.jar 后输入激活码提示 Key is invalid 原因汇总

《林老师带你学编程》知识星球是由多个工作10年以上的一线大厂开发人员联合创建,希望通过我们的分享,帮助大家少走弯路,可以在技术的领域不断突破和发展。

🔥 具体的加入方式:

JetBrains 系列产品(IDEA、Pycharm 等)使用本站破解教程 (不论是执行激活脚本自动引入破解补丁,还是手动引入补丁),在输入激活码时,部分小伙伴反应说提示 Key is invalid 无法激活, 如下图所示:

Jetbrains 产品输入激活码提示 key is invalidJetbrains 产品输入激活码提示 key is invalid

导致 Key is invalid 可能的原因汇总

这边汇总了小伙伴们反馈给我的,可能导致 Key is invalid 的原因,总之,五花八门,可对照查看是否犯有同样的错误:

1、请勿登录 JetBrains 账号

使用本站教程的破解补丁,切记无需登录 JetBrains 账号:

使用破解补丁,无需登录 JetBrains 账号使用破解补丁,无需登录 JetBrains 账号

2、安装过老版本 IDE, 但是未卸载干净

安装过老版本 IDE,但是没有卸载干净,这其中包括一些缓存目录、注册表未删除干净,可能会导致出现 key is invalid, 这里拿 IDEA 举例,其他如 Pycharm 、Webstorm 等也会出现这样的情况。

此情况笔者在 Mac Intel 芯片电脑上安装 IDEA 就亲身踩坑了,因为 IDEA 没卸载干净,导致无法激活成功,彻底卸载 IDEA 后,再重新按教程来就激活成功了。

3、确认激活脚本是否执行成功?

部分小伙伴使用的 激活脚本 + 激活码(全自动模式) 这种方式,执行脚本后,提示 Done 才表示成功:

补丁执行成功后,提示 Done补丁执行成功后,提示 Done

执行脚本后,会添加相关环境变量,比如 IDEA 会添加 IDEA_VM_OPTIONS, 如下图所示:

以及在 /jetbra/vmoptions 文件夹中对应的 .vmoptions 配置文件中引入破解补丁的绝对路径,比如,你要激活的是 IDEA,那么会在对应的 idea.vmoptions 文件中引入补丁,如下图所示:

所以,上面两点都需要确认是否正确添加,成功添加了,才表示脚本执行成功了,另外,补丁路径不能包含中文以及空格等特殊字符

4、只单独引用了破解补丁,其他相关破解文件丢失了

部分小伙伴使用的 破解补丁 + 激活码(手动引用补丁) 这种方式,结果不仔细看教程,激活过程中只单独复制了 ja-netfilter.jar 一个文件,结果输入激活码时报 Key is invalid注意是所在的整个文件夹都需要复制,然后再引用补丁,而不是仅仅复制一个 ja-netfilter.jar 文件

5、引用格式不正确

注意,使用手动引用破解补丁这种方式的,配置文件中,引用补丁必须以 -javaagent: 开头,后面跟着补丁的绝对路径,开头不能丢,否则无法引用破解补丁成功;

6、路径中包含空格和中文

检查引用的补丁路径中不能包含空格和中文,需要全英文才行

7、重启大法好

部分小伙伴反馈说重启系统后,才激活成功的,这种法子也可以尝试一下;

8、补丁位置被挪动

检查破解补丁的位置是否动了,切记不要乱动,不然重启 IDE 又找不到补丁位置了,自然就失败了;

9、补丁未使用公众号最新的补丁

还有这种情况:有的小伙伴之前通过本站激活成功了,想破解最新版本的 IDE, 因为不知道补丁已经换了,虽然补丁名字一样,于是没换补丁,只重新输入了激活码,结果显示 Key is invalid请使用公众号最新补丁,虽然补丁名字可能一样

10、IDE 版本太老

笔者测试都是拿最新的几个版本,有的小伙伴使用的还是比较老的版本,补丁用在老版本上大概率是不行的。笔者亲测的版本 2022.2.32022.2.22022.1 都是可以的,确认你的版本号是否是最新的这些版本,太老的版本请升级。

11、尝试降低一个小版本试试

部分群里小伙伴反馈说,下载了小版本的 IDE, 再使用教程才 OK 了,比如 2022.2.3 版本降低到 2022.2.2 或者 2022.2.1 等小一点的版本,这种方法也可尝试一下~

12、检查复制激活码时,是否缺漏

详细检查复制激活码的时候,是否缺漏,激活码是固定的,少一个字母都不行。

IDEA 2023.3.4 破解版安装教程(最新激活码,亲测有效)

《林老师带你学编程》知识星球是由多个工作10年以上的一线大厂开发人员联合创建,希望通过我们的分享,帮助大家少走弯路,可以在技术的领域不断突破和发展。

🔥 具体的加入方式:

申明:本教程 IntelliJ IDEA 破解补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版 !

PS: 本教程最新更新时间: 2024 年 2 月 14 日, 网站持续更新,收藏本站防失联哟~

前言

还在老家过年中,IDEA 就偷偷升级了一个小版本。又回到老话题,2023.3.4 这个版本是否还能破解,笔者也亲测了一下。还是沿用本站之前的破解方式,亲测依然有效,可以破解到 2025 年(实际是永久激活,只是这样会低调一些,防止被官方针对),无图无真相,下面是我破解成功的截图:

废话不多说,开始今天的IDEA破解教程~

  • 👉激活脚本 + 激活码(全自动模式)即本文教程所写,这种方法适合最新的几个版本,具体步骤跟着本文教程一步一步来,运行一下激活脚本,一分钟即可搞定,超级简单。无图无真相,下面是我激活成功后的截图:

说明

  • 本教程适用于 JetBrains 全系列产品,包括 IDEA、Pycharm、WebStorm、Phpstorm、Datagrip、RubyMine、CLion、AppCode 等。
  • 本教程适用 Windows/Mac/Linux 系统,文中以 Windows 系统为例做讲解,其他系统同样参考着本教程来就行。

第一步:下载 IDEA 安装包

访问 IDEA 官网,下载 IDEA 2023.3.4 版本的安装包,下载链接如下 :

https://www.jetbrains.com/idea/download/

打开页面后,点击 Download 按钮, 等待 IDEA 专业版下载完毕。

第二步:卸载老版本 IDEA(未安装则不用管,跳过看下面步骤)

注意,安装新版本 IDEA 之前,如果本机安装过老版本的 IDEA, 需要先彻底卸载,以免两者冲突,导致破解失败。

破解之前,先卸载老版本 IDEA

卸载完成后,点击 Close 按钮关闭弹框:

卸载 IDEA 完成

第三步:安装 IDEA 2023.3.4 版本

卸载老版本 IDEA 完成后,双击刚刚下载好的 IDEA 2023.3.4 版本安装包。弹框会提示选择安装路径,我这里直接选择的默认安装路径

C:\Program Files\JetBrains\IntelliJ IDEA 2023.3.4 , 然后点击 Next 按钮:

安装 IDEA 2023.3.4 版本

然后,勾选 Create Desktop Shortcut 创建 IDEA 桌面快捷启动方式,以方便后面快速打开 IDEA,再点击 Next 按钮 :

开始安装 IDEA 2023.3.4 版本:创建快捷启动图标

点击 Install 按钮,开始安装:

开始安装 IDEA 2023.3.4 版本:点击 Install 按钮

等待安装完成后,勾选 Run IntellJ IDEA, 点击 Finish 按钮即运行 IDEA :

安装 IDEA 2023.3.4 版本成功

IDEA 运行成功后,会弹出如下对号框,强制用户需要先登录 JetBrains 账户才能使用:

IDEA 2023.3.4 版本提示需要先登录 JetBrains 账户

不用管登录的事,点击 Exit 按钮退出对话框,准备开始破解激活。

第四步:破解补丁下载

破解补丁我放置在了网盘中,提供了多个备用链接,以防下载失效。

提示:破解补丁的网盘链接文末获取 ~

提示:破解补丁的网盘链接文末获取 ~

补丁下载成功后,记得先解压, 解压后的目录如下, 本文后面所需补丁都在下面标注的这个文件夹中

点击【方式 3】文件夹 , 进入到文件夹 /jetbra,目录如下:

第五步:开始破解

Windows 系统

将上面图示的补丁的所属文件夹 /jetbra 复制电脑某个位置,笔者这里放置到了 D:/ 盘根目录下:

注意: 补丁所属文件夹需单独存放,且放置的路径不要有中文与空格,以免 IDEA 读取补丁错误。

点击进入 /jetbra 补丁目录,再点击进入 /scripts 文件夹,双击执行 install-current-user.vbs 破解脚本:

注意:如果执行脚本被安全软件提示有风险拦截,允许执行即可。

IDEA 破解脚本执行后弹框提示信息

会提示安装补丁需要等待数秒。点击【确定】按钮后,过程大概 10 – 30 秒,如看到弹框提示 Done 时,表示激活破解成功:

补丁执行成功后,提示 Done

Mac / Linux 系统

Mac / Linux 系统与上面 Windows 系统一样,需将补丁所属文件 /jetbra 复制到某个路径,且路径不能包含空格与中文

之后,打开终端,进入到 /jetbra/scripts 文件夹, 执行 install.sh 脚本, 命令如下(因为需要修改环境变量,会提示需要输入电脑开机密码):

sudo bash install.sh

看到提示 Done , 表示激活成功。

Mac/Linux 系统执行破解补丁成功后,提示 Done

如果提示:“Operation not permitted while System Integrity Protection is engaged”,请先赋予权限,再重新执行。

chmod 755 install.sh

部分小伙伴 Mac/Linux 系统执行脚本遇到如下错误:

Mac 执行破解脚本报错

解决方法:

可先执行如下命令,再执行脚本:

export LC_COLLATE='C'
export LC_CTYPE='C'

执行脚本,都干了些啥?

  • Windows 用户执行脚本后,脚本会自动在环境变量 -> 用户变量下添加了 IDEA_VM_OPTIONS 变量,变量值为 /jetbra 文件夹下的 .vmoptions 参数文件绝对路径,如下所示:然后,脚本自动在 idea.vmoptions 文件中引用了破解补丁 :提示: 细心的小伙伴应该也发现了,本文的破解方式与文章开头《第二种 IDEA 破解方法》的区别在于,这种方式提供了自动化脚本,脚本免去了手动引入补丁的繁琐步骤,一切都由脚本来完成了。
  • Mac / Linux 用户执行脚本后,脚本会自动在当期用户环境变量文件中添加了相关参数文件,Mac / Linux 需重启系统,以确保环境变量生效。

小伙伴们也可自行检查一下,如果没有自动添加这些参数,说明脚本执行没有成功。

第六步:重启 IDEA

脚本执行成功后,一定要重启 IDEA ~~

脚本执行成功后,一定要重启 IDEA ~~

第七步:填入指定激活码完成激活

重新打开 IDEA 后,复制下面的激活码:

6G5NXCPJZB-eyJsaWNlbnNlSWQiOiI2RzVOWENQSlpCIiwibGljZW5zZWVOYW1lIjoic2lnbnVwIHNjb290ZXIiLCJhc3NpZ25lZU5hbWUiOiIiLCJhc3NpZ25lZUVtYWlsIjoiIiwibGljZW5zZVJlc3RyaWN0aW9uIjoiIiwiY2hlY2tDb25jdXJyZW50VXNlIjpmYWxzZSwicHJvZHVjdHMiOlt7ImNvZGUiOiJQU0kiLCJmYWxsYmFja0RhdGUiOiIyMDI1LTA4LTAxIiwicGFpZFVwVG8iOiIyMDI1LTA4LTAxIiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IlBEQiIsImZhbGxiYWNrRGF0ZSI6IjIwMjUtMDgtMDEiLCJwYWlkVXBUbyI6IjIwMjUtMDgtMDEiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiSUkiLCJmYWxsYmFja0RhdGUiOiIyMDI1LTA4LTAxIiwicGFpZFVwVG8iOiIyMDI1LTA4LTAxIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJQUEMiLCJmYWxsYmFja0RhdGUiOiIyMDI1LTA4LTAxIiwicGFpZFVwVG8iOiIyMDI1LTA4LTAxIiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IlBHTyIsImZhbGxiYWNrRGF0ZSI6IjIwMjUtMDgtMDEiLCJwYWlkVXBUbyI6IjIwMjUtMDgtMDEiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUFNXIiwiZmFsbGJhY2tEYXRlIjoiMjAyNS0wOC0wMSIsInBhaWRVcFRvIjoiMjAyNS0wOC0wMSIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJQV1MiLCJmYWxsYmFja0RhdGUiOiIyMDI1LTA4LTAxIiwicGFpZFVwVG8iOiIyMDI1LTA4LTAxIiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IlBQUyIsImZhbGxiYWNrRGF0ZSI6IjIwMjUtMDgtMDEiLCJwYWlkVXBUbyI6IjIwMjUtMDgtMDEiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUFJCIiwiZmFsbGJhY2tEYXRlIjoiMjAyNS0wOC0wMSIsInBhaWRVcFRvIjoiMjAyNS0wOC0wMSIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJQQ1dNUCIsImZhbGxiYWNrRGF0ZSI6IjIwMjUtMDgtMDEiLCJwYWlkVXBUbyI6IjIwMjUtMDgtMDEiLCJleHRlbmRlZCI6dHJ1ZX1dLCJtZXRhZGF0YSI6IjAxMjAyMjA5MDJQU0FOMDAwMDA1IiwiaGFzaCI6IlRSSUFMOi0xMDc4MzkwNTY4IiwiZ3JhY2VQZXJpb2REYXlzIjo3LCJhdXRvUHJvbG9uZ2F0ZWQiOmZhbHNlLCJpc0F1dG9Qcm9sb25nYXRlZCI6ZmFsc2V9-SnRVlQQR1/9nxZ2AXsQ0seYwU5OjaiUMXrnQIIdNRvykzqQ0Q+vjXlmO7iAUwhwlsyfoMrLuvmLYwoD7fV8Mpz9Gs2gsTR8DfSHuAdvZlFENlIuFoIqyO8BneM9paD0yLxiqxy/WWuOqW6c1v9ubbfdT6z9UnzSUjPKlsjXfq9J2gcDALrv9E0RPTOZqKfnsg7PF0wNQ0/d00dy1k3zI+zJyTRpDxkCaGgijlY/LZ/wqd/kRfcbQuRzdJ/JXa3nj26rACqykKXaBH5thuvkTyySOpZwZMJVJyW7B7ro/hkFCljZug3K+bTw5VwySzJtDcQ9tDYuu0zSAeXrcv2qrOg==-MIIETDCCAjSgAwIBAgIBDTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTIwMTAxOTA5MDU1M1oXDTIyMTAyMTA5MDU1M1owHzEdMBsGA1UEAwwUcHJvZDJ5LWZyb20tMjAyMDEwMTkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCUlaUFc1wf+CfY9wzFWEL2euKQ5nswqb57V8QZG7d7RoR6rwYUIXseTOAFq210oMEe++LCjzKDuqwDfsyhgDNTgZBPAaC4vUU2oy+XR+Fq8nBixWIsH668HeOnRK6RRhsr0rJzRB95aZ3EAPzBuQ2qPaNGm17pAX0Rd6MPRgjp75IWwI9eA6aMEdPQEVN7uyOtM5zSsjoj79Lbu1fjShOnQZuJcsV8tqnayeFkNzv2LTOlofU/Tbx502Ro073gGjoeRzNvrynAP03pL486P3KCAyiNPhDs2z8/COMrxRlZW5mfzo0xsK0dQGNH3UoG/9RVwHG4eS8LFpMTR9oetHZBAgMBAAGjgZkwgZYwCQYDVR0TBAIwADAdBgNVHQ4EFgQUJNoRIpb1hUHAk0foMSNM9MCEAv8wSAYDVR0jBEEwP4AUo562SGdCEjZBvW3gubSgUouX8bOhHKQaMBgxFjAUBgNVBAMMDUpldFByb2ZpbGUgQ0GCCQDSbLGDsoN54TATBgNVHSUEDDAKBggrBgEFBQcDATALBgNVHQ8EBAMCBaAwDQYJKoZIhvcNAQELBQADggIBABqRoNGxAQct9dQUFK8xqhiZaYPd30TlmCmSAaGJ0eBpvkVeqA2jGYhAQRqFiAlFC63JKvWvRZO1iRuWCEfUMkdqQ9VQPXziE/BlsOIgrL6RlJfuFcEZ8TK3syIfIGQZNCxYhLLUuet2HE6LJYPQ5c0jH4kDooRpcVZ4rBxNwddpctUO2te9UU5/FjhioZQsPvd92qOTsV+8Cyl2fvNhNKD1Uu9ff5AkVIQn4JU23ozdB/R5oUlebwaTE6WZNBs+TA/qPj+5/we9NH71WRB0hqUoLI2AKKyiPw++FtN4Su1vsdDlrAzDj9ILjpjJKA1ImuVcG329/WTYIKysZ1CWK3zATg9BeCUPAV1pQy8ToXOq+RSYen6winZ2OO93eyHv2Iw5kbn1dqfBw1BuTE29V2FJKicJSu8iEOpfoafwJISXmz1wnnWL3V/0NxTulfWsXugOoLfv0ZIBP1xH9kmf22jjQ2JiHhQZP7ZDsreRrOeIQ/c4yR8IQvMLfC0WKQqrHu5ZzXTH4NO3CwGWSlTY74kE91zXB5mwWAx1jig+UXYc2w4RkVhy0//lOmVya/PEepuuTTI4+UJwC7qbVlh5zfhj8oTNUXgN0AOc+Q0/WFPl1aw5VV/VrO8FCoB15lFVlpKaQ1Yh+DVU8ke+rt9Th0BCHXe0uZOEmH0nOnH/0onD

粘贴到输入框内,点击 Activate 按钮,就激活成功了。

输入 IDEA 破解激活码

PS: 有部分小伙伴反应,重启 IDEA 填入激活码依然无法激活,重启系统才行,如果有小伙伴遇到这种情况,不妨试试看 ~

激活成功后,又可以开心的 coding 了 ~

你可能会遇到的问题

一切按照教程来,输入激活码提示 Key is invalid

IDEA 输入激活码提示 key is invalid

输入激活码提示 key is invalid, 常见原因汇总到下面这篇文章了,可参考对照一下:

《JetBrains 产品输入激活码 Key is invalid 解决方案》

需要注意的问题

激活成功后,不要升级 IDEA 版本

官方反制手段越来越严厉,这个版本能激活,新版本大概率补丁就被限制了。所以,如果打开 IDEA 后,右下角若出现提示升级新版本,请不要升级版本。能用就行,它不香嘛!

也可以手动关闭升级提示,这样就可以防止控制不住自己升级了,如何关闭,参考下面的文章:

👉《IntelliJ IDEA 如何关闭更新提示?》

激活成功后,补丁文件夹能不能删掉或者移动?

上文中说到,执行脚本后会添加环境变量,变量值对应了你放置补丁位置的路径,删除掉或者移动,再打开 IDEA 就找不到对应文件了,激活也就失效了。放着吃灰就行,别动它。

激活补丁下载地址

PS: 破解补丁页面提取人数过多导致分享的百度网盘链接容易被封IDEA 2023.3.4 破解补丁分享失败蛋疼 ing,为限制人数,目前暂不提供页面直接提取,改为从笔者公众号提取

需要的小伙伴,扫描下方公众号二维码,或者关注公众号: 林老师带你学编程回复关键字idea, 即可免费无套路获取激活码、破解补丁,持续更新中 ~。

声明

本教程只做个人学习使用,请勿用于商业用途!

  • 若资金允许,请点击 https://www.jetbrains.com/idea/buy/ 购买正版,谢谢合作!
  • 学生凭学生证可免费申请 [https://sales.jetbrains.com/hc/zh-cn/articles/207154369- 学生授权申请方式](https://sales.jetbrains.com/hc/zh-cn/articles/207154369- 学生授权申请方式 “https://sales.jetbrains.com/hc/zh-cn/articles/207154369- 学生授权申请方式”) 正版授权!
  • 创业公司可 5 折购买 https://www.jetbrains.com/shop/eform/startup 正版授权!

360高级Java面试真题

《林老师带你学编程》知识星球是由多个工作10年以上的一线大厂开发人员联合创建,希望通过我们的分享,帮助大家少走弯路,可以在技术的领域不断突破和发展。

🔥 具体的加入方式:

如何在Java中实现TCP粘包和拆包的处理?

在Java中实现TCP粘包和拆包的处理涉及到网络编程中的数据传输和解析问题。TCP粘包和拆包是由于TCP协议的特性,在传输过程中可能会导致多个数据包粘合在一起(粘包),或者一个数据包被拆分成多个部分(拆包)。下面我将介绍一些处理TCP粘包和拆包的常见方法。

  1. 使用固定长度的消息

一种常见的处理方法是在消息的开头定义一个固定长度的消息头,用来表示消息的长度,然后根据消息头指定的长度来截取完整的消息内容。这样就可以避免粘包和拆包的问题。

  1. 使用特殊分隔符

另一种常见的处理方法是在消息的末尾使用特殊的分隔符来标识消息的结束,比如换行符\n或者回车符\r。接收端可以根据分隔符来分割消息,从而得到完整的消息内容。

  1. 使用消息头表示消息长度

在消息的开头使用固定长度的消息头来表示消息的长度,然后根据消息头指定的长度来截取完整的消息内容。这种方法可以有效地避免粘包和拆包的问题。

示例代码

下面是一个简单的示例代码,演示了如何在Java中使用固定长度的消息头来处理TCP粘包和拆包的问题:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class TCPMessageHandler {private Socket socket;private DataOutputStream out;private DataInputStream in;
public void sendMessage(String message) throws IOException {bytebytes = message.getBytes();
        out.writeInt(bytes.length); // 使用固定长度的消息头表示消息长度
        out.write(bytes);
        out.flush();
    }
public String receiveMessage() throws IOException {int length = in.readInt(); // 读取消息长度bytebytes = new byte[length];
        in.readFully(bytes); // 读取指定长度的消息内容return new String(bytes);
    }
}

在上述示例代码中,TCPMessageHandler类封装了发送和接收消息的功能。在发送消息时,使用固定长度的消息头表示消息长度;在接收消息时,先读取消息头表示的长度,然后再读取指定长度的消息内容,从而避免了粘包和拆包的问题。

总之,在Java中处理TCP粘包和拆包的问题通常涉及到设计消息格式、消息长度的表示以及消息的解析等方面。合理地设计消息格式并使用合适的方法来解析消息,可以有效地避免TCP粘包和拆包导致的数据解析错误。

描述Java中的Selector机制及其在非阻塞IO中的应用。

在Java中,Selector(选择器)是Java NIO(New I/O)中的一个重要组件,用于实现非阻塞 I/O。Selector 提供了一种高效的方式来处理多个通道(Channel)的 I/O 事件,例如读、写和连接就绪等。下面我将详细描述 Java 中的 Selector 机制以及它在非阻塞 I/O 中的应用。

Selector 机制

Selector 是 Java NIO 中的一个关键组件,它允许单个线程处理多个 Channel 的 I/O 操作。Selector 通过轮询的方式检查注册在其上的多个 Channel,一旦某个 Channel 准备好进行 I/O 操作,就会通知程序进行相应的处理。这种方式可以大大提高 I/O 操作的效率,尤其适用于需要处理大量连接的服务器端程序。

在非阻塞 I/O 中的应用

在非阻塞 I/O 中,一个线程可以同时管理多个 Channel,而不需要为每个 Channel 创建一个单独的线程。这是通过 Selector 机制实现的。以下是在非阻塞 I/O 中使用 Selector 的一般步骤:

  1. 创建 Selector:通过调用 Selector.open() 方法创建一个 Selector 对象。
  2. 将 Channel 注册到 Selector:将需要进行 I/O 操作的 Channel 注册到 Selector 上,并指定感兴趣的 I/O 事件,比如读、写等。
  3. 轮询就绪的 Channel:通过调用 Selector 的 select() 方法来轮询已经准备好进行 I/O 操作的 Channel。
  4. 处理就绪的 Channel:一旦某个 Channel 准备好进行 I/O 操作,就可以通过遍历已选择的键集合(SelectionKey)来获取就绪的 Channel,并进行相应的 I/O 操作。
  5. 取消注册的 Channel:在完成了对某个 Channel 的 I/O 操作后,需要将其从 Selector 上取消注册,避免重复处理。

示例代码

下面是一个简单的示例代码,演示了如何在 Java 中使用 Selector 实现非阻塞 I/O:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;

public class NonBlockingServer {
    public static void main(String[] args) throws IOException {
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.socket().bind(new InetSocketAddress(8080));
        serverSocketChannel.configureBlocking(false); // 设置为非阻塞模式

        Selector selector = Selector.open();
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); // 注册接受连接事件

        while (true) {
            selector.select(); // 轮询就绪的 Channel
            Set<SelectionKey> selectedKeys = selector.selectedKeys();
            Iterator<SelectionKey> keyIterator = selectedKeys.iterator();

            while (keyIterator.hasNext()) {
                SelectionKey key = keyIterator.next();
                if (key.isAcceptable()) {
                    ServerSocketChannel serverChannel = (ServerSocketChannel) key.channel();
                    SocketChannel clientChannel = serverChannel.accept();
                    clientChannel.configureBlocking(false);
                    clientChannel.register(selector, SelectionKey.OP_READ); // 注册读事件
                } else if (key.isReadable()) {
                    SocketChannel channel = (SocketChannel) key.channel();
                    ByteBuffer buffer = ByteBuffer.allocate(1024);
                    int bytesRead = channel.read(buffer);
                    // 处理读取的数据
                    // ...
                }
                keyIterator.remove(); // 取消已处理的事件
            }
        }
    }
}

在上述示例代码中,通过 Selector 实现了一个简单的非阻塞服务器。服务器使用 Selector 轮询就绪的 Channel,并根据就绪的事件进行相应的处理。这种方式可以让服务器在单个线程内高效地处理多个客户端的连接和数据传输。

总之,Selector 是 Java NIO 中非常重要的组件,它提供了一种高效的方式来处理多个 Channel 的 I/O 事件。在非阻塞 I/O 中,Selector 可以帮助我们实现高性能的网络编程,特别适用于需要处理大量连接的服务器端程序。

如何在Java中使用SSL/TLS建立安全的网络通信?

在Java中使用SSL/TLS(安全套接层/传输层安全)建立安全的网络通信涉及到使用Java的SSL相关类库和API来配置和管理安全通信的过程。下面我将介绍在Java中如何使用SSL/TLS建立安全的网络通信的一般步骤。

  1. 准备证书和密钥

首先,需要准备服务器端和客户端的数字证书以及相应的私钥。数字证书可以通过证书颁发机构(CA)获得,也可以自行创建自签名证书。私钥用于对证书进行签名和加密。

  1. 配置SSLContext

在Java中,可以通过SSLContext类来配置SSL/TLS的安全参数,包括使用的协议版本、证书和密钥等。可以使用KeyManagerFactory和TrustManagerFactory来加载服务器端和客户端的证书和密钥。

  1. 创建SSLServerSocket和SSLSocket(服务器端和客户端)

在服务器端,可以使用SSLServerSocket来监听和接受SSL连接;在客户端,可以使用SSLSocket来发起SSL连接。

  1. 进行安全通信

一旦SSL连接建立,服务器端和客户端就可以进行安全的通信,包括加密和身份验证等操作。

示例代码

下面是一个简单的示例代码,演示了如何在Java中使用SSL/TLS建立安全的网络通信:

import javax.net.ssl.*;
import java.io.FileInputStream;
import java.io.InputStream;
import java.security.KeyStore;

public class SSLServer {
    public static void main(String[] args) throws Exception {
        // 加载服务器端证书和私钥
        char[] serverPassword = "serverPassword".toCharArray();
        KeyStore serverKeyStore = KeyStore.getInstance("JKS");
        InputStream serverKeyStoreFile = new FileInputStream("server.jks");
        serverKeyStore.load(serverKeyStoreFile, serverPassword);
        KeyManagerFactory serverKeyManagerFactory = KeyManagerFactory.getInstance("SunX509");
        serverKeyManagerFactory.init(serverKeyStore, serverPassword);

        // 创建SSLContext
        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(serverKeyManagerFactory.getKeyManagers(), null, null);

        // 创建SSLServerSocket
        SSLServerSocketFactory sslServerSocketFactory = sslContext.getServerSocketFactory();
        SSLServerSocket sslServerSocket = (SSLServerSocket) sslServerSocketFactory.createServerSocket(8080);

        // 监听并接受SSL连接
        SSLSocket sslSocket = (SSLSocket) sslServerSocket.accept();

        // 进行安全通信
        // ...
    }
}

在上述示例代码中,通过加载服务器端的证书和私钥,创建SSLContext,并使用SSLServerSocketFactory创建SSLServerSocket,最终实现了在服务器端建立安全的SSL连接。

在客户端,可以使用类似的方式创建SSLSocket,并使用它进行SSL连接。总之,在Java中使用SSL/TLS建立安全的网络通信需要仔细配置SSLContext,并确保正确加载和使用证书、密钥等安全材料。这样可以确保通信过程中的数据加密和安全性。

描述Java加密扩展(JCE)中的密钥管理和数字签名过程。

查看更多

字节高级Java面试真题

《林老师带你学编程》知识星球是由多个工作10年以上的一线大厂开发人员联合创建,希望通过我们的分享,帮助大家少走弯路,可以在技术的领域不断突破和发展。

🔥 具体的加入方式:

如何在Java中实现自定义的类加载器?

在Java中实现自定义类加载器,通常需要继承ClassLoader类,并重写findClass方法来指定你的类加载逻辑。以下是一个简单的自定义类加载器的示例:

import java.io.*;

public class MyClassLoader extends ClassLoader {

    private String classPath;

    public MyClassLoader(String classPath) {
        this.classPath = classPath;
    }

    private byte[] loadClassData(String name) {
        // 将包路径中的"."替换为文件系统的路径分隔符"/"
        name = name.replace(".", "/");
        String filePath = classPath + "/" + name + ".class";
        InputStream is = null;
        ByteArrayOutputStream baos = null;
        try {
            is = new FileInputStream(filePath);
            baos = new ByteArrayOutputStream();
            int bufferSize = 1024;
            byte[] buffer = new byte[bufferSize];
            int length = 0;
            while ((length = is.read(buffer)) != -1) {
                baos.write(buffer, 0, length);
            }
            return baos.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (is != null) is.close();
                if (baos != null) baos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        byte[] data = loadClassData(name);
        if (data == null) {
            throw new ClassNotFoundException();
        }
        return defineClass(name, data, 0, data.length);
    }

    public static void main(String[] args) {
        MyClassLoader classLoader = new MyClassLoader("path_to_classes");
        try {
            Class<?> clazz = classLoader.loadClass("com.example.MyClass");
            Object obj = clazz.newInstance();
            System.out.println("Class loaded by: " + obj.getClass().getClassLoader());
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

在这个示例中,MyClassLoader重写了findClass方法,它使用loadClassData方法从文件系统中读取类的字节码。loadClassData方法将类的全限定名转换为文件系统路径,并从指定路径读取.class文件,将其转换为字节数组。

main方法中,我们创建了一个MyClassLoader实例,并尝试加载一个名为com.example.MyClass的类。如果类文件位于path_to_classes/com/example/MyClass.class路径下,类加载器将能够找到并加载它。

自定义类加载器可以用于许多高级场景,例如加载网络上的类,实现热部署,或者加载加密的类文件等。在实现自定义类加载器时,应该注意类加载的委托机制和安全性问题。

解释Java内存模型,并讨论它对并发编程的影响。

Java内存模型(Java Memory Model,JMM)是一种抽象的概念,它描述了Java虚拟机(JVM)在计算机内存中如何存储数据,以及线程如何通过内存与其他线程交互。JMM解决了多线程环境中的可见性、原子性、有序性问题,并定义了线程如何以及何时可以看到其他线程写入的值。

JMM的主要组件和概念包括:

  1. 主内存与工作内存:JMM区分了主内存(所有线程共享的内存区域,用于存储实例字段、静态字段和构成数组的元素)和工作内存(每个线程私有的内存缓冲区,包含了线程使用的变量的副本)。
  2. 内存操作:包括读取(read)、加载(load)、使用(use)、赋值(assign)、存储(store)和写入(write)操作。
  3. 内存屏障:JMM使用内存屏障来插入指令,以防止某些代码的执行顺序被重排序,从而保证特定的内存可见性和有序性。
  4. 原子性:JMM保证了基本读写操作的原子性,例如对volatile变量的读/写,以及对final变量的写入和构造函数退出后的读取。
  5. 可见性:JMM通过volatile关键字、锁(synchronized blocks)、final域等机制提供了内存可见性保证,确保一个线程对共享变量的修改能够及时地被其他线程看到。
  6. 有序性:JMM禁止编译器和处理器对代码执行顺序进行重排序,以保证在单线程环境下代码的执行顺序不会影响最终结果。但在多线程环境下,JMM允许重排序,只要不违反happens-before原则。

Happens-before原则是JMM中最核心的概念之一,它定义了一个全局的顺序,规定了在没有其他同步手段的情况下,一个操作的结果必须对另一个操作可见。以下是一些基本的happens-before规则:

  • 程序顺序规则:一个线程内,按照代码顺序,前面的操作happens-before于后续的操作。
  • 锁定规则:一个unlock操作happens-before于后面对同一个锁的lock操作。
  • volatile变量规则:对一个volatile字段的写操作happens-before于后续对这个volatile字段的读操作。
  • 传递性:如果A happens-before B,且B happens-before C,那么A happens-before C。

JMM对并发编程的影响是深远的,它为开发者提供了一套规则和保证,使得并发程序的编写变得可预测,并且可以在不同的JVM实现和硬件平台上保持一致的行为。然而,正确理解和使用JMM也是并发编程中的一个挑战,开发者需要确保对共享变量的访问和修改是安全的,并且要意识到潜在的竞争条件和内存一致性错误。

如何优化Java程序的CPU和内存使用?

优化Java程序的CPU和内存使用是一个复杂的过程,涉及到代码层面的优化、算法改进、数据结构选择以及运行时的JVM调优。以下是一些通用的策略:

代码层面的优化:

  1. 避免不必要的对象创建:尽量重用对象,避免频繁创建和销毁对象,特别是在循环和高频调用的方法中。
  2. 使用高效的算法和数据结构:选择合适的算法和数据结构可以大幅提高程序性能,例如使用HashMap而不是List来进行快速查找。
  3. 减少冗余计算:缓存计算结果,避免在每次调用时都重新计算。
  4. 延迟初始化:仅在实际需要时才初始化对象,可以减少内存的使用。
  5. 优化循环:减少循环内部的计算量,移除不必要的循环。
  6. 使用基本类型而非包装类:尽量使用int等基本类型,而不是Integer这样的包装类型,以减少内存消耗和避免自动装箱拆箱的开销。
  7. 并发和多线程优化:合理使用并发和多线程可以提高CPU的利用率,但需要注意线程安全和避免线程竞争。

JVM调优:

  1. 垃圾收集器选择和调优:根据应用的特点选择合适的垃圾收集器(如G1, CMS, ZGC等),并调整相关参数以优化GC行为。
  2. 堆内存分配:合理分配JVM堆内存的大小,避免频繁的垃圾回收或内存溢出。
  3. 调整线程栈大小:可以通过-Xss参数调整线程栈的大小,避免不必要的内存占用。
  4. JVM内联和编译优化:JVM会对热点代码进行内联和即时编译优化,确保这些优化正常进行。
  5. 使用JVM性能监控工具:如JProfiler, VisualVM等工具可以帮助识别性能瓶颈。

代码分析和性能监控:

  1. 分析CPU使用情况:使用工具(如JProfiler, Java Mission Control)来分析哪些方法或线程占用了过多CPU。
  2. 内存泄漏检测:使用内存分析工具(如Eclipse Memory Analyzer)来检测内存泄漏。
  3. 代码剖析:使用剖析工具来分析代码的运行时间和资源消耗,识别瓶颈。
  4. 日志记录和监控:合理的日志记录可以帮助在问题发生时快速定位问题。
  5. 性能测试和基准测试:定期进行性能测试和基准测试,确保优化的效果符合预期。

最佳实践:

  1. 代码审查:定期进行代码审查,可以发现并修正潜在的性能问题。
  2. 文档和指南:遵循Java性能优化的最佳实践和指南。
  3. 持续集成和持续部署(CI/CD):在CI/CD流程中集成性能测试,确保代码变更不会引入新的性能问题。

优化Java程序的CPU和内存使用是一个持续的过程,需要不断地监控、分析和调整。通过上述策略,你可以显著提高Java程序的性能和资源利用效率。

Java中的finalize()方法有哪些缺陷?

在Java中,finalize()方法是Object类的一个方法,它被设计为在垃圾收集器决定回收对象内存之前给对象一个清理资源的机会。然而,finalize()方法存在多个缺陷,导致它在实际开发中被不推荐使用甚至在Java 9中被标记为废弃(Deprecated)。

以下是finalize()方法的一些主要缺陷:

  1. 不确定性finalize()方法的调用时机是不确定的,因为它依赖于垃圾收集器的运行,而垃圾收集器的执行时机是不可预测的。这意味着你无法知道资源什么时候会被释放。
  2. 性能开销:对象有finalize()方法会给垃圾收集带来额外的负担。这些对象会被放在一个叫做finalization queue的队列中,需要单独处理,这会延迟它们的回收过程,并增加垃圾收集的复杂性。
  3. 可能导致内存泄漏:如果在finalize()方法中对象被重新引用(比如被赋值给某个类变量),那么这个对象可能不会被垃圾收集器回收,从而导致内存泄漏。
  4. 无法保证被调用:如果JVM提前退出,那么finalize()方法可能根本不会被执行。因此,依赖finalize()来释放资源是不可靠的。
  5. 异常问题:如果finalize()方法抛出异常,并且没有被捕获,那么垃圾收集器将忽略这个异常,而且不会再次调用该对象的finalize()方法。这可能会导致资源无法正确清理。
  6. 安全问题finalize()方法可能会被恶意子类覆盖,用于对象复活(resurrection)或者资源窃取。

鉴于上述缺陷,Java开发者应该避免使用finalize()方法来清理资源。取而代之,可以使用以下替代方案:

  • try-with-resources语句:自Java 7起,用于自动管理实现了AutoCloseable或Closeable接口的资源对象。
  • 显式清理:提供一个显式的清理方法(如close()dispose()),并在使用对象的地方确保调用这个方法。
  • 清理器(Cleaner)和PhantomReference:Java 9引入了java.lang.ref.Cleaner类,它提供了一种更灵活和可靠的方式来清理资源,而不需要依赖于垃圾收集器的不确定性。

总之,finalize()方法由于其不可预测性和潜在的风险,不应该被用作清理资源的主要手段。开发者应该寻求更稳定和可控的资源管理方式。

如何优化Java垃圾收集器的性能?

优化Java垃圾收集器(GC)的性能通常涉及到选择合适的垃圾收集器、调整GC相关参数以及优化应用程序的内存使用。以下是一些具体的步骤和策略:

选择合适的垃圾收集器:

  1. 了解不同垃圾收集器:Java提供了多种垃圾收集器,如Serial GC、Parallel GC、Concurrent Mark Sweep (CMS) GC、G1 GC、ZGC、Shenandoah GC等,每种收集器都有其适用场景和特点。
  2. 根据应用需求选择:选择垃圾收集器时,需要考虑应用的需求,如吞吐量、延迟、内存占用等。例如,对于延迟敏感的应用,可能更适合使用G1 GC、ZGC或Shenandoah GC。

调整GC参数:

  1. 堆大小(-Xms和-Xmx):适当地设置JVM堆的初始大小(-Xms)和最大大小(-Xmx)可以减少垃圾收集的频率,但设置得过大可能会导致长时间的GC停顿。
  2. 新生代大小(-Xmn):调整新生代的大小可以影响对象晋升到老年代的速度,以及新生代和老年代之间的垃圾收集频率。
  3. Eden与Survivor区比例:调整Eden区和Survivor区的比例可以优化对象在新生代的存活周期。
  4. 垃圾收集器特定参数:各个垃圾收集器都有自己的特定参数,可以调整以优化性能,如G1 GC的-XX:MaxGCPauseMillis参数可以设置目标停顿时间。
  5. 并行GC线程数(-XX:ParallelGCThreads):对于并行垃圾收集器,可以调整并行GC线程数以匹配系统的CPU核心数。

应用程序优化:

  1. 减少内存分配速率:减少对象的创建和短生命周期对象的数量可以减轻垃圾收集器的压力。
  2. 优化数据结构:选择更合适的数据结构可以减少内存占用和提高效率。
  3. 避免内存泄漏:确保及时释放不再使用的对象引用,避免内存泄漏。
  4. 使用对象池:对于频繁创建和销毁的对象,使用对象池可以减少垃圾收集的负担。
  5. 减少大对象的分配:大对象(如大数组)直接分配在老年代,频繁分配可能导致早期晋升或大型对象的GC停顿。

监控和调试:

  1. 使用监控工具:使用JVM监控和分析工具(如JConsole、VisualVM、JProfiler等)来监控GC活动和内存使用情况。
  2. GC日志:开启GC日志(-Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps等)可以帮助分析GC行为和性能。
  3. 分析GC日志:使用GC日志分析工具(如GCViewer、GCEasy等)来分析GC日志,找出GC性能瓶颈。
  4. 测试和调整:在实际的生产环境中进行测试,根据应用的实际表现调整GC参数。

优化GC性能是一个迭代过程,需要不断地监控、分析和调整。通过上述方法,可以显著改善Java应用程序的GC性能和整体性能。

如何在MySQL中优化大表的查询性能?

查看更多

Nacos面试题

《林老师带你学编程》知识星球是由多个工作10年以上的一线大厂开发人员联合创建,希望通过我们的分享,帮助大家少走弯路,可以在技术的领域不断突破和发展。

🔥 具体的加入方式:

Nacos中的保护阈值的作用是什么?

假如现在有一个服务,本来有10个实例,但是现在挂掉了8个,剩下2个正常实例,此时本来由10个实例处理的流量,就全部交给这个两个正常实例来处理了,此时这两个实例很有可能是处理不过来的,最终导致被压垮,为了应对这种情况,Nacos提供了保护阈值这个功能,我们可以给某个服务设置一个0-1的阈值,比如0.5,那就表示,一旦实例中只剩下一半的健康实例了,比如10个实例,只剩下5个健康实例了,那么消费者在进行服务发现时,则会把该服务的所有实例,也包括不健康的实例都拉取到本地,然后再从所有实例中进行负载均衡,选出一个实例进行调用,在这种情况下,选出来的即可能是一个健康的实例,也可能是挂掉的实例,但是通过这种方式,很好的保护的剩下的健康实例,至少保证了一部分请求能正常的访问,而不至于所有请求都不能正常访问,这就是Nacos中的保护阈值,同时,这个功能在Spring Cloud Tencent中叫全死全活。

Nacos中的负载均衡是怎么样的?

Nacos的负载均衡指的是,在进行服务发现时进行负载均衡,正常情况下,在进行服务发现时,会根据服务名从Nacos中拉取所有的实例信息,但是Nacos中提供了一个功能,就是可以在拉取实例时,可以根据随机策略只拉取到所有实例中的某一个,这就是Nacos中的负载均衡,它跟Ribbon的负载均衡并不冲突,可以理解为Ribbon的负载均衡是发生在Nacos的负载均衡之后的。

Nacos的就近访问是什么意思?

首先,在Nacos中,一个服务可以有多个实例,并且可以给实例设置cluster-name,就是可以再进一步的给所有实例划分集群,那如果现在某个服务A想要调用服务B,那么Naocs会看调用服务A的实例是属于哪个集群的,并且调用服务B时,那就会调用同样集群下的服务B实例,根据cluster-name来判断两个实例是不是同一个集群,这就是Nacos的就近访问。

你是怎么理解CAP理论的?

CAP理论是分布式领域中最为重要的理论,CAP理论可以理解为目前硬件条件下对于分布式架构的一种限制,就是对于一个分布式系统只能保证AP或CP,而不能同时保证CAP,首先对于一个分布式系统,P,也就是分区容错性是一定要保证的,对于一个分布式系统,得保证在网络出现分区后,分布式系统仍然能工作,所以得保证P,只不过当出现网络分区后,整个分布式系统如果想要保证数据一致性,那么就要损耗系统可用性,或者如果想要保证系统的可用性,就不能保证系统的一致性,这里说的是强一致性,因为如果网络出现问题,分布式系统中的数据就无法进行及时的同步,如果要求强一致性,那么就只能等网络好了之后,数据同步好了之后,才能提供给用户使用,同理,如果要求网络出现后问题,系统要能使用,那就可能数据会不一致,所以对于一个分布式系统,目前来说只能保证CP或AP。

Nacos中保证的是CP还是AP?

通常我们说,Nacos技能保证CP,也能保证AP,具体看如何配置,但其实只不过是Nacos中的注册中心能保证CP或AP,Nacos中的配置中心其实没什么CP或AP,因为配置中心的数据是存在一个Mysql中的,只有注册中心的数据需要进行集群节点之间的同步,从而涉及到是CP还是AP,如果注册的节点是临时节点,那么就是AP,如果是非临时节点,那么就是CP,默认是临时节点。

如何理解Nacos中的命名空间

命名空间,也就是namespace,其实这个概念并不是Nacos中独有的,在Nacos中,不管是配置还是服务,都是属于某一个命名空间中的,默认情况下都是属于pulibc这个命名空间中的,我们可以在Nacos中新增命名空间,也就相当于开辟了另外一套存放服务和配置的地方,命名空间之间是独立的,完全不冲突的,所以我们可以利用Nacos中的命名空间来实现不同环境、不同租户之间的服务注册和配置。

你觉得注册中心应该是CP还是AP?

我觉得大部分情况下,注册中心应该是AP,如果注册中心是CP的,那么表示,当我们向注册中心注册实例或移除实例时,都要等待注册中心集群中的数据达到一致后,才算注册或移除成功,而这是比较耗时的,随着业务应用规模的增大,应用频繁的上下线,那么就会导致注册中心的压力比较大,会影响到服务发现的效率以及服务调用了,而如果注册中心是AP的,那么注册中心集群不管出现了什么情况,都是可以提供服务的,就算集群节点之间数据出现了不一致,对于业务应用而言,可能拉取到了一个已经下线了的服务节点,但是现在一般的微服务框架或组件都提供了服务容错和重试功能,也可以避免这个问题,而如果是AP,对于注册中心而言就不需要消耗太多的资源来实时的保证数据一致性了,保证最终一致性就可以了,这样注册中心的压力会小一点,另外像Zookeeper来作为注册中心,因为Zookeeper保证的就是CP,但是如果集群中如果大多数节点挂掉了,就算还剩下一些Zookeeper节点,这些节点也是不能提供服务的,所以这个也不太合适,所以综合来看,注册中心应该保证AP会更好,就像Euraka、Nacos他们默认保证的就是AP。

nacos 作为配置中心要配置什么

Nacos作为配置中心,需要配置以下内容:

  1. 数据源配置包括数据库连接信息、用户名、密码等。这些信息将用于Nacos存储配置数据的数据库。
  2. 配置项:定义需要在Nacos中管理和存储的配置项。可以根据业务需求自定义配置项的名称、类型、默认值等。
  3. 集群配置如果需要使用Nacos作为分布式配置中心,需要配置集群信息,包括集群节点的IP地址、端口号等。
  4. 权限配置根据需求设置不同用户或角色的权限,以保证配置数据的安全性。
  5. 监控配置:可以配置Nacos的监控指标,包括监控数据的收集周期、存储方式等。
  6. 通知配置可以配置Nacos在配置变更时发送通知的方式,比如邮件、短信等。
  7. 注册中心配置:如果需要将Nacos用作服务注册中心,需要配置相关信息,如注册中心的地址、端口等。

为什么要将服务注册到nacos?

将服务注册到Nacos有以下几个重要原因:

  1. 服务发现与负载均衡:Nacos可以作为服务注册中心,帮助应用实现服务发现和负载均衡。通过在Nacos上注册服务,其他应用可以方便地发现和调用该服务,提高了应用的可用性和可扩展性。
  2. 动态配置管理:Nacos提供了动态配置管理功能,可以动态地修改应用的配置信息,而无需重启应用。这样可以方便地对应用进行配置调整,提高了配置的灵活性和可管理性。
  3. 服务健康检查:Nacos可以定期检查已注册的服务的健康状态,及时发现故障或不可用的服务,并对其进行下线或重启操作。这样可以提高服务的稳定性和可靠性。
  4. 跨区域部署:Nacos支持多区域的服务注册和发现,可以方便地将服务部署到不同的区域,实现跨区域的服务调用和负载均衡。这对于构建分布式系统和实现高可用架构非常有价值。

总而言之,将服务注册到Nacos可以提供服务发现、负载均衡、动态配置管理、服务健康检查等功能,帮助应用实现高可用、可扩展和灵活的架构。

Nacos服务是如何判定服务实例的状态?

Nacos服务通过以下几个步骤来判定服务实例的状态:

  1. 心跳检测Nacos会定期向每个注册的服务实例发送心跳请求,以检测其是否存活。如果Nacos在一段时间内没有收到实例的心跳回复,就会将该实例标记为不可用。
  2. 健康检查:Nacos可以配置一些健康检查的规则,例如HTTP接口的返回状态码、响应时间等。Nacos会定期调用这些接口,根据返回结果来判断服务实例的健康状况。如果实例返回的结果不符合预期的健康规则,Nacos会将其标记为不可用。
  3. 负载均衡:Nacos还会根据实例的负载情况来判定其状态。如果某个实例的负载过高,超过了一定的阈值,Nacos可能会将其标记为不可用,以避免过多的请求落在该实例上,导致服务质量下降。

需要注意的是,Nacos的状态判定是基于一定的策略和规则进行的,具体的判定方式可以根据实际需求进行配置和扩展。以上是一般情况下Nacos服务判定服务实例状态的方式,避免了敏感内容的提及。

查看更多

Zookeeper面试题

《林老师带你学编程》知识星球是由多个工作10年以上的一线大厂开发人员联合创建,希望通过我们的分享,帮助大家少走弯路,可以在技术的领域不断突破和发展。

🔥 具体的加入方式:

ZooKeeper 是什么?

ZooKeeper 是一个开源的分布式协调服务。它是一个为分布式应用提供一致性服务的软件,分布式应用程序可以基于 Zookeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。

ZooKeeper 的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

# Zookeeper 都有哪些功能?

  1. 集群管理:监控节点存活状态、运行请求等;
  2. 主节点选举:主节点挂掉了之后可以从备用的节点开始新一轮选主,主节点选举说的就是这个选举的过程,使用 Zookeeper 可以协助完成这个过程;
  3. 分布式锁:Zookeeper 提供两种锁:独占锁、共享锁。独占锁即一次只能有一个线程使用资源,共享锁是读锁共享,读写互斥,即可以有多线线程同时读同一个资源,如果要使用写锁也只能有一个线程使用。Zookeeper 可以对分布式锁进行控制。
  4. 命名服务:在分布式系统中,通过使用命名服务,客户端应用能够根据指定名字来获取资源或服务的地址,提供者等信息。

# 说说Zookeeper 的文件系统

Zookeeper 提供一个多层级的节点命名空间(节点称为 znode)。与文件系统不同的是,这些节点都可以设置关联的数据,而文件系统中只有文件节点可以存放数据而目录节点不行。

Zookeeper 为了保证高吞吐和低延迟,在内存中维护了这个树状的目录结构,这种特性使得 Zookeeper 不能用于存放大量的数据,每个节点的存放数据上限为1M。

# Zookeeper 怎么保证主从节点的状态同步?

Zookeeper 的核心是原子广播机制,这个机制保证了各个 server 之间的同步。实现这个机制的协议叫做 Zab 协议。Zab 协议有两种模式,它们分别是恢复模式和广播模式。

1、恢复模式

当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数 server 完成了和 leader 的状态同步以后,恢复模式就结束了。状态同步保证了 leader 和 server 具有相同的系统状态。

2、广播模式

一旦 leader 已经和多数的 follower 进行了状态同步后,它就可以开始广播消息了,即进入广播状态。这时候当一个 server 加入 ZooKeeper 服务中,它会在恢复模式下启动,发现 leader,并和 leader 进行状态同步。待到同步结束,它也参与消息广播。ZooKeeper 服务一直维持在 Broadcast 状态,直到 leader 崩溃了或者 leader 失去了大部分的 followers 支持。

# zookeeper 是如何保证事务的顺序一致性的?

zookeeper 采用了全局递增的事务 Id 来标识,所有的 proposal都在被提出的时候加上了 zxid,zxid 实际上是一个 64 位的数字,高 32 位是 epoch 用来标识 leader 周期,如果有新的 leader 产生出来,epoch会自增,低 32 位用来递增计数。当新产生 proposal 的时候,会依据数据库的两阶段过程,首先会向其他的 server 发出事务执行请求,如果超过半数的机器都能执行并且能够成功,那么就会开始执行。

# 分布式集群中为什么会有 Master主节点?

在分布式环境中,有些业务逻辑只需要集群中的某一台机器进行执行,其他的机器可以共享这个结果,这样可以大大减少重复计算,提高性能,于是就需要进行 leader 选举。

# zk 节点宕机如何处理?

Zookeeper 本身也是集群,推荐配置不少于 3 个服务器。Zookeeper 自身也要保证当一个节点宕机时,其他节点会继续提供服务。

如果是一个 Follower 宕机,还有 2 台服务器提供访问,因为 Zookeeper 上的数据是有多个副本的,数据并不会丢失;如果是一个 Leader 宕机,Zookeeper 会选举出新的 Leader。

ZK 集群的机制是只要超过半数的节点正常,集群就能正常提供服务。只有在 ZK节点挂得太多,只剩一半或不到一半节点能工作,集群才失效。

所以3 个节点的 cluster 可以挂掉 1 个节点(leader 可以得到 2 票>1.5)。2 个节点的 cluster 就不能挂掉任何 1 个节点了(leader 可以得到 1 票<=1)

# zookeeper 负载均衡和 nginx 负载均衡区别

zk 的负载均衡是可以调控,nginx 只是能调权重,其他需要可控的都需要自己写插件;但是 nginx 的吞吐量比 zk 大很多,应该说按业务选择用哪种方式。

# Zookeeper 有哪几种几种部署模式?

Zookeeper 有三种部署模式:

  1. 单机部署:一台集群上运行;
  2. 集群部署:多台集群运行;
  3. 伪集群部署:一台集群启动多个 Zookeeper 实例运行。

# 集群最少要几台机器,集群规则是怎样的?集群中有 3 台服务器,其中一个节点宕机,这个时候 Zookeeper 还可以使用吗?

集群规则为 2N+1 台,N>0,即 3 台。可以继续使用,单数服务器只要没超过一半的服务器宕机就可以继续使用。

# 集群支持动态添加机器吗?

其实就是水平扩容了,Zookeeper 在这方面不太好。两种方式:

全部重启:关闭所有 Zookeeper 服务,修改配置之后启动。不影响之前客户端的会话。

逐个重启:在过半存活即可用的原则下,一台机器重启不影响整个集群对外提供服务。这是比较常用的方式。

3.5 版本开始支持动态扩容。

# Zookeeper 对节点的 watch 监听通知是永久的吗?为什么不是永久的?

不是。官方声明:一个 Watch 事件是一个一次性的触发器,当被设置了 Watch的数据发生了改变的时候,则服务器将这个改变发送给设置了 Watch 的客户端,以便通知它们。

为什么不是永久的,举个例子,如果服务端变动频繁,而监听的客户端很多情况下,每次变动都要通知到所有的客户端,给网络和服务器造成很大压力。

一般是客户端执行 getData(“/节点 A”,true),如果节点 A 发生了变更或删除,客户端会得到它的 watch 事件,但是在之后节点 A 又发生了变更,而客户端又没有设置 watch 事件,就不再给客户端发送。

在实际应用中,很多情况下,我们的客户端不需要知道服务端的每一次变动,我只要最新的数据即可。

# ZAB 和 Paxos 算法的联系与区别?

相同点:

(1)两者都存在一个类似于 Leader 进程的角色,由其负责协调多个 Follower 进程的运行

(2)Leader 进程都会等待超过半数的 Follower 做出正确的反馈后,才会将一个提案进行提交

不同点:

ZAB 用来构建高可用的分布式数据主备系统(Zookeeper),Paxos 是用来构建分布式一致性状态机系统。

# ZAB 的两种基本模式?

崩溃恢复:在正常情况下运行非常良好,一旦 Leader 出现崩溃或者由于网络原因导致 Leader 服务器失去了与过半 Follower 的联系,那么就会进入崩溃恢复模式。为了程序的正确运行,整个恢复过程后需要选举出一个新的 Leader,因此需要一个高效可靠的选举方法快速选举出一个 Leader。

消息广播:类似一个两阶段提交过程,针对客户端的事务请求, Leader 服务器会为其生成对应的事务 Proposal,并将其发送给集群中的其余所有机器,再分别收集各自的选票,最后进行事务提交。

# 哪些情况会导致 ZAB 进入恢复模式并选取新的 Leader?

启动过程或 Leader 出现网络中断、崩溃退出与重启等异常情况时。

当选举出新的 Leader 后,同时集群中已有过半的机器与该 Leader 服务器完成了状态同步之后,ZAB 就会退出恢复模式。

# 说一下 Zookeeper 的通知机制?

client 端会对某个 znode 建立一个 watcher 事件,当该 znode 发生变化时,这些 client 会收到 zk 的通知,然后 client 可以根据 znode 变化来做出业务上的改变等。

# Zookeeper 和 Dubbo 的关系?

查看更多

滚动至顶部