先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
正文
二: 如上图所示,常见的系统架构分层如下
1、客户端层: 就是常见的浏览器、APP。
2、反向代理层: 此层用于反向代理和负载均衡,常见的软件:nginx,硬件F5。
3、前端应用层: 现在的系统一般是前后端分离并单独部署,此处属于前端项目。
4、服务层: 后端服务群,提供给前端项目调用。
5、缓存层: 介于服务层和数据库层之间,通过缓存,减少IO次数、提高吞吐量和响应速度。
6、数据库层: 实际的数据存储区域,可以进行读写分离,通过binlog日志进行同步数据。
五: 系统架构不同层级的水平拓展方式
1、针对客户端层优化
此处的逻辑主要是用户通过域名访问应用,但是在访问前,需要通过DSN进行域名和IP地址的转换。
优化方案: 利用DNS负载均衡,给同一个域名配置多个IP地址,在应答的时候,DNS会对每个查询按DNS中配置的IP地址顺序返回,从而将客户端引导到不同的服务器上。
CDN(Content Delivery Network)内容分发网络也是利用DNS的重定向技术,DNS会返回一个离用户最近的IP地址作为响应,CDN节点的服务器负责响应用户的请求,提供所需的内容。
2、反向代理层优化
如果反向代理层成为了性能的瓶颈时,可以通过添加新服务器,安装新的反向代理来水平拓展反向代理的性能(如果是使用硬件的话,则需要购买新的硬件),理论上来说可以承受无限制的并发量。
3、前端应用层优化
前后端的项目分离部署,将前端项目部署到处理静态文件更好的服务器(如nginx处理静态文件的效率就远大于tomcat服务器)这本身就是对性能的一种优化,同时,也降低了系统的耦合性。
同时,前端层面也可以在代码层级做性能优化,如缓存条件,如果界面界面切换时条件没有改动,可以直接读取之前的数据,不再向后端发起请求。
4、服务层优化
前端应用层通过RPC远程调用服务,当性能成为瓶颈时,可以添加服务器数量,将服务部署到新机器中,理论上来说,可以兼容无限制的并发(可以使用如euraka注册中心这种自动注册和发现的组件来实现服务层自动扩容)。
5、缓存层优化
缓存层本身就是使用”空间换时间”的方式来提高系统的效率和吞吐量,如果缓存层因为数据量出现性能瓶颈时,可以添加新的服务器来实现水平拓展。
6、数据层的优化
当系统数据量上升,单机性能达到瓶颈时,可以添加新的机器,通过读写分离,数据水平拆分存储到不同服务器来提高系统的性能。
六: 数据库常见的水平拆分的方式
一: 按指定规则划分
定义:
如根据字段取值范围划分为不同模块,属于某个范围的数据存储在库1,另外一个范围的存储在库2,以此类推,这样将单库单表的数据转移到了多库多表,提高了系统的性能。
优点:
划分方式简单,实现相对容易。
比较容易拓展,如果数据量继续增大,可以将后面的数据划分到新的库表。
数据的分配相对均匀。
缺点:
数据的负载不一定均匀,因为可能某一部分数据非常活跃(如新用户),这部分数据的请求压力会很大。
二: 按哈希取模规则水平拆分
定义:
对指定字段(或者部分字段)进行哈希取模运算,根据奇偶数存储在不同的库中,这样也可以将单库数据水平拆分到多库,提高系统的性能。
优点:
规则简单,实现相对容易。
数据分配均匀。
请求均匀性比第一种方式更好(一般不会出现都是对某个字段取模后只是奇数或者偶数请求非常活跃的清理)
缺点:
数据的拓展性比较差,如果数据量持续增大,hash规则需要变动时,可能需要进行数据迁移。
七: 水平拆分和读写分离的区别
作用:
提高数据库的性能
区别:
1、水平拆分中每个库只是存储部分数据,但是读写分离中库存储的是全部的数据。
2、水平拆分中各个服务器数据的总和就是数据的总和。
3、理论上来说,水平拆分后读写性能都会随之提升n倍(n是拓展的机器),但是读写分离中写的逻辑还是在主数据库,且每个库存储的数据都是全量,性能提升不会提升很高,但是读的性能会提升很高。
八: 谈谈懒加载
定义:
懒加载模式是bean在第一次调用时候被实例,而不是spring容器启动时候,默认是不开启的,官方描述:A lazy-initialized bean tells the IoC container to create a bean instance when it is first requested, rather than at startup。
作用:
是使用时再加载资源,可以提升加载速度,减轻服务器压力,提高用户体验
实现方式:
xml方式: 在bean的配置文件中设置lazy-init=true
注解方式: 在延迟加载类中使用@Lazy注解
九: 过滤器和拦截器的区别
过滤器(Filter):
在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
拦截器(Interceptor):
过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息。
相似之处:
1、两者都是AOP编程思想的一个落地实现。
2、两者都可以实现权限鉴定,日志记录等。
区别:
1、过滤器是基于函数回调,拦截器是基于反射。
2、过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器,它是spring框架支持的,所以它可以使用spring中的任何资源、对象如数据源、事务管理等。
3、拦截器可以获取IOC容器中的各个bean,而过滤器就不行,在拦截器里注入一个service,可以调用业务逻辑。
4、使用细节、范围不一样,过滤器只是在Servlet前后起作用,而拦截器能够在方法前后、异常抛出前后等地方使用,它具有更大的弹性。
5、拦截器是被包裹在过滤器之中的,具体图形如下((图来源于网络,侵删)
十: 如何给每个请求的url创建 一个唯一ID,这个代码应该创建在哪里
(一) 生成唯一ID的方案:
1、使用UUID(Universally Unique ldentifier),它是标准型式包含32个16进制数字,以连字号分为五段,形式为8-4-4-4-12的36个字符, 示例:110e8400-e29b-41d4-a716-446655440011
特点:
性能非常高:本地生成,没有网络消耗
唯一性但无序
2、使用Redis,通过INCR或者INCRBY命令生成唯一ID,因为Redis是单线程执行天然保证了原子性。
特点:
需要搭建集群保证高可用
生成唯一ID的地方:
因为需要对每个请求的url都生成一个唯一的ID,所以生成ID的代码应该存放在拦截器中,对所有的请求进行拦截并生成唯一的ID。
由于文章篇幅的限制,面试大全的第四章暂时到这里就告一段落。如果有意见或者建议,可以在下方或者私信留言,看到会及时回复,也欢迎大家参加面试挑战和面试题投稿,希望大家早日获得心仪的Offer,如果觉得文字对你有帮助,欢迎关注和点赞。
面试大全系列文章会保持稳定的更新速度,大概每周两更到三更,感兴趣和可以关注我。
如果想参加面试挑战,可以私信回复【面试挑战】即可,如果想进行面试题目投稿,可以私信回复【面试题目投稿】即可,如果想获取更多面试问题和资料,查看最新的面试题目更新进度,可以关注我,私信【面试资料】即可,谢谢大家的阅读和关注。
最后
笔者已经把面试题和答案整理成了面试专题文档
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
最后
笔者已经把面试题和答案整理成了面试专题文档
[外链图片转存中…(img-7OQ6dTrL-1713550306421)]
[外链图片转存中…(img-bl4O9Bhi-1713550306421)]
[外链图片转存中…(img-mrOstQOt-1713550306422)]
[外链图片转存中…(img-nbGJXK0g-1713550306423)]
[外链图片转存中…(img-fI6SJkxd-1713550306424)]
[外链图片转存中…(img-McAhd5uO-1713550306424)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-PeVawfEZ-1713550306425)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!