SpringCloud

1.什么是SpringCloud

Spring Cloud是一个微服务框架,相比Dubbo等RPC框架, Spring Cloud提供的全套的分布式系统解决方案。

  Spring Cloud对微服务基础框架Netflix的多个开源组件进行了封装,同时又实现了和云端平台以及和Spring Boot开发框架的集成。 

  Spring Cloud为微服务架构开发涉及的配置管理,服务治理,熔断机制,智能路由,微代理,控制总线,一次性token,全局一致性锁,leader选举,分布式session,集群状态管理等操作提供了一种简单的开发方式。

  Spring Cloud 为开发者提供了快速构建分布式系统的工具,开发者可以快速的启动服务或构建应用、同时能够快速和云平台资源进行对接。   

SpringCloud版本对应

2020.0.x aka Ilford ---------------- 2.4.x, 2.5.x (Starting with 2020.0.3)

Hoxton----------------------> 2.2.x, 2.3.x (Starting with SR5)

Greenwich-----------------------> 2.1.x

Finchley-------------------------------> 2.0.x

Edgware----------------------------------> 1.5.x

Dalston--------------------> 1.5.x

SpringCloud使用Bootsrtap
Spring Cloud应用程序通过创建“ bootstrap ”上下文来运行,该上下文是主应用程序的父上下文。它负责从外部源加载配置属性,并负责解密本地外部配置文件中的属性。这两个上下文共享一个Environment,它是任何Spring应用程序的外部属性的来源。默认情况下,引导程序属性(不是bootstrap.properties,而是引导程序阶段加载的属性)具有较高的优先级,因此它们不能被本地配置覆盖。

**SpringCloud使用外部配置

spring:
  application:
    name: foo
  cloud:
    config:
      uri: ${SPRING_CONFIG_URI:http://localhost:8888}
   

日记配置

如果要使用Spring Boot来配置日志设置,则应将此配置放在`bootstrap或者appliction。[yml | 属性](如果您希望将其应用于所有事件)。

为了使Spring Cloud正确初始化日志记录配置,您不能使用自定义前缀。例如,初始化记录系统时,Spring
Cloud无法识别使用custom.loggin.logpath

custom.loggin.logpath="E:/E"

Eureka服务发现和注册

Eureka 是一种基于 REST(Representational State Transfer)的服务,主要用于 AWS 云中,用于定位服务,以实现中间层服务器的负载平衡和故障转移。我们称这个服务为Eureka Server。Eureka 还附带了一个基于 Java 的客户端组件,即Eureka Client,这使得与服务的交互更加容易。客户端还有一个内置的负载均衡器,可以进行基本的循环负载均衡。在 Netflix,一个更复杂的负载均衡器包裹 Eureka 以提供基于流量、资源使用、错误条件等多个因素的加权负载均衡,以提供卓越的弹性。

应用客户端和应用服务器如何通信?

通信技术可以是您喜欢的任何东西。Eureka 可帮助您找到有关您想要与之通信的服务的信息,但不会对协议或通信方法施加任何限制。例如,您可以使用 Eureka 获取目标服务器地址并使用协议,例如 thrift、http(s) 或任何其他 RPC 机制。

Eureka心跳机制

服务向 Eureka注册,然后(默认)每 30 秒发送一次心跳以更新租约。如果客户端多次无法续订租约,则在大约 90秒内将其从服务器注册表中取出。注册信息和续费被复制到集群中的所有 eureka 节点。来自任何区域的客户端都可以查找注册表信息(每 30 秒发生一次)以定位他们的服务(可以在任何区域中)并进行远程调用。

可配置性
使用 Eureka,您可以动态添加或删除集群节点。您可以调整从超时到线程池的内部配置。Eureka 使用archaius,如果你有一个配置源实现,很多这些配置可以动态调整

Archaius 包含一组 Netflix 使用的配置管理 API。它提供以下功能: 动态的、类型化的属性 高吞吐量和线程安全配置操作
允许获取配置源的属性更改的轮询框架 在有效/“获胜”属性突变时调用的回调机制(在配置的有序层次结构中) 可以通过 JConsole
访问以检查和调用属性操作的 JMX MBean 用于应用程序(以及大多数愿意使用基于约定的属性文件位置的 Web
应用程序)的开箱即用的复合配置(具有有序的层次结构) URL、JDBC 和 Amazon DynamoDB 的动态配置源的实现 Scala
动态属性包装器

配置Eureka
Eureka 带有两个组件 - Eureka Client(消费端)和Eureka Server(服务端)。您使用 Eureka 的架构通常有两个应用程序

Application Client 使用 Eureka Client 向 Application Service 发出请求。
Application Service 它接收来自应用程序客户端的请求并返回响应。

EurekaService
应用程序客户端的 Eureka Client
应用服务的 Eureka Client

 <dependency>
  <groupId>com.netflix.eureka</groupId>
  <artifactId>eureka-client</artifactId>
  <version>1.1.16</version>
 </dependency>
# ##Eureka 客户端配置示例 Eureka 客户端

#查看 eureka-examples 中的 README 以查看示例设置的概述

#请注意,对于纯粹的客户端使用(例如,仅用于获取有关其他服务的信息,
#无需注册。此属性适用于单例 DiscoveryClient 所以
#如果您运行的服务器既是服务提供者又是服务消费者,
#然后不要将此属性设置为false。
eureka.registration.enabled = false

# # 与到达 eureka 服务器相关的配置
eureka.preferSameZone = true
eureka.shouldUseDns = false
eureka.serviceUrl.default = http://localhost:8080/eureka/v2/

eureka.decoderName = JacksonJson
# ##Eureka 客户端配置,用于向 Eureka 注册的示例服务

#查看 eureka-examples 中的 README 以查看示例设置的概述

# # 注册时自我识别相关的配置。
# # 还有其他可以定义的属性,请参阅 eureka-client/../CloudInstanceConfig 以获取完整详细信息。
#我在哪里部署?
eureka.region =默认

#我的应用程序名称是什么?(客户端可以查询这个appName)
eureka.name = sampleRegisteringService

#我的应用程序虚拟 IP 地址是什么?(客户端可以查询这个vipAddress)
eureka.vipAddress = sampleservice.mydomain.net

#我服务的端口是什么?(如果端口 8001 已在您的环境中使用,请更改此设置)
eureka.port = 8001

# # 与到达 eureka 服务器相关的配置
eureka.preferSameZone = true
eureka.shouldUseDns = false
eureka.serviceUrl.default = http://localhost:8080/eureka/v2/

为本地开发配置 当运行 eureka 服务器进行本地开发时,通常需要等待大约 3
分钟,直到它完全启动。这是由于默认服务器行为会搜索对等方以进行同步并在找不到可用对等方时重试。这个等待时间可以通过设置属性来减少eureka.numberRegistrySyncRetries=0。

更新
Eureka 客户端需要通过每 30 秒发送一次心跳来更新租约。更新通知 Eureka 服务器该实例还活着。如果服务器在 90 秒内没有看到更新,它将从其注册表中删除该实例。建议不要更改更新间隔,因为服务器使用该信息来确定客户端到服务器通信是否存在广泛传播的问题。

自我保护模式

如果 Eureka 服务器检测到比预期数量多的注册客户端以不礼貌的方式终止了它们的连接,并且同时等待驱逐,它们将进入自我保护模式。这样做是为了确保灾难性网络事件不会清除 eureka 注册表数据,并将其向下传播到所有客户端。

为了更好地理解自我保护,首先要了解尤里卡客户端如何“结束”他们的注册生命周期。eureka
协议要求客户端在永久离开时执行明确的注销操作。例如,在提供的 java 客户端中,这是在 shutdown() 方法中完成的。任何连续 3
次心跳更新失败的客户端都被认为是不洁终止,并将被后台驱逐进程驱逐。当当前注册表的 > 15% 处于此后期状态时,将启用自我保护。
如何禁用自我保护
自我保存配置在此处定义。要在示例中禁用自我保存,请设置属性:eureka.enableSelfPreservation=false。

对点通信
确保您已访问此页面以了解 Eureka 集群配置。

Eureka 客户端尝试与同一区域中的 Eureka 服务器通信。如果与服务器通信出现问题,或者如果服务器不存在于同一区域中,则客户端将故障转移到其他区域中的服务器。

一旦服务器开始接收流量,在服务器上执行的所有操作都会复制到服务器知道的所有对等节点。如果操作由于某种原因失败,则在下一次心跳时会协调信息,该心跳也会在服务器之间复制。

当 Eureka 服务器启动时,它会尝试从相邻节点获取所有实例注册表信息。如果从节点获取信息出现问题,服务器会在放弃之前尝试所有对等点。如果服务器能够成功获取所有实例,则它会根据该信息设置它应该接收的续订阈值。如果任何时候续订率低于为该值配置的百分比(15 分钟内低于 85%),服务器将停止使实例过期以保护当前实例注册表信息。

在 Netflix 中,上述保护措施称为自保模式,主要用于一组客户端和 Eureka Server 之间存在网络分区的场景中的保护。在这些情况下,服务器会尝试保护它已有的信息。可能会出现大规模中断的情况,这可能会导致客户端获取不再存在的实例。客户端必须确保他们对 eureka 服务器返回不存在或无响应的实例具有弹性。在这些情况下最好的保护是快速超时并尝试其他服务器。

在服务器无法从相邻节点获取注册信息的情况下,它会等待几分钟(5 分钟),以便客户端可以注册他们的信息。服务器通过仅将流量偏向一组实例并导致容量问题,努力不向那里的客户端提供部分信息。

尤里卡服务器彼此使用尤里卡客户端和服务器所描述之间使用相同的机制进行通信此处。

另外值得注意的是,如果需要,可以在服务器上调整多种配置,包括服务器之间的通信。

Peer 之间的网络中断期间会发生什么?

对等点之间的心跳复制可能会失败,服务器会检测到这种情况并进入自我保护模式以保护当前状态。
注册可能发生在孤立的服务器中,一些客户端可能会反映新的注册,而其他客户端可能不会。
在网络连接恢复到稳定状态后,这种情况会自动更正。当对等方能够正常通信时,注册信息会自动传输到没有它们的服务器。

hystrix熔断和限流

简介

Hystrix 是一个延迟和容错库,旨在隔离对远程系统、服务和 3rd 方库的访问点,停止级联故障并在故障不可避免的复杂分布式系统中启用弹性。

Maven

<dependency>
    <groupId>com.netflix.hystrix</groupId>
    <artifactId>hystrix-core</artifactId>
    <version>x.y.z</version>
</dependency>

Hystrix有什么用

通过第三方客户端库访问的依赖项(通常通过网络)提供延迟和故障的保护和控制。
停止复杂分布式系统中的级联故障。
快速失败并快速恢复。
在可能的情况下回退并优雅地降级。
实现近乎实时的监控、警报和操作控制。

Hystrix工作原理和设计原则是什么

Hystrix 的工作原理是:

防止任何单个依赖项耗尽所有容器(例如 Tomcat)用户线程。 减轻负载和快速失败而不是排队。 在可行的情况下提供回退以保护用户免于失败。
使用隔离技术(例如隔板、泳道和断路器模式)来限制任何一种依赖性的影响。 通过近乎实时的指标、监控和警报优化发现时间
通过配置更改的低延迟传播和支持 Hystrix 大部分方面的动态属性更改来优化恢复时间,这允许您使用低延迟反馈循环进行实时操作修改。
防止整个依赖客户端执行中的故障,而不仅仅是网络流量。
Hystrix执行了什么操作
Hystrix 如何实现其目标?

将所有对外部系统(或“依赖项”)的调用包装在一个HystrixCommandorHystrixObservableCommand对象中,该对象通常在单独的线程中执行(这是命令模式的一个示例)。
超时调用时间超过您定义的阈值。有一个默认值,但对于大多数依赖项,您可以通过“属性”自定义设置这些超时,以便它们略高于每个依赖项的测量的第99.5个百分位性能。
为每个依赖项维护一个小的线程池(或信号量);如果它已满,则发往该依赖项的请求将立即被拒绝,而不是排队。
测量成功、失败(客户端抛出的异常)、超时和线程拒绝。
如果服务的错误百分比超过阈值,则手动或自动触发断路器以在一段时间内停止对特定服务的所有请求。
当请求失败、被拒绝、超时或短路时执行回退逻辑。
近乎实时地监控指标和配置更改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud是一个用于构建分布式系统的开发工具集合。它提供了一些常用的组件和框架,包括服务注册和发现、负载均衡、断路器、分布式配置等等。在使用Spring Cloud时,有一些常见的错误和注意事项需要注意。 首先,关于Spring Boot和Spring Cloud版本对应错误。在使用Spring Cloud时,需要确保Spring Boot和Spring Cloud的版本兼容。不同版本之间可能存在依赖冲突或不兼容的情况,因此需要根据官方文档或者相关文档来选择合适的版本。 另外,Spring Cloud Config是一个用于集中管理和动态获取配置的工具。它支持从Git、SVN或本地文件系统中获取配置文件,并提供了服务器和客户端支持。你可以通过官方使用说明文档了解更多关于Spring Cloud Config的详细信息。 此外,关于选择使用Nacos还是Eureka作为服务注册和发现组件的问题。Nacos是一个功能更强大的服务注册和发现组件,它整合了Spring Cloud Eureka、Spring Cloud Config和Spring Cloud Bus的功能。使用Nacos可以实现配置的中心动态刷新,而不需要为配置中心新增集群或使用消息队列。另一方面,Eureka是Spring Cloud原生全家桶的一部分,相对来说更加稳定一些。选择使用哪个组件需要根据具体的需求和项目特点来决定。 综上所述,Spring Cloud是一个用于构建分布式系统的开发工具集合,它提供了一些常用的组件和框架。在使用Spring Cloud时,需要注意Spring Boot和Spring Cloud版本的兼容性,并可以使用Spring Cloud Config来动态获取配置。同时,可以选择使用Nacos或Eureka作为服务注册和发现组件,具体选择需要根据项目需求来决定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值