【Overview】- 分布式系统架构核心技术总览

技术体系建设

最终目的是能够将各个技术点形成知识体系,有了足够的知识积累方能技术深入,对每个技术点的有研究,大致分为基础用法原理剖析,最终能够将文章组织的有条理

  • 基础用法
    • 基础使用
      基础框架类:这类属于基础框架,需要理解其具体的公开接口,了解其特性
      基础类产品:运维部署,通过其提供的第三方客户端实现连接redis,solr
    • 基础概念总结,例如ElasticSearch就是按照此种方法进行
    • 某个技术基础概念的衍生其背后必然有其设计原理在支撑,因此技术框架的实现原理显得尤为重要,帮助开发者加深对某一框架的使用深度以及调优【在产品类技术框架中出现较多例如elasticsearch
  • 原理剖析
    • 基础概念流程解析 基础框架类:了解在在不使用该框架时,如何自己实现其相关的功能,理解改框架的整体设计思想与架构
    • 基础概念背后的原理进行分析,例如MySQL系列文章
    • 源码解析
  • 解决方案
    • 疑难问题分析
    • 调优分析
  • 架构分析
    • 技术对比
    • 合理选型

基础理论

计算机基础理论是一个程序员的基本素养,是解决重大疑难问题基础,基础理论不要过多的死机硬背,要在实践中理解其设计原理,才能真正在实际工作中发现问题。能够将基础知识逐层串联,形成人类基本的认知规律,这时一种能力也是一种归纳总结的能力 是对未知领域探索的前提。

  • TCP/IP协议

第一部分

核心观点

  • 对于框架类产品要想深入使用其高级特性,必须理解其基本工作流程,进而能够灵活使用其提供的高级配置以及扩展点实现更加高级的功能。使用框架不外乎要在初始化时,进行必要的配置,因此配置设计显得尤为重要
  • 框架要解决的问题就是你平时在开发时遇到的问题,如果能有以前解决相关此问题经验也会使你加速理解框架的解决方案,只不过框架提供的解决方案考虑的更加周全,例如MyBatis动态SQL

技术精要

技术主要分为以下两类

  • 工程框架类技术: 这类技术需要深入理解其原理,最好是深入代码,因为工程类框架比较注重开发应用,必须理解其工程思想方能对其进行扩展,例如Spring家族,这类框架主要是工程类思想的框架,设计很多设计模式,需要理解其具体的流程,能够合理利用其提供的特性进行扩展
    • Spring
    • Spring Cloud
    • MyBatis
    • Shiro
  • 工程技术类产品: 这类产品一般是比较独立的产品方案,解决某一特定领域的问题例如数据库产品,消息中间件产品,web容器产品,要熟练并且搞笑使用这些产品,必须梳理清楚其背后的实现原理,有些产品可能涉及复杂的数据结构与算法,需要慢慢理解,梳理知识结构
    • 数据库类产品:Mysql,Redis
    • 消息中间件
    • Web容器:Tomcat,Jetty

关于新技术引入说明

任何一项新的技术引入必然有由某种需求驱动,因此在理解一项技术时,根据技术变迁的整体路径,分析它引入的原因,并有针对性的学习该新技术时如何驱动现有业务前行,最终形成自己的只是体系

  • 理解一项技术整体解决方案
  • 熟练掌握其基础特性,了解其常见的特性以及容易出现问题的地方
  • 深入使用其高级特性并对比其他方案,研究其优劣
  • 深入源码理解这些特性是如何实现的
  • 吸收其设计思想与方法
  • 积累特定领域问题的解决方案(例如秒杀场景)

技术的分类,大致分为如下两类

开发框架

为开发提供技术与方案设计,开发者如要知道该框架的实现原理,以便于更好的使用该框架提供的功能,并且在遇到问题时能够快速解决

  • Spring 家族系列框架,提供web开发脚手架,还有其他衍生的框架
    • Spring-WebMVC
    • Spring-Cloud
    • Spring-Boot
    • Spring 一系列子项目

基础项目

  • √ Netty 高性能网络库
    • Java NIO
  • Shiro 安全权限框架
    • RBAC权限架构
  • ORM 框架 MyBatis JPA Hibernate
    • JDBC 原生连接数据库
  • √ Hystrix 熔断 限流 降级
  • 任务调度框架 √ elastic-job
  • RPC框架√ Dubbo√ 魅族自研RPC框架Kiev
    • Netty
    • Spring Schema
    • 序列化技术
    • SPI

中间件项目

属于架构系列的项目,为开发提供完整的技术方案,这些产品有可能是提供一系列产品的易用性

  • 数据库中间件: sharding-jdbc
  • 分布式消息队列 Kafka RocketMq

以上框架产品需要结合自己的项目,集成其中发挥其作用

高性能架构产品

这类属于成熟的产品,多见于分布式系统领域,为企业提供成套的解决方案,这类产品属于某个领域的特定解决方案,为了实现在某一特定领域发展到一定程度后产生的技术革新,这类产品工程巨大,这类产品的学习 在把握其基本原理,能够熟练应用,并且能解决基本的问题,如果需要加深需要特定行业深入研究

  • 分布式文件系统 Hadoop
  • 分布式数据库 HBase
  • 分布式计算框架 Spark,Storm
  • √ 分布式搜索引擎 Solr,ElasticSearch

服务器产品

解决诸如高性能架构下问题,以及基本的数据架构,这里产品需要理解其背后的实现原理,方便以后进行问题排查分析

  • √ MySql 关系型数据库 主从复制,集群管理
  • √ Redis 内存型数据库 twproxy 实现redis横向扩容,集群管理
  • Nginx 高性能服务器
  • Tomcat,Jetty Web Serverlet容器

DevOps

  • Jenkins 持续集成工具
  • Maven Gradle 自动化构建工具
  • Docker 容器部署

架构设计

如何利用以上产品进行最优的组合设计出最适合当前业务的系统,最终实现高可用,高性能的服务器架构,同时注重积累优秀的组合解决方案

第二部分

分布式系统

构建分布式系统需要上面的各个组件的配合完成,分布式系统需要需要解决的核心问题及其对应的解决方案

分布式配置中心

  • Apollo

注册中心

服务注册与发现 Spring cloud Config,Eureka,Alibaba Nacos

分布式调用

  • Dubbo 微服务划分需要实现实现服务间高效的调用,需要选用RPC中间件

  • RestFul调用 Spring Fegin

服务负载

  • Ribbon

服务熔断

  • Hystrix

统一网关

  • Zuul

Spring Cloud 家族分布式核心组件

  • Eureka:各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里
  • Ribbon:服务间发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台
  • Feign:基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求
  • Hystrix:发起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题
  • Zuul:如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服务

NOTE: 拜托!面试请不要再问我Spring Cloud底层原理

快速构建微服务

  • Spring-Boot Spring-Boot,构建存java项目以及web项目,实现单独快速部署,这个是利用Spring家族快速集成rpc,配置中心等框架实现项目快速开发部署

分布式事务

引入微服务后,出现的数据一致性问题如何解决? 多个服务间调用如何保证数据的一致性

CAP理论

数据一致性-分布式事务

高并发

利用多级缓存实现系统高并发,本地缓存,redis缓存,数据库读写分离,分布分表,利用sharding-jdbc

高可用

服务熔断,降级,利用Hystrix实现服务限流,降级,监控

Spring Cloud

第三部分

持续集成DevOps

虚拟化技术

Kubenetes容器编排

云原生

围绕云原生的话题出现各种开源项目,容器化技术成熟以及k8s成为容器编排事实标准,传统SOA向service mesh转变催生各种技术名词的诞生

第四部分

资深工程师进阶

一个资深工程师需要在某一专业领域有自己的独到见解,在解决复杂问题时,能够独立使用工具,分析源码。这就要求其有扎实的基础知识,一直以来,在面试中,经常有问道诸如TCP协议,JVM相关基础知识,掌握这些基础知识是为了解决复杂问题,不是为了炫技。一旦真正的了解在现实问题中如何利用这些基本知识发现问题所在才能真正理解这些基本知识的核心要点,这也就是现在为什么有些人始终无法深入这些基础的原因所在。

知识体系进阶

基础数据结构->算法思想->网络编程,i/o->基础框架(Netty/Zookeeper)->基础中间件->项目实战

专业问题分析说明

后续将根据这里面的关键问题进行梳理,给出实际问题和解决步骤

分析问题工具篇

构建Java知识体系

这里面有关java面试的基本知识,但是最基本的还是如大家所说,平时多做积累,知识能够成体系,方能在遇到问题时,选择合适的解决方案,通过全局的把握能够体会不同技术间的差异

简历

优秀博客

Search

    Post Directory