SpringCloud(0) —— 为什么要学习SpringCloud

1.回顾前面学习的知识点

  • JavaSE
  • 数据库
  • 前端
  • Servlet
  • Http
  • Mybatis
  • Spring
  • SpringMVC
  • SpringBoot
  • Dubbo、Zookeeper、分布式基础
  • Maven、Git
  • Ajax、Json

2.学习SpringCloud的基础

  • 数据库
  • Mybatis
  • Spring
  • SpringMVC
  • SpringBoot
  • Dubbo、Zookeeper、分布式基础
  • Maven、Git
  • Ajax、Json

3.为什么要学习SpringCloud

1.MVC三层架构

1.MVC三层架构

  • 首先SpringCloud是一个微服务架构,而我们最早接触的架构为:三层架构 MVC
  • 架构的本质:为了解耦,降低功能模块之间的耦合性

2.简化MVC三层架构的Spring

  • 升级三层架构 MVC,就是我们使用的框架,本质还是在使用三层架构MVC,只是简化了开发:
    • 粘合剂Spring:核心 IOC + AOP
      • Spring是一个轻量级的Java开源框架,也是一个容器;用于解决企业开发的复杂性
      • IOC:控制反转,实现方式DI(依赖注入),将原来要做的准本都丢给容器,要用东西直接去容器中取
      • AOP:切面,本质为动态代理(Proxy),为了在不影响原来的业务的情况下(不改源码),实现功能的新增
        • 比如:日志、事务等
      • 目的:解决企业开发的复杂性

3.简化Spring的SpringBoot

  • spring本意是简化开发,但是spring经过多年的发展,集成的东西越来越多,这使得它使用起来并不简单,使用的过程中涉及到了很多的配置文件的配置

  • 这偏离了spring本来简化开发的目的, 简化MVC三层架构开发的作用越来越弱,所以出现了springBoot,用于简化使用spring的时候对配置文件的配置

  • SpringBoot:新一代的Java EE开发标准,开箱即用(因为自动帮我们配置了很多的东西,所以可以开箱即用)

  • 最大的特点就是"自动配置/装配",所以SpringBoot的约定大于配置

  • 注意:SpringBoot不是一个全新概念,它是为了简化现在使用起来越来越复杂的spring而诞生的,所以SpringBoot就是Spring的一个升级版

  • 小结:传统的三层架构MVC用于将企业Java开发分层,各层之间子职责清晰,但是代码量庞大且冗余, 所以出现了spring,用于简化企业开发的代码,但是经过多年发展spring需要配置的文件越来越多,所以出现了springBoot,用于简化使用spring的时候对配置文件的配置

2.新的架构:微服务架构

1.为什么需要新的架构

  • 但是SpringBoot本质终归还是在对原来的三层架构MVC的开发做简化,还是使用的传统的开发架构, 因为传统的开发架构本质就是All in one,即一个项目作为一个整体进行开发和部署,整个项目需要作为一个 整体部署在一台服务器上,当这一台服务器支持不了当前用户量的时候我们的解决办法就是"横向"的扩展服务器
  • 一台服务器不够就再加一台服务器,但是加上服务器之后就需要考虑负载均衡问题;说白了就是在服务器集群前面加一个程序,程序根据算法实现,用于保证后面的一大堆服务器被雨露均沾,不会出现一台服务器上的资源都要被耗光了,另一台服务器上的资源还没用的情况
  • 但是一旦出现了整个服务中的某一个模块需要升级改造,后果就是整个项目的所有服务停机,一般看到的就是"我们需要停机维护XXX的时间",在这个期间,公司的服务器是停止向用户提供服务的,这对于用户体量很大,或者说国际化的公司来说是不能忍受的,因为停止服务就会出现客户流失的风险;除此之外还有很多其他的原因,比如可能我只需要这个项目中某一个模块的功能,但是为了正常运行我需要部署整个项目等
  • 所以为了解决这个问题,提出了新的开发架构 —— 微服务架构

2.什么是微服务架构

  • 微服务架构,一个你没见过的传心版本,它的特点就是"模块化、功能化"
  • 微服务架构的本质:将原来的整体项目划分成多个功能模块,一个功能模块就可以独立运行提供服务
  • 比如现在我们需要开发一个管理系统,这个系统有用户模块、支付模块、签到模块…, 但是在实际的使用中,我们发现,用户和支付模块使用远高于签到模块;
  • 在微服务架构中我们就给用户和支付模块多一些服务器去支撑运行,给签到模块少一些服务器去支持它的运行;而按照原来MVC三层架构,不管你的签到功能使用的频率是多大,只要你部署服务,签到都要占用服务器一部分资源,多台服务器上被占用的资源累加起来可能就是好几台服务器的资源量,而实际用户的使用量一台服务器就能满足,这样看来原来的MCV三层架构不就是对于资源的一种浪费了吗?所有微服务架构势在必行

3.微服务架构的需要解决的问题

  • 但是微服务架构就出现了新的问题,如果要使用复杂功能,那么各个模块/单独的项目之间怎么通信?怎么交互?
  • 这个是微服务架构中显而易见的问题,微服务架构中的问题可以分为如下的4类

微服务的四个核心问题?

  1. 服务很多,客户端怎么访问?
    (怎么获取服务?设置注册中心,用户请求都发送到注册中心,再由注册中心分发用户请求到具体服务器)
  2. 这么多服务,服务之间如何通信?(服务之间怎么通信?)
  3. 这么多服务,如何管理?(对于这么多服务怎么统一管理?设置一个统一的服务管理平台,比如zookeeper)
  4. 服务挂了怎么办?(服务器崩溃、断电之后怎么应对?熔断机制)

4.微服务架构问题解决办法/方案

  • 微服务的四个核心问题的解决方案:
    Spring Cloud 是一套生态!专门用于解决微服务的四个核心问题的生态
  • 学习SpringCloud的前提是学习SpringBoot,原因就是因为SpringCloud是基于SpringBoot的

SpringCloud(0) —— 为什么要学习SpringCloud

1.SpringCloud NetFilx(第一套SpringCloud生态)

NetFilx公司推出了一套解决SpringCloud生态,或者说一站式解决微服务架构中问题的方案,我们要使用直接拿来使用即可

  • 问题1:服务很多,客户端怎么访问?
    • API网关,实现统一服务治理,使用zuul组件
  • 问题2:这么多服务,服务之间如何通信?
    • 网络通信都是基于HTTP的通信,NetFilx推出了一个自己对HTTP的包装版Feign(Feign基于HttpClient,HttpClient基于HTTP),通信方式:同步并阻塞
  • 问题3:这么多服务,如何管理?
    • 服务注册与发现,使用插件Eureka解决
  • 问题4:服务挂了怎么办?
    • 熔断机制,Hystrix
  • 但是2018年12月,NetFilx宣布无限期的停止对于SpringCloud NetFilx的维护,停止维护就会导致解决方案和当前技术的脱节,最大的隐患就是出现了新的安全问题,但是原来的解决方案没有应对机制,而安全是一个公司应该注重的根本,所以现在很多公司又不使用它了
2.Apache Dubbo zookeeper(第二套SpringCloud生态)
  • 问题1:服务很多,客户端怎么访问?
    • API网关,没有,要么使用第三方的组件实现,要么自己实现
  • 问题2:这么多服务,服务之间如何通信?
    • Dubbo:高性能的基于Java实现并开源的RPC通信框架,简单易用且专业
  • 问题3:这么多服务,如何管理?
    • 服务注册与发现,使用第三方的zookeeper(Hadoop、Hive等),下载安装即可使用
  • 问题4:服务挂了怎么办?
    • 熔断机制,没有,要么使用第三方的组件实现,要么自己实现,一般都是借助NetFilx的熔断机制
  • 可见Apache的SpringCloud生态并不完善,虽然问题2和3解决的比较好,但是1和4都是需要依赖其他的第三方,不是自己出来的一套完整的解决方案
  • 即半自动的,需要整合别人的技术
3.SpringCloud Alibaba(第三套SpringCloud生态)
  • 一站式解决微服务架构中的问题,全部都是Alibaba自己给出的解决方案
  • 最新的SpringCloud生态,使用起来更简单,2019年第一代才出来
4.未来的SpringCloud生态(服务网格,Server Mesh)
  • 服务网格,下一代微服务标准
  • 什么是服务网格
  • 代表解决方案:istio【未来需要掌握的技术】
5.小结
  • 上面的解决方案其实都是在解决微服务架构中的4个问题,所以万变不离其宗,一通百通
    • API网格,服务的路由问题
    • HTTP或RPC来实现,实现跨服务器的调用/异步调用
    • 服务注册与发现,解决高可用问题
    • 熔断机制,服务降级
  • 为什么要解决上面的问题?因为网络是不可靠的,网络不可靠就导致了用户使用的时候,可能会丢包、丢帧、数据被拦截、数据出现丢失,这就降低了用户体验,我们要解决的就是让用户使用微服务架构的应用,但是感觉和使用单体应用一样,甚至更好
  • 所以我们可以通过学习最先出来的SpringCloud NetFilx,入门SpringCloud生态圈,然乎通过SpringCloud NetFilx作为跳板去学习其他的解决方案

5.需要区分的概念

集群、分布式和微服务的区别

  • 集群:同一个业务,部署在多个服务器上,一台服务器垮了,其它的服务器可以顶上来。
  • 分布式:一个业务分拆多个子业务,部署在不同的服务器上,分布式的每一个节点,都完成不同的业务,一个节点垮了,那这个业务就不可访问了。
  • 分布式是指将不同的业务分布在不同的地方。而集群指的是将几台服务器集中在一起,实现同一业务;简单说,分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率
  • 分布式和微服务的区别

4.常见面试题

  • 什么是微服务?
  • 微服务之间是如何独立通讯的?
  • SpringCloud 和 Dubbo有哪些区别?
  • SpringBoot 和 SpringCloud,请谈谈你对他们的理解
  • 什么是服务熔断?什么是服务降级?
  • 微服务的优缺点分别是什么?说下你在项目开发中遇到的坑
  • 你所知道的微服务技术栈有哪些?列举一二
  • Eureka和Zookeeper都可以提供服务注册与发现的功能,请说说两者的区别

上面的答案在学习Spring Cloud过程中会回答,注意边学习边思考