仅供参考的Java学习路线
在学校学习了那么久的java,也做了一些项目。平时也看一些教程视频,但是还是感觉知识都是碎片一样,无法拼接起来,最后还是发现我仅仅只是会用java而已。照猫画虎地构建项目,点这个点那个,然后就开始写代码。我感觉现在自己和刚进入学校的自己并没有什么进步,只是换了一种语言写代码而已,好像真的没有什么区别。
在学习路上有人能帮助指导一下是非常好的一件事,庆幸我遇到了很多有经验的人,感谢他们给予我的帮助。
通过这段时间的所见所闻所学,以及自己的一些感悟。我力求在最短的时间内将自己的学习路线确定好,以便能快速并精确地投入学习中。
我该学啥
java该学的东西其实很多论坛博客都已经讲过了
我认为大概就是这些
第一阶段
JavaSE的核心知识,如IO流、内存结构、多线程等等
数据库,一些常用的Sql和NoSql数据库
设计模式
第二阶段
JavaWeb
前端知识
第三阶段
Maven、Git
Spring、SpringMVC、MyBatis
第四阶段
SpringBoot、Mybatis-Plus
进阶的框架、三方框架
第五阶段
MQ
分布式
zookeeper + Dubbo
微服务
SpringCloud Alibaba + nacos
云开发
k8s
docker
一下子看到这么多东西要学,肯定头都要炸了,所以需要先介绍一下每个东西是干什么的,不用细究,了解即可
首当其冲是JavaSE基础
最开始要学的当然是Java的基础部分,这样子可以让我们对 Java 语言有一个初步的了解。其实不同语言之间的语法都大同小异,如果有学过其他语言,那这部分是很快就能理解
还有一些知识像如IO流、内存结构、多线程等等,可以重点去学习
接下来是学习数据库
数据库有 关系型数据库(sql)
和 非关系型数据库(nosql)
数据库,他们之间是一个互补
的关系,并不对立。
数据库是用来进行数据持久化
的,因为java运行在虚拟机上,虚拟机基于内存运行,内存一释放,数据就没有了,所以数据库就是把数据转移存到硬盘上持久保存,而且大部分数据库引擎支持对数据进行增删改查(CRUD)
操作,十分方便。
sql的一些特点(Oracle、MySQL…)
- 行列式表存储
- 结构化数据,不支持非结构化数据
- 结构化:每条记录的结构都一样
- 需要预定义数据类型
- 数据量和查询量都不大,如果数据量大要做分表
- 对数据一致性、完整性约束、事务性、可靠性要求比较高
- 一致性:读到的是否最新写入的数据
- 事务性:是否允许部分成功(一个事务由多个操作组成时)
- 实时性:对读写延迟是否要求
- 可靠性要求:数据丢失是否容忍
- 支持多表 Join 操作
- SQL 的增删改查功能强
- 较为通用,技术比较成熟
- 大数据量性能不足
- 高并发性能不足
- 扩展困难
nosql的一些特点(Redis、MongoDB…)
- 表的结构比较灵活,比如列存储,键值对存储,文档存储,图形存储
- 支持非结构化数据
- 有的不需要预先定义数据类型
- 支持大数据量
- 多数都支持分布式
- 扩展性好
- 基本查询能力,高并发能力比较强 (因为采用非结构化、分布式,并牺牲一致性、完整性、事务性等功能)
- 对数据一致性要求比较低
- 通常不支持事务性,或是有限支持
- 通常不支持完整性,复杂业务场景支持较差
- 通常不支持多表 Join,或是有限支持
- 非 SQL 查询语言,或类 SQL 查询语言,但功能都比较弱,有的甚至不支持修改删除数据
sql可以学习 MySQL
和 Oracle
,
它们都是广受企业欢迎的数据库,其中```MySQL```是目前应用最广泛的开源关系数据库
nosql可以学习 Redis
和 Elasticsearch
,
```Redis```是一个 ```键值```存储系统,是跨平台的非关系型数据库,可用作数据库,高速缓存和消息队列代理。作为当下主流的缓存技术,已经成为互联网企业的不二首选。
开源的```Elasticsearch```是目前全文搜索引擎的首选。可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。
JavaWeb学习
我觉得学习javaweb还是要了解它的发展,回顾过去,理解当下,展望未来
javaweb最开始接触到的就是Servlet+JSP + JDBC这三个技术,由于没有统一的规范,出现不可名状bug,屎山代码等情况,以及一些“依靠bug跑起来的项目”梗
为了规范服务端的代码,程序员创造出了MVC设计思想
Controller层:servlet用来处理来自页面的请求,并调用对应的Model,并将结果返回View
View层:jsp是java端的服务页面
Model层:jdbc使用java语言访问数据库,并返回结果
java语言以面向对象为核心原理,开发中不断封装管理维护对象。在每次在controller层使用model层对象需要new一个对象,混乱难以管理
为了方便管理,于是就有了Spring,具体使用IOC容器管理对象(bean)
这样需要使用对象时,就不需要new了,直接从容器里拿取。当然Spring作用不止于此,它还能为我们提供很多有用的扩展功能。像这样为我们提供很多有用的扩展功能的东西,称之为框架
随着框架推出,极大方便了程序员的开发,不用每次都从头搭建环境。于是各种各样的框架也相继推出
Struts框架替代servlet原生开发
Mybatis/Hibernate框架替代jdbc原生开发
Struts
Servlet原生开发,一个servlet类对应一个请求处理,需要servlet类继承HttpServlet类并重写doGet/doPost方法来实现get/post请求处理。并使用注解配置映射或者写进xml配置文件。servlet一多,管理起来相当麻烦
于是就有了struts,用一个配置文件管理所有的servlet
Struts后面被更方便的SpringMVC取代
Mybatis/Hibernate
原生jdbc书写麻烦,还要手动回收释放数据库连接资源,为了方便就出现了Mybatis/Hibernate来简化jdbc操作
一个项目使用那么多框架,为了统一管理,spring牵头,将各种框架的放进IOC容器统一管理,想用哪个框架的功能只需要和Spring沟通,于是就有了框架整合开发SSHStructs + Spring + Hibernate
和SSMSpringMVC + Spring + MyBatis
前后端分离
虽然这么多优秀框架带来了诸多优势,但是前后端问题依旧存在:后端写jsp交给服务器渲染成html后再交给前端浏览器显示,压力集中在服务器。而且jsp中java和html混合写,会加大前后端人员的沟通成本,非常不方便。
于是就开始有前后端分离的想法出现了,后端只负责处理数据,然后传回结果。前端负责渲染页面,有数据需求就发送请求给后端等待结果即可。
部分分离
ThymeLeaf模板引擎
的出现解决了部分问题,他写出来的页面除了需要后端数据的地方之外
可以直接被浏览器渲染,方便前端人员调试工作。不过要最终渲染还是得经过服务器获得数据
Spring生态圈统一
Spring要去整合其他框架,是利用IOC来管理这些对象的,这些对象也被称为Bean。
在最早期,Spring只能用XML的方式来配置,bean的数量多了一堆配置看起来十分复杂
SpringBoot出现
SpringBoot基于Spring,简化了Spring与其他任何框架整合的难度,通过自动化配置的方式来大幅度简化一个Web应用程序的开发。想快速搭建一个Web场景的应用,你只需要导入spring-boot-starter-web的Maven依赖即可
此外,Spring Boot程序还集成了内部的Tomcat,这就意味着你可以直接把一个Web程序打包成一个可执行的jar包,随处使用
还有一点,SpringBoot不再支持JSP了
前后端彻底分离
当前后端分离的概念推出来以后,前端就一直在思索,能不能彻底的告别后端,自己单开一个项目?毕竟像Thyme leaf那些,页面也是写在后端项目里面的。
于是前端框架就来了
现在是Vue,React,Angular三大JS框架在前端三分天下,所以现在的主流开发模式已经转化为,前端单独一个前端项目,后端单独一个后端项目,前后端通过接口来进行数据交互,交互格式基本以JSON为主。
MQ消息队列
消息队列(Message Queue,简称MQ),指保存消息的一个容器,本质是个队列。
既是大型分布式系统不可缺少的中间件,也是高并发系统的基石中间件。
向消息队列中存放数据的叫做生产者,从消息队列中获取数据的叫做消费者。
一般用于:异步,解耦,削峰,日志四种场景
异步
将非核心流程异步化,提高响应速度
买菜+煮饭+洗衣服-->买完菜躺沙发休息(煮饭洗衣交给电饭煲加洗衣机解决)
注册+短信通知+新人福利发放-->注册完结束(列队内短信通知和福利发放异步进行)
解耦
上游服务发送消息后不用与下游联系,每个成员不必受其他成员影响,实现上下游解耦
削峰
系统的峰值流量往往集中于一小段时间内,所以为了防止系统在短时间内的峰值流量冲垮,往往采用消息队列来削弱峰值流量,相当于消息队列做了一次缓冲。
日志处理
日志处理是指将消息队列用在日志处理中,解决大量日志传输的问题。
分布式分散服务器压力
分布式的核心就一个字:拆。只要是将一个项目拆分成了多个模块,并将这些模块分开部署,那就算是分布式。有水平拆分和垂直拆分。
水平拆分:可以将一个项目拆分成 表示层(jsp+servlet)、业务逻辑层(service)和数据访问层(dao),然后再分开部署:把 表示层 部署在一个服务器上,把 业务逻辑层 和 数据访问层 部署在另一台服务器上,然后两服务器之间通过dubbo等RPC进行进行整合
垂直拆分:根据业务进行拆分。例如,可以根据业务逻辑,将“电商项目”拆分成“订单项目”、“用户项目”和“秒杀项目”。显然这三个拆分后的项目,仍然可以作为独立的项目使用。像这种拆分的方法,就成为垂直拆分。
微服务分散服务器能力
微服务可以理解为一种非常细粒度的垂直拆分。与分布式类似,但微服务可以分散在多个服务器,也可以在同一台服务器
随着互联网的发展,单体服务架构
已经很难满足市场对技术的需求,服务不断的被拆分和分解,粒度也越来越小,分布式,SOA等,直到微服务架构的诞生。
微服务提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。
满足如下条件:
- 高可维护性和测试性
- 松耦合性
- 可独立部署
- 围绕业务能力进行组织
- 一个小团队对其完全负责 微服务架构能够快速、频繁和可靠地发布大型的复杂应用系统,也能够使得组织可以进化出自己的技术栈。
ZooKeeper
Zookeeper最早起源于雅虎研究院的一个研究小组。研究人员发现,在雅虎内部很多大型系统基本都需要依赖一个类似的系统来进行分布式协调,但是这些系统往往都存在分布式单点问题(只有一个主节点负责分发任务给处理任务的节点,它挂了系统就完了)
。所以,雅虎的开发人员就试图开发一个通用的无单点问题的分布式协调框架,以便让开发人员将精力集中在处理业务逻辑上。
ZooKeeper 是一个分布式的,开放源码的分布式应用程序协同服务框架。ZooKeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。
该框架能够保证分布式环境中数据的一致性,使得ZooKeeper成为了解决分布式一致性问题的利器。
很多分布式协调服务都可以用 ZooKeeper 来做,其中典型应用场景如下:
数据发布/订阅
负载均衡
命名服务
分布式协调/通知
集群管理
Master 选举
分布式锁
分布式队列
······
zookeeper的znode可以存储数据,数据保存在内存中,保证了高吞吐量
和低延迟
,但其定位不是通用数据库,应将其用于存储和协同相关的关键数据。在 ”写“ 发生后,ZooKeeper集群会自动进行数据的同步,所以在“读”多于“写”的应用程序中尤其地高性能,但也不适合用于大数据量存储
当ZooKeeper启动时,默认情况下它会从磁盘加载先前保存在内存中的数据。一旦ZooKeeper开始处理客户端请求,它会将所有更改记录在内存中,并异步将这些更改写入磁盘,进行持久化操作。
ZooKeeper 本身就是一个分布式程序,只要半数以上节点存活,ZooKeeper 就能正常服务
Dubbo
分布式服务框架(RPC)
出现后,核心业务被抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。当服务越来越多,容量的评估
,小服务资源的浪费
等问题逐渐显现,此时需增加一个调度中心
基于访问压力实时管理集群容量,提高集群利用率。用于提高机器利用率的资源调度和治理中心
是关键。于是,面向服务的架构(SOA)
出现,通过ESB总线连接将服务在一起
dubbo是一个prc远程服务调用框架,分布式水平拆分后,表示层
和业务逻辑层、数据访问层
并不在同一台服务器,此时通过在服务端和客户端配置dubbo,可以远程调用服务,还可以配置负载均衡策略。
但是服务节点增加时,需要修改配置文件里的地址。
或者一个服务宕机后,发起调用者(服务消费者)不能感知,会继续发送请求。
这时候就可以配合zookeeper的注册中心
使用了,服务启动时会向注册中心注册
服务。服务消费者者在启动时,向注册中心订阅
自己所需的服务。注册中心返回服务提供者地址列表
给消费者,注册中心通过 长连接(传输数据后不关闭连接,方便复用)
感知服务提供者的存在,如果有变更,注册中心将基于长连接推送变更数据给消费者(例如某服务提供者宕机)。
SpringCloud
Spring Cloud 是一个服务治理平台,是若干个框架的集合,提供了全套的分布式系统解决方案。包含了:服务注册与发现、配置中心、服务网关、智能路由、负载均衡、断路器、监控跟踪、分布式消息队列等等。
SpringCloud一些核心组件
Eureka:服务发现和服务注册中心
Feign:使用动态代理
跟指定的服务建立连接、构造请求、发起靕求、获取响应、解析响应,等等
Ribbon:通过负载均衡
发送请求
Hystrix:通过很多仅用去请求
的小线程池
来发送请求,遇到问题可以及时隔离、熔断以及降级服务
zuul:作为整个应用的流量入口
,接收所有的请求,如app、网页等,并且将不同的请求转发
至不同的处理模块。
SpringCloud Alibaba
Spring Cloud 通过 Spring Boot 风格的封装,屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、容易部署的分布式系统开发工具包。
Spring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案,是阿里巴巴开源中间件与 Spring Cloud 体系的融合。
阿里开源组件
Nacos
:阿里巴巴开源产品,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Sentinel
:面向分布式服务架构的轻量级流量控制产品,把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。RocketMQ
:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。Dubbo
:Apache Dubbo™ 是一款高性能 Java RPC 框架,用于实现服务通信。Seata
:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。(我理解的是:解决操作的执行、检查以及回滚)分布式事务 Seata 及其三种模式详解 - 知乎 (zhihu.com)
阿里商业化组件
Alibaba Cloud ACM
:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。Alibaba Cloud OSS
:阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。Alibaba Cloud SchedulerX
:阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。Alibaba Cloud SMS
:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
SpringCloud常用组件
Spring Cloud Netflix Eureka
:服务注册中心。Spring Cloud Zookeeper
:服务注册中心。Spring Cloud Consul
:服务注册和配置管理中心。Spring Cloud Netflix Ribbon
:客户端负载均衡。Spring Cloud Netflix Hystrix
:服务容错保护。Spring Cloud Netflix Feign
:声明式服务调用。Spring Cloud OpenFeign(可替代 Feign)
:OpenFeign 是 Spring Cloud 在 Feign 的基础上支持了 Spring MVC 的注解,如 @RequesMapping等等。OpenFeign 的 @FeignClient 可以解析 SpringMVC 的 @RequestMapping 注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。Spring Cloud Netflix Zuul
:API 网关服务,过滤、安全、监控、限流、路由。Spring Cloud Gateway(可替代 Zuul)
:Spring Cloud Gateway 是 Spring 官方基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,Spring Cloud Gateway 旨在为微服务架构提供一种简单而有效的统一的 API 路由管理方式。Spring Cloud Gateway 作为 Spring Cloud 生态系中的网关,目标是替代 Netflix Zuul,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。Spring Cloud Security
:安全认证。Spring Cloud Config
:分布式配置中心。配置管理工具,支持使用 Git 存储配置内容,支持应用配置的外部化存储,支持客户端配置信息刷新、加解密配置内容等。Spring Cloud Bus
:事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化,可与 Spring Cloud Config 联合实现热部署。Spring Cloud Stream
:消息驱动微服务。Spring Cloud Sleuth
:分布式服务跟踪。Spring Cloud Alibaba Nacos
:阿里巴巴开源产品,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Spring Cloud Alibaba Sentinel
:面向分布式服务架构的轻量级流量控制产品,把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。Spring Cloud Alibaba RocketMQ
:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。Spring Cloud Alibaba Dubbo
:Apache Dubbo™ 是一款高性能 Java RPC 框架,用于实现服务通信。Spring Cloud Alibaba Seata
:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
云开发
云开发可以为Web、⼩程序、移动应⽤等提供可靠、丰富的⼀站式后端能⼒,并提供多语⾔ SDK,轻松开发多端应⽤。
开发者可以使用云开发开发微信小程序、小游戏、Web等,无需搭建服务器,即可使用云端能力。云开发为开发者提供完整的云端支持,弱化了后端和运维概念,无需搭建服务器,使用平台提供的 API 进行核心业务开发,即可实现快速上线和迭代。
我的理解:
减弱后端的存在,降低开发的门槛
Docker容器
出现在项目生命周期不同场景重复搭环境麻烦,环境差异导致运行情况不同,以及一台机器运行多个程序时的隔离问题
解决方法1:克隆虚拟机环境(优:程序运行时相互隔离,不用考虑环境搭建问题)(劣:笨重,操作系统还要占内存)
解决方法2:使用容器(优:程序运行时相互隔离,只隔离应用程序的运行时(环境库和配置)但容器之间可以共享同一个操作系统,轻量级且占用的资源更少)
docker将程序以及程序所有的依赖都打包到docker container,这样你的程序可以在任何环境都会有一致的表现,屏蔽环境差异
K8S
K8S,就是基于容器的集群管理平台,它的全称,是kubernetes。是为容器服务而生的一个可移植容器的编排管理工具
k8s集群主要包括两个部分:
一个Master节点(主节点)
API Server:是整个系统对外的接口,供客户端和其它组件调用,
Scheduler:负责对集群内部的资源进行调度
Controller manager:负责管理控制器
Etcd:主要用于配置共享和服务发现,解决的是分布式系统中数据一致性的问题
一群Node节点(计算节点)
Docker:用于创建容器
kubelet:主要负责监视指派到它所在Node上的Pod,包括创建、修改、监控、删除等
kube-proxy:主要负责为Pod对象提供代理
Fluentd:主要负责日志收集、存储与查询
Pod:封装了一个或多个容器的高级结构,相同Pod中的任何容器都将共享相同的名称空间和本地网络。容器可以很容易地与其他容器在相同的容器中进行通信,就像它们在同一台机器上同时保持一定程度的隔离。
看到这里,应该对java的各个技术的用途有个简单的了解了吧,脑袋里是不是清晰了一些呢?
最后
如果要学习Java的话,应该做好自己的规划。如果着急工作实习,我建议先学现在常用的框架和技术。也可以先去一些招聘网站上看一些公司的要求确定自己要学什么。去制作项目,后面再去巩固基础,加强理解。如果时间充裕的话,可以先巩固基础然后一步步深入,当然前面介绍的有些技术已经很少有人用,或者越来越被抽象变得易于使用,但是还是有必要了解一下的。而且要去不断学习新技术,掌握新的信息,毕竟以后说不定会有更强大的技术出现并取代现在的技术,我也在努力,一起加油吧!