tulip notes
首页
  • 学习笔记

    • 《Vue》
  • 踩坑日记

    • JavaScript
  • MQ
  • Nginx
  • IdentityServer
  • Redis
  • Linux
  • Java
  • SpringBoot
  • SpringCloud
  • MySql
  • docker
  • 算法与设计模式
  • 踩坑与提升
  • Git
  • GitHub技巧
  • Mac
  • 网络
  • 项目构建合集
  • 一些技巧
  • 面试
  • 一些杂货
  • 友情链接
  • 项目发布
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Star-Lord

希望一天成为大师的学徒
首页
  • 学习笔记

    • 《Vue》
  • 踩坑日记

    • JavaScript
  • MQ
  • Nginx
  • IdentityServer
  • Redis
  • Linux
  • Java
  • SpringBoot
  • SpringCloud
  • MySql
  • docker
  • 算法与设计模式
  • 踩坑与提升
  • Git
  • GitHub技巧
  • Mac
  • 网络
  • 项目构建合集
  • 一些技巧
  • 面试
  • 一些杂货
  • 友情链接
  • 项目发布
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Java

  • SpringBoot

  • SpringCloud

    • SpringCloud介绍
      • 什么是SpringCloud
      • 它解决的问题
        • 服务间的耦合
        • 繁多的配置
        • 与客户端的调用
        • 服务间的治理
        • 服务的崩溃
      • 它能做什么
      • 它的优缺点
      • 五大组件
      • springboot跟Cloud的区别
        • 从目的来说
        • 核心功能不同
        • 依赖关系
      • 自学参考资料
    • SpringCloud快速开始
    • Cloud最新组件说明
  • Mysql

  • docker

  • 算法与设计模式

  • 踩坑与提升

  • 后端
  • SpringCloud
EffectTang
2023-03-14
目录

SpringCloud介绍

# 了解SpringCloud

# 什么是SpringCloud

【SpringCloud官网】https://spring.io/cloud

它是一套管理多个微服务架构的解决方案,它依赖于SpringBoot,简单通俗的说就是用来管理多个微服务一起运行的模式,协调各个微服务之间的运行、服务发现、事件等等。它不是具体的框架,是一种管理手段——管理微服务的。

SpringBoot可以离开SpringCloud独立使用,开发项目,但SpringCloud离不开SpringBoot,属于依赖关系;

SpringBoot专注于快速、方便的开发单个个体微服务,SpringCloud关注全局的服务治理框架;

# 它解决的问题

  • 服务很多,客户端怎么访问
  • 这么多服务,服务之间怎么通信
  • 这么多服务,如何治理
  • 服务挂了,怎么办

# 服务间的耦合

随着单个微服务的增加(服务A调用服务B,服务B调用服务C和服务D……)服务和服务之间的调用关系就会越来越复杂,且随着服务化组件的不断增多,服务之间的调用关系在后期会成指数级别的增长。

最终导致——牵一发而动全身。经常出现由于某个服务更新而没有通知到其它服务,导致上线后惨案频发。

为了解决它,SpringCloud将服务之间的直接依赖转化为服务对服务中心的依赖。Spring Cloud 核心组件Eureka以及后来的nacos都是解决该类问题的,他们实现了服务的注册与发现。

# 繁多的配置

每个微服务都有自己对应的配置文件。随着微服务不断的增多,配置文件也会越来越多,再加上在研发过程中有测试环境、预发布环境、生产环境等,配置文件的数量便是n*m。如此多的配置文件,如果要修改某个公共配置,一不小心就会产生混乱。这个时候就需要引入Spring Cloud另外一个组件:Spring Cloud Config。

Spring Cloud Config是一个解决分布式系统的配置管理方案。它包含了Client和Server两个部分,Server提供配置文件的存储、以接口的形式将配置文件的内容提供出去,Client通过接口获取数据、并依据此数据初始化自己的应用。

# 与客户端的调用

微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会很麻烦且存在诸多问题:向每个独立服务都发起一个请求,会大大增加服务之间通信的复杂度跟开销、多次调用容易受到攻击、容易受到故障和服务中断的影响、且服务之间的扩展性会非常差...

为解决它,因此简化了前端的调用逻辑,引入API Gateway作为服务网关,它的具体作用就是服务转发,接收并转发所有内外部的客户端调用。同时也可以在网关做一些权限校验等类似的功能。客户端访问时就变成了如下的情况:

  1. 用户发起请求:用户通过浏览器或其他客户端发起请求
  2. API Gateway接收到请求后,会进行一些预处理(如检查请求的合法性、进行身份验证和授权等)
  3. API Gateway将处理后的请求转发到具体的微服务,它们进行处理
  4. 服务执行完业务逻辑后,会将结果返回给API Gateway
  5. API Gateway接收到结果后,会将结果返回给用户

在SpringCloud中网关的实现有两种——Zuul和Gateway。

Zuul是基于Servlet实现的,属于阻塞式编程。

而SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,具有更好的性能!

# 服务间的治理

面向不同业务域的微服务越来越多,微服务集群的规模增长迅速。之前只需要对单体应用进行监控管理的情况,现在则要面对的是几十甚至上百个微服务的监控管理,同时为了避免单个服务出现过载的情况,提高系统的可靠性跟稳定性。因此需要升级服务监控功能,同时进行负载均衡,进行所谓的服务间的治理。

它调用提供链路追踪。例如可以通过Sleuth可以很清楚的了解到一个服务请求经过了哪些服务,每个服务处理花费了多长时间。从而让我们可以很方便的理清各微服务间的调用关系。而使用Ribbon则能够轻松实现微服务之间调用的负载均衡。

# 服务的崩溃

微服务架构中通常会有多个服务层之间的相互调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,该现象可以称为服务雪崩或者叫雪崩效应。再加上网络是不可靠的,便让这种情况的出现几率更大了。

为了减低它的几率,SpringCloud提供了服务-故障隔离功能。也就是所谓的熔断机制——当微服务系统的某个微服务不可用或响应时间太长时,为了保护系统的服务整体可用性,熔断器会暂时切断对该服务的请求调用,并快速返回一个友好的错误响应信息。这种熔断状态不是永久的,在经历了一定时间后,熔断器会再次检测该微服务是否恢复正常,若恢复正常则恢复调用链路。

其中Hystrix以及后来的Sentinel就是所谓的熔断降级组件。

# 它能做什么

  • Distributed/versioned configuration 分布式/版本控制配置
  • Service registration and discovery 服务注册与发现
  • Routing 路由
  • Service-to-service calls 服务到服务的调用
  • Load balancing 负载均衡配置
  • Circuit Breakers 断路器
  • Distributed messaging 分布式消息管理
  • ....

一句话:将多个微服务整合起来,运行大型且复杂的项目

# 它的优缺点

优点

  • 单一职责原则;
  • 每个服务足够内聚,足够小,代码容易理解,这样能聚焦一个指定的业务功能或业务需求;
  • 开发简单,开发效率高,一个服务可能就是专一的只干一件事;
  • 微服务能够被小团队单独开发,这个团队只需2-5个开发人员组成;
  • 微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的;
  • 微服务能使用不同的语言开发;
  • 易于和第三方集成,微服务允许容易且灵活的方式集成自动部署,通过持续集成工具,如jenkins,Hudson,bamboo;
  • 微服务易于被一个开发人员理解,修改和维护,这样小团队能够更关注自己的工作成果,无需通过合作才能体现价值;
  • 微服务允许利用和融合最新技术;
  • 微服务只是业务逻辑的代码,不会和HTML,CSS,或其他的界面混合;
  • 每个微服务都有自己的存储能力,可以有自己的数据库,也可以有统一的数据库;

缺点

  • 开发人员要处理分布式系统的复杂性;
  • 多服务运维难度,随着服务的增加,运维的压力也在增大;
  • 系统部署依赖问题;
  • 服务间通信成本问题;
  • 数据一致性问题;
  • 系统集成测试问题;
  • 性能和监控问题;

# 五大组件

  • 服务注册与发现——Netflix Eureka
  • 分布式配置——Spring Cloud Config
  • 服务网关——Netflix Zuul
  • 负载均衡:
    • 客户端负载均衡——Netflix Ribbon
    • 服务端负载均衡:——Feign(其也是依赖于Ribbon,只是将调用方式RestTemplete 更改成Service 接口)
  • 断路器(熔断与降级)——Netflix Hystrix

组件-最新更新(7个):

  • 服务注册与发现 Alibaba nacos
  • 服务调用和负载均衡 OpenFeign
  • 分布式事务 Alibaba Seata
  • 服务熔断和降级 Alibaba Sentinel
  • 服务链路追踪
  • 服务网关 GateWay
  • 分布式配置管理 Alibaba Nacos

# springboot跟Cloud的区别

# 从目的来说

Spring Boot主要用于简化Spring应用的初始搭建和开发过程,通过自动配置和起步依赖来减少开发者的配置工作。

而Spring Cloud则是构建在Spring Boot之上的,用于简化分布式系统(如微服务架构)的开发,提供了一系列工具来应对服务发现、配置管理、熔断器等分布式系统中的常见问题。

Spring Boot的目标是快速创建独立运行的Spring应用,而Spring Cloud的目标是提供分布式系统的解决方案。在功能上,Spring Boot有自动配置、内嵌服务器,而Spring Cloud则有服务发现、配置中心、负载均衡等。

# 核心功能不同

  • Spring Boot
    • 自动配置:根据依赖自动配置 Spring 应用(例如引入 spring-boot-starter-web 后自动配置 Tomcat 和 Spring MVC)。
    • 内嵌服务器:内置 Tomcat、Jetty 等,无需手动部署 WAR 包。
    • 简化依赖管理:通过 starter 依赖简化库的版本兼容问题。
    • 监控与健康检查:提供 Actuator 模块监控应用状态。
  • Spring Cloud
    • 服务发现与注册:如 Eureka、Consul,用于服务实例的动态注册与发现。Nacos
    • 分布式配置:如 Config Server,统一管理多环境的配置。Nacos
    • 负载均衡:如 Ribbon 或 Spring Cloud LoadBalancer,实现服务调用的负载均衡。
    • 服务熔断与降级:如 Hystrix 或 Resilience4j,防止服务雪崩。sentienl
    • API 网关:如 Zuul 或 Spring Cloud Gateway,统一路由和权限控制。
    • 分布式链路追踪:如 Sleuth + Zipkin,监控服务调用链路。

# 依赖关系

两者是互相协作的工作关系,可以共存,但cloud的要依赖boot。

Spring Cloud的版本依赖关系,不同版本的Spring Cloud可能需要特定版本的Spring Boot,这也是实际开发中需要注意的地方。

# 自学参考资料

  • SpringCloud 官网介绍: https://spring.io/cloud

  • SpringCloud 官网教程:https://spring.io/projects/spring-cloud

  • SpringCloud Netflix 中文文档:https://springcloud.cc/spring-cloud-netflix.html

  • SpringCloud 中文API文档(官方文档翻译版):https://springcloud.cc/spring-cloud-dalston.html

  • SpringCloud中国社区:http://springcloud.cn/

  • SpringCloud中文网:https://springcloud.cc (opens new window)

上次更新: 2025/04/23, 16:23:16
SpringBoot笔记
SpringCloud快速开始

← SpringBoot笔记 SpringCloud快速开始→

最近更新
01
面向切面跟自定义注解的结合
05-22
02
时间跟其他数据的序列化
05-19
03
数据加密与安全
05-17
更多文章>
Theme by Vdoing | Copyright © 2023-2025 EffectTang
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式