大家好,欢迎来到IT知识分享网。
本文主要用于自身现阶段比较迷茫,知识杂乱,不成体系,希望通过文章记录的方式,帮自己认清自己,同时也能够提升自己。不喜勿喷。
前言
网上培训机构非常多,每个机构都会针对各个定位出自己的一份学习架构路线。但是这个是别人的不是自己的,俗话说只有适合自己的才是好的。我希望自己能够找到属于自己的一条学习路线、也希望自己的技术知识能够形成自己的体系,让自己架构逻辑能够闭环。
一、我要怎么来构建自己的知识体系呢?
我做Java后端研发已经9年了,说长不长说短也不短了。学历不好,普通二本院校本科毕业,一直以来老是觉得低人一等。得不到大厂的面试机会、老是在小公司、外包公司兜兜转转,技术也没能有多大的提升、每天做着机械的事情。好了就不抱怨了,书归正传,不管怎样,这么多年几乎所有的项目架构都有经历、大部分技术也都使用过,借此机会也就整理一下,希望对自己有用。下面我根据自己经历和自己的理解列出了一下几个方面来构建自己的知识体系:
- 软件架构发展及其技术
- 语言基础
- 大数据架构发展
下面几个章节我将以时间的先后顺序来梳理。由于我的认知有限,如有错误请大家指正。
二、软件架构发展及其技术
1.单体应用架构
将业务功能集中在一个项目中开发,打包部署。(意思就是说,所有的功能在一个项目中进行实现,不用管复杂的架构设计,只需要创建一个项目,有功能就往这个项目里面加代码就ok了)。
特点
- 功能集成:所有功能集成在一个项目工程中,所有功能打在一个war包中部署到服务器。
- 简单直接:项目架构简单,前期开发成本低、周期短。
解决问题
- 适用于小型项目,快速开发并部署。
- 模块之间交互采用本地方法调用,开发效率高。
不足
- 复杂性高:对于大型项目,全部功能集成在一个工程中不易开发、扩展和维护。
- 版本迭代慢:每次修改或添加功能需要编译、部署整个应用,导致版本迭代速度变慢。
- 技术栈受限:只能使用一种语言开发,限制了技术选择的灵活性。
核心技术工具框架:
- Spring MVC
- Hibernate/MyBatis
- Eclipse
- Maven
- Git/SVN
2.分层应用架构
为了解决单体应用的复杂性,层次化架构被引入。这种架构将应用程序拆分为不同的层次,例如表示层、业务逻辑层和数据访问层。每个层次都有自己的职责和接口,可以独立地进行开发和测试。
特点:将应用程序拆分为不同的层次。
解决问题:层次化架构提高了代码的可维护性和可测试性。
不足:层与层之间的紧密耦合和依赖。
3.前后端分离架构
随着互联网的兴起,客户端-服务器架构成为主流。在这种架构中,应用程序被拆分为前端客户端和后端服务器两部分。客户端负责展示用户界面和处理用户交互,而服务器负责处理数据存储和处理,提供业务逻辑和服务。客户端和服务器之间通过网络进行通信。这种架构提供了更好的可伸缩性和灵活性,使得多个客户端可以同时访问服务器。
前面三种架构其实我认为从技术上是没有什么太大变化的,只是架构思想上的进化从面向对象设计、到了分层设计。
4.分布式架构
单体架构有着明显的缺陷,随着系统访问量的增多,这些缺陷越来越凸显,为了解决这些缺陷,架构升级了,变成了分布式架构。分布式,就是多个实例提供服务。下面我们来简单介绍下常见的一些解决方案。
特点
- 业务垂直拆分:按业务进行切割,形成小的单体项目。
- 系统间交互:系统之间通过网络交互来完成用户的业务处理,每个系统可分布式部署。
解决问题
- 解决了单体架构对于大型项目扩展和维护的困难。
- 通过分布式部署提高了系统的灵活性和可扩展性。
不足
- 数据冗余:系统之间存在数据冗余、功能冗余,耦合性高。
- 伸缩粒度不足:按需伸缩粒度不够,对同一个子系统中的不同业务无法实现按需伸缩。
5.SOA架构(面向服务架构)
SOA 是一种基于服务的架构范式,强调将功能模块化为可重用的服务。这些服务通过网络进行通信,并在需要时被动态地组合以满足业务需求。SOA 提供了良好的松耦合和可重用性。
特点
- 服务拆分:将不同业务功能按服务进行拆分,并通过定义的接口和协议进行连接。
- 灵活性强:各系统与服务之间采用webservice、rpc等方式进行通信,提供了更高的灵活性
解决问题
- 进一步降低了系统之间的耦合度,提高了系统的灵活性和可维护性。
- 使得每个服务可以独立地进行开发、测试、部署和扩展。
不足
- 接口复杂性:随着服务数量的增加,服务之间的接口关系可能会变得复杂,增加了管理和维护的难度。
- 性能挑战:在大量服务之间进行通信可能会对系统性能造成挑战。
SOA属于分布式架构的一种,SOA架构通过将系统分解为多个独立的服务,并通过网络连接这些服务以实现共同目标,这完全符合分布式架构的核心理念。因此,可以认为SOA架构是分布式架构在面向服务领域的一种具体实现。SOA架构使得系统更加灵活,能够更快地响应业务需求的变化。同时,由于服务之间的依赖关系松散,也使得系统的可维护性得到了提升。
6.微服务架构
微服务架构是分布式架构的深化,分布式架构偏向于部署和环境,比如上应用、数据库、缓存等,在多台机器上进行部署,就属于分布式。微服务架构通过业务拆分实现服务组件化,通过组件组合快速开发系统,业务单一的服务组件又可以独立部署,使得整个系统变得清晰灵活。大量的分布式服务又使得架构实现面临问题,如服务注册发现,服务统一接入和权限控制,服务的负载均衡,服务配置的集中管理,服务熔断,服务监控等。
所以微服务架构是由这些基础的服务组件和业务微服务组件共同组成:
服务注册发现组件:进行服务治理
服务网关组件:提供统一入口和权限控制
负载均衡组件:提供客户端或服务器端的负载均衡
集中配置组件:提供服务集中管理
熔断器组件:提供服务熔断
服务追踪组件:提供服务监控
特点
- 小型化:将软件应用程序开发为一套小型、可独立部署的模块化服务。
- 独立性强:每个服务都在自己的进程中运行,并与轻量级机制进行通信。
解决问题
- 提供了更高的灵活性和可扩展性,能够更好地应对业务需求的变化。
- 每个服务都可以使用最适合的技术栈进行开发,提高了开发效率。
不足
- 运维复杂:随着服务数量的增加,运维的复杂性和挑战性也会增加。
- 服务间通信:需要处理大量的服务间通信,可能增加系统的复杂性和故障点
7.领域驱动设计(DDD)
DDD 是一种以领域为中心的架构方法,关注业务领域的建模和设计。它强调将业务需求和软件设计紧密结合,通过定义领域模型和领域驱动设计的原则来实现高内聚和低耦合。
8.云原生架构
特点
- 可伸缩性:允许应用程序根据需求进行自动伸缩,以适应不同的负载情况。
- 弹性:通过容器化的方式将应用程序组件进行隔离,实现高度的弹性和可靠性。
- 高效的开发和部署:利用容器化和微服务架构,使得应用程序的开发、测试和部署变得更加简便和高效。
- 降低成本:通过自动化的方式管理和运维应用程序,减少了人工操作的需求,同时云平台的弹性计算能力也有效降低了硬件和基础设施的成本。
解决问题
- 提升了系统的可扩展性和灵活性,适应了现代应用程序的需求变化。
- 提高了系统的可靠性和容错性,减少了单点故障的风险。
- 简化了应用程序的开发、测试和部署流程,提高了开发效率。
- 降低了应用程序的运维成本,提高了资源的利用率。
不足
- 技术复杂性:涉及到多个技术领域,如容器化、容器编排、微服务等,对开发团队的技术素质要求较高。
- 安全性:开放性和分布式特性给应用程序的安全性带来了新的挑战。
- 性能管理:容器化和微服务架构使得应用程序变得更加复杂,如何有效地管理和调优性能成为挑战。
9.Serverless无服务器架构
特点
- 不关注底层基础设施:开发人员只需编写和部署函数,无需管理服务器资源。
- 自动弹性:根据请求量自动扩展和收缩,无需人工干预。
- 成本效益:按需计费,开发人员只需支付实际使用的资源。
- 简化运维:无需管理服务器和操作系统,大大简化了运维工作。
解决问题
- 使得开发人员能够专注于业务逻辑的实现,无需关心底层基础设施。
- 提高了系统的弹性和可扩展性,能够从容应对突发流量和负载波动。
- 降低了开发成本和运维成本,提高了资源的利用率。
不足
- 代码碎片化:可能导致代码难以统一管理和部署。
- 环境一致性:本地环境和线上环境可能存在不一致的问题,增加了调试和部署的难度。
- 安全性:虽然Serverless架构提供了很多安全特性,但仍然存在一些潜在的安全风险,如数据泄露、函数注入等。
- 冷启动时间:在某些情况下,Serverless函数可能需要一些时间来“冷启动”,这可能会影响应用程序的响应速度。
三、语言基础
主要针对我自己会的编程语言。
1.JAVA
1. 基础语法
- 编写与编译:Java代码保存在以“.java”结尾的源文件中,使用javac.exe命令编译Java源文件生成字节码文件,然后使用java.exe命令解释运行字节码文件。
- 命名规范:Java关键字所有字母都为小写;包名、类名、接口名、变量名、方法名、常量名等都有特定的命名规范。
2. 数据类型
- 基本数据类型:Java有八种基本数据类型,包括byte、short、int、long、float、double、char、boolean。其中,整型常量默认为int型,long型常量后需加‘l’或‘L’;浮点型常量默认为double型,float型常量后需加‘f’或‘F’。
- 引用数据类型:包括类、接口、数组等。
3. 运算符
- 算术运算符:如+、-、*、/、%等。
- 关系运算符:如>、<、==、!=等,用于比较两个值。
- 逻辑运算符:如&&、||、!等,用于组合多个条件。
- 位运算符:如&、|、^、~、<<、>>等,用于对二进制位进行操作。
4. 控制结构
- 顺序结构:程序从上到下顺序执行。
- 分支结构:包括if-else、switch-case等,根据条件选择执行不同的代码块。
- 循环结构:包括for、while、do-while等,用于重复执行一段代码直到满足某个条件。
5. 类与对象
- 类:对一类事物的描述,是抽象的、概念上的定义。
- 对象:是实际存在的该类事物的每个个体,也称为实例。
- 封装:将数据(属性)和操作数据的方法(行为)封装在一起,形成一个独立的单元。
- 继承:允许一个类(子类)继承另一个类(父类)的属性和方法。
- 多态:指同一个引用类型在使用不同的实例时可以有多种形态。
6. 异常处理
- Java通过异常处理机制来处理运行时错误。
- 使用try-catch-finally块来捕获和处理异常。
- 可以自定义异常类。
7. 多线程
- Java支持多线程编程,允许多个线程同时执行。
- 线程是CPU调度的基本单位,是操作系统能够进行运算调度的最小单位。
- Java提供了多种创建线程的方式,如继承Thread类、实现Runnable接口等。
8. 集合框架
- Java集合框架提供了一套用于存储和操作对象的接口和类。
- 主要包括List、Set、Map等接口及其实现类。
- 集合框架支持泛型,提高了代码的可读性和安全性。
9. IO流
- Java IO流用于处理数据的输入输出。
- 分为字节流和字符流两种。
- 字节流以字节为单位处理数据,字符流以字符为单位处理数据。
10. 网络编程
- Java支持TCP/IP协议栈,可以编写基于网络的应用程序。
- 提供了Socket和ServerSocket类用于实现TCP网络通信。
- 提供了DatagramSocket和DatagramPacket类用于实现UDP网络通信。
11. Java虚拟机(JVM)
- JVM是Java程序的运行环境,负责加载、解释和执行Java字节码文件。
- JVM提供了跨平台的能力,使得Java程序可以“一次编写,到处运行”。
12. 其他
- 泛型:Java 5.0引入的泛型允许在编译时检查类型安全。
- 注解(Annotations):Java 5.0引入的一种为代码添加元数据的机制。
- 枚举(Enumerations):Java 5.0引入的枚举类型提供了一种类型安全的枚举常量的方式。
- Lambda表达式:Java 8.0引入的Lambda表达式允许以更简洁的方式实现接口中的匿名内部类。
2.Python
1. 基础语法
- 注释:使用
#
进行单行注释,使用'''...'''
或"""..."""
进行多行注释。 - 变量:Python是动态类型语言,变量名由字母、数字和下划线组成,不能以数字开头,且大小写敏感。
- 空格缩进:Python使用缩进来定义代码块,通常使用4个空格作为一级缩进。
2. 数据类型
Python提供了丰富的数据类型,包括:
- 整型(int):用于表示整数,可以是正数、负数或零。
- 浮点型(float):用于表示带有小数部分的数字。
- 复数(complex):用于表示复数,包括实部和虚部。
- 布尔型(bool):用于表示布尔值,即True或False。
- 字符串(str):由零个或多个字符组成的有序字符序列,是不可变的。
- 列表(list):包含一组有序项的集合,每个项目可以是不同类型的数据,是可变的。
- 元组(tuple):与列表类似,但元组是不可变的。
- 集合(set):包含一组无序且不重复的元素。
- 字典(dict):包含键值对的无序集合,键和值之间用冒号分隔,元素之间用逗号分隔,整个字典包含在花括号中。
3. 运算符
- 算术运算符(
+
、-
、*
、/
、//
、%
、)
- 比较运算符(
==
、!=
、>
、<
、>=
、<=
) - 逻辑运算符(
and
、or
、not
)。
4. 控制结构
- 顺序结构:按照代码顺序执行。
- 分支结构(选择结构):使用
if
、elif
、else
等关键字根据条件选择执行特定的代码块。 - 循环结构:使用
for
循环和while
循环在满足一定条件下重复执行某段代码。
5. 函数与模块
- 函数:是一段可重复使用的代码块,可以接收输入参数并返回结果。使用
def
关键字定义函数。 - 模块:Python通过模块的方式组织代码,方便功能的封装和复用。可以使用
import
语句导入已有的模块。
6. 面向对象编程
Python支持面向对象编程(OOP),包括类(class)、对象(object)、继承(inheritance)、封装(encapsulation)和多态(polymorphism)等概念。
7. 文件操作
Python提供了丰富的文件操作函数,可以读取、写入、追加和删除文件内容。
8. 异常处理
Python通过try...except
语句对可能出现错误的代码进行捕获和处理,提高了程序的健壮性。
9. 网络编程
Python支持TCP/IP协议栈,可以编写基于网络的应用程序,如网络爬虫、Web服务器等。
四、大数据架构发展
1.传统离线大数据架构
传统离线大数据架构是大数据领域在初期阶段广泛采用的一种架构模式,它主要针对批量处理和T+1数据处理等场景设计。主要服务于大规模数据的批量处理和分析需求,不强调实时性,而是追求高吞吐量和数据处理的规模。
- 数据采集:数据通常通过ETL(Extract, Transform, Load)过程从各种源系统(如数据库、日志文件、传感器等)收集,然后汇聚到中央存储系统。工具如Apache Sqoop常用于从关系数据库导入数据到Hadoop HDFS。
- 数据存储:Hadoop Distributed File System (HDFS) 是最为核心的部分,它提供了分布式、高容错性的存储解决方案,能够存储PB级别的数据。HDFS设计为一次写入多次读取的模式,非常适合批量处理。
- 数据处理:Apache Hadoop MapReduce 是最早期的大数据处理框架,它允许在分布式环境中对数据集进行并行处理。开发者编写Map和Reduce函数来实现复杂的数据处理逻辑。后来,Apache Spark 凭借其内存计算和更高级的API逐渐取代MapReduce,成为更受欢迎的数据处理引擎。
- 数据仓库:为了便于数据分析,数据通常被加载到数据仓库中,如Apache Hive 或者 HBase。Hive 提供了一个类似SQL的查询语言(HiveQL),使得数据分析人员可以使用熟悉的SQL来查询存储在HDFS上的数据。而HBase是一个分布式的、面向列族的NoSQL数据库,适用于随机读写访问模式。
- 数据集市与BI工具:经过数据仓库处理后的数据,可能会进一步被抽取到数据集市中,以支持特定业务部门的分析需求。商业智能(BI)工具如Tableau、Power BI等,可以用来创建报表和仪表板,帮助业务人员进行数据可视化和决策分析。
- 调度系统:为了自动化处理任务,如定时的数据加载、处理作业等,通常会使用调度工具,如Apache Oozie 或者 Airflow,来管理这些任务的执行顺序和依赖关系。
- 元数据管理:随着数据规模的扩大,元数据管理变得尤为重要。Apache Atlas、Hive Metastore等工具帮助管理数据的元数据信息,如表结构、字段描述等,便于数据的发现和理解。
优点:
批量计算性能高。
适合做批量数据的聚合分析计算。
缺点:
不支持实时业务数据的开发。
数据处理存在滞后性,对于实时性要求高的数据来说,这种滞后性是无法容忍的。
批处理需要等待数据积累到一定量后再进行处理,导致数据从头到尾下来需要等待和处理较长的时间。
2.Lambda架构(离线处理+实时链路)-传统实时开发架构
Lambda架构是一种结合了离线处理和实时链路的大数据架构,旨在解决传统离线大数据架构在实时性方面的不足。该架构由Nathan Marz提出,主要分为三层:批处理层(Batch Layer)、实时处理层(Speed Layer)和服务层(Serving Layer)。
Lambda架构由三层系统组成:
- 批处理层(Batch Layer):负责处理历史数据以及新到达的数据,确保数据的完整性和一致性。此层主要用于离线处理,使用如Hadoop MapReduce、Apache Spark等工具进行大规模数据的批量处理。处理后的数据被存储在一个持久化的历史数据库中,例如Hadoop HDFS或Amazon S3,这个存储被视为“真理来源”(the source of truth)。定期(如每天)运行批处理作业,对历史数据进行重新计算,并加入新的数据,生成一个全新的视图。
- 实时处理层(Speed Layer):处理实时数据流,提供近实时的查询结果。这一层通常采用如Apache Kafka、Apache Storm或Apache Flink等实时流处理框架。实时处理层对新到来的数据进行快速处理,但并不保证数据的完全精确性,而是追求低延迟。实时处理的结果可能存储在内存数据库(如Redis)或快速访问数据库(如Cassandra)中,以快速响应查询。
- 服务层(Serving Layer):作为查询接口,为外部应用或用户请求提供数据。它从批处理层和实时处理层中读取数据,融合两者的输出,提供最新的数据视图。当有新的查询时,服务层会查询实时层获取最新的数据,同时查询批处理层以获得完整的数据视图,然后将两者的结果合并,提供给用户。为了提高响应速度,服务层通常会利用缓存技术(如Memcached、Redis)来存储频繁查询的结果。
Lambda架构的优点
灵活性:结合了批处理的准确性和实时处理的时效性,能够处理各种类型的数据处理需求。可以根据需求进行定制和优化。
容错性:即使实时层出现故障,仍可以从批处理层获取完整的数据视图,保证数据的可靠性。对硬件故障和人为失误有很好的容错性,确保数据处理的稳定性和可靠性。
扩展性:每一层都可以独立扩展,适应数据量和查询量的增长。
技术无关性:Lambda架构是一种通用的模式,不依赖于任何特定的技术,任何满足需求的技术都可以在Lambda架构中应用。
缺点
复杂性:维护三个独立的层次增加了系统的复杂度和开发运维的难度。
数据不一致:实时层和批处理层可能存在数据不一致的问题,需要在服务层进行数据合并时特别注意处理。
重复开发:某些业务逻辑可能需要在批处理和实时处理两层中分别实现。
3.Lambda架构(离线数仓+实时数仓)
1.离线数仓(Batch Data Warehouse)
目标:主要是处理历史数据,用于深度分析、报表生成、复杂查询等需要处理大量数据的任务。
技术栈:基于Hadoop HDFS、Apache Hive、Spark SQL或者传统的数据仓库系统如Teradata、Oracle Exadata等。这些系统擅长处理大规模数据集,但处理时间较长,不适合实时查询。
更新频率:通常是定时任务,如每日、每周更新,确保数据的全量刷新。
2.实时数仓(Real-time Data Warehouse)
目标:专注于近实时或实时数据分析,提供秒级或亚秒级的查询响应,适用于监控仪表板、实时决策支持系统等场景。
技术栈:采用流处理技术如Apache Kafka、Apache Flink、Spark Streaming或者专门的实时数据库如Druid、ClickHouse、InfluxDB等。这些技术能够处理高速数据流,并且支持复杂的事件处理和即时查询。
更新机制:数据一旦进入系统,几乎立即可用,通过连续查询或流式计算保持数据的实时性。
4.Kappa架构
Kappa架构通过专注于流处理,为实时处理提供了Lambda架构的简化替代方案。它旨在通过简化数据处理流程,减少维护成本和复杂性,同时仍能支持实时和历史数据分析的需求。Kappa架构的核心理念是“一切皆流”,它摒弃了独立的批处理层,将所有数据都作为无限的事件流引入和处理,从而简化了整体系统设计,降低了操作复杂性。
Kappa架构主要由以下几个部分组成:
- 流引入(Stream Ingestion):连续引入数据并存储在事件日志中,如Apache Kafka,作为持久、容错的存储机制。数据源可以是任何产生流式数据的系统,如传感器、日志文件、消息队列等。
- 流处理(Stream Processing):使用事件日志中的数据,应用实时计算,并生成所需的输出。常用的流式处理引擎有Apache Kafka Streams、Apache Flink等。
- 输出服务(Serving Layer):处理后的数据通过各种输出通道访问,包括实时仪表板、API或数据接收器,供进一步分析或使用。
优点
简化架构:相比于Lambda架构,Kappa架构更为简洁,减少了系统间的复杂交互和数据冗余。降低了操作复杂性。
一致性保证:由于所有处理都是基于同一个数据流,理论上可以更容易地保证数据处理的一致性和完整性。
灵活扩展:易于扩展以应对数据量的增长和处理逻辑的变化,因为所有组件设计为可水平扩展。
低延迟处理:数据近乎实时处理,无需批量计算,提供低延迟的洞察力。
缺点
资源消耗:对于长期存储和重放整个事件流可能需要较大的存储空间和计算资源。Kafka不能支撑海量数据存储
处理延时:对于某些需要即时访问历史数据的场景,重放整个流可能导致处理延时较高。Kafka无法支持高效的OLAP
无法复用数据血缘管理体系
Kafka不支持数据更新
5.湖仓一体实时数仓架构
湖仓一体实时数仓架构是一种现代数据架构,它将数据湖(Data Lake)和数据仓库(Data Warehouse)的功能进行了融合,旨在提供一个既具备数据湖的灵活性和低成本存储,又具有数据仓库的高性能分析和管理能力的统一平台。该平台支持实时数据的接入、存储、处理和分析,同时提供数据仓库的查询和分析能力。
- 统一存储层:使用支持多种数据格式(如Parquet、ORC)的存储系统,如Hadoop HDFS、AWS S3或Azure Data Lake Storage,实现数据的低成本、高扩展性存储。
- 数据湖引擎:如Apache Spark、Delta Lake、Hudi等,提供事务处理、版本控制、数据合并(upsert)等能力,使得数据湖更适合作为企业级数据处理平台。
- 实时数据流处理:集成Apache Kafka等消息队列,结合Spark Streaming、Flink等流处理框架,实现实时数据的捕获、转换和加载(ETL)。
- 数据仓库服务:在湖仓一体架构中,数据仓库功能直接构建于数据湖之上,如Snowflake、Databricks、MaxCompute等云原生数据仓库服务,提供高性能SQL查询和企业级分析能力。
- 元数据管理与治理:利用Apache Atlas、Hive Metastore等工具管理元数据,实现数据的发现、理解和血缘分析,支持数据质量控制和合规性要求。
- 安全性与访问控制:通过Kerberos、OAuth、RBAC等机制确保数据访问的安全性,支持细粒度的权限管理。
解决问题:
1.统一存储
2.Kafka存储量小
3.任意分层都可以OLAP数据分析
4.复用同一套相同的血缘关系
5.实时数据更新
缺点:
数据存储速度不如Kafka快
总结
今天理一下我的整体知识架构,以后会针对每个架构、语言涉及到的技术、框架、中间件、数据库进行知识整理。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/151025.html