SpringCloud笔记

springcloud

double 和springcloud的区别

  • Spring Cloud 抛弃了 Dubbo 的 RPC 通信,采用的是基于 HTTP 的 REST 方式。

cap理论

CAP是所有分布式系统的基础理论,任何分布式系统只能满足以下三种状态中的任意两种。

  • 一致性(Consistency):所有节点在同一时间看到的数据是一致的;
  • 可用性(Availability):定时是所有的请求都会收到响应
  • 分区容错性(Partition tolerance)

eureka注册中心

注册中心现在以nacos为主

https://jbone.cn/learn/spring-cloud/deep-eureka.html

eureka 满足AP

eureka的架构
eureka的基础架构可以分成三个部分:

  1. 服务注册中心:提供服务的发现和注册的功能。
  2. 服务提供者:提供服务的应用,可以是spring boot应用,也可以是其他遵eureka通信机制的应用。
  3. 消费者应用从服务注册中心获取服务列表,从而使消费者可以知道去何处调用所要的服务。既可以使用Ribbon,也可以使用Feign.

Eureka 某些基础概念

  • 服务注册 Register:当 Eureka 客户端向 Eureka Server 注册时,它提供自身的元数据,比如IP地址、端口,运行状况指示符URL,主页等。
  • 服务续约 Renew:Eureka 客户会每隔30秒(默认情况下)发送一次心跳来续约。 通过续约来告知 Eureka Server 该 Eureka 客户仍然存在,没有出现问题。 正常情况下,如果 Eureka Server 在90秒没有收到 Eureka 客户的续约,它会将实例从其注册表中删除。
  • 获取注册列表信息 Fetch Registries: Eureka 客户端从服务器获取注册表信息,并将其缓存在本地。客户端会使用该信息查找其他服务,从而进行远程调用。该注册列表信息定期(每30秒钟)更新一次。每次返回注册列表信息可能与 Eureka 客户端的缓存信息不同, Eureka 客户端自动处理。如果由于某种原因导致注册列表信息不能及时匹配,Eureka 客户端则会重新获取整个注册表信息。 Eureka 服务器缓存注册列表信息,整个注册表以及每个应用程序的信息进行了压缩,压缩内容和没有压缩的内容完全相同。Eureka 客户端和 Eureka 服务器可以使用JSON / XML格式进行通讯。在默认的情况下 Eureka 客户端使用压缩 JSON 格式来获取注册列表的信息。
  • 服务下线 Cancel:Eureka客户端在程序关闭时向Eureka服务器发送取消请求。 发送请求后,该客户端实例信息将从服务器的实例注册表中删除。该下线请求不会自动完成,它需要调用以下内容:DiscoveryManager.getInstance().shutdownComponent();
  • 服务剔除 Eviction: 在默认的情况下,当Eureka客户端连续90秒(3个续约周期)没有向Eureka服务器发送服务续约,即心跳,Eureka服务器会将该服务实例从服务注册列表删除,即服务剔除。

自我保护机制

有的时候会遇到这样的:EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT.RENEWALS ARE LESSER THAN THRE SHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUSTTO BE SAFE.
实际上,该警告就是触发了Eureka Server的自我保护机制。

当 Eureka Server 在某种特定情况下 Eureka Server 不会剔除其注册列表中的实例,那就是 Eureka 的自我保护时期。

何为自我保护? 假想一下,当一个 server 节点出现了网络分区等不可抗力原因,那么它会因此收不到 client 的续约心跳,如果网络波动比较大,也就可能导致 server 因为一次网络波动剔除了所有或者绝大部分 Client 。这种情况是我们不想看见的。

所以 Eureka 会有一种自我保护机制,默认是15分钟内收到的续约低于原来的85%(这是上面的续约配置比例)那么就会开启 自我保护 。这阶段 Eureka Server 不会剔除其列表中的实例,即使过了 90秒 也不会。

在单机调试的时候很容易满足,实际在生产环境上通常是由于网络不稳定导致,由于本地调试很容易触发注册中心的保护机制,这会使得注册中心维护的服务实例不那么准确。所以,我们在本地进行开发的时候,可以使用eureka.server.enable-self-preservation=false参数来关闭保护机制,以确保注册中心可以将不可用的实,例正确剔除。

Eureka常用配置

服务端配置
eureka:
  instance:
    hostname: xxxxx    # 主机名称
    prefer-ip-address: true/false   # 注册时显示ip
  server:
    enableSelfPreservation: true   # 启动自我保护
    renewalPercentThreshold: 0.85  # 续约配置百分比

还需要在spring boot启动类中设置 @EnableEurekaServer 注解开启 Eureka 服务

客户端配置
eureka:
  client:
    register-with-eureka: true/false  # 是否向注册中心注册自己
    fetch-registry: # 指定此客户端是否能获取eureka注册信息
    service-url:    # 暴露服务中心地址
      defaultZone: http://xxxxxx   # 默认配置
  instance:
    instance-id: xxxxx # 指定当前客户端在注册中心的名称

feign

一. 什么是Feign

Feign是Netflix公司开源的轻量级Rest客户端,SpringCloud对Feign进行了封装,Feign默认集成了Ribbon实现了客户端负载均衡调用。使用Feign只需要定义一个接口,并使用注解的方式配置它(在接口上添加注解即可)。

openfeign

feign的升级版本,支持springmvc的注解,直接写接口加上对应的注解即可调用对应的服务,不需要像restTemplate方式来调用服务接口

Hystrix

限流、熔断、降级

Gateway

网关,zuul(已经淘汰)、zuul2(还未整合到springcloud中)

config&bus

分布式配置、实时刷新(消息总线)

stream

spring cloud整合消息队列框架(消息驱动)

Sleuth&Zipkin

分布式链路追踪,记录服务之间的请求,zipkin用来展示记录,sleuth存储记录

skyWalking 看起来比sleuth更好

Nacos

包含了 eureka + config +bus

自带负载均衡

支持AP/ CP两种模式

安装使用集群模式,最少三台机,使用Nginx 反向代理负载均衡

Sentinel

包含了hystrix的功能,并且提供了web界面展示流量情况,可以动态控制,不需要像hystrix那样写死

sentinel 结合 feign 的使用方式与feign单独使用非常类似。其他需要配置的主要为在配置文件中配置feign激活sentinel。其他使用方式基本一致。sentinel 整合feign无法区分降级与异常处理逻辑,都公用一个fallback降级处理方式。

备注:
  • sentinel部署的环境要和项目的环境可以互通,不然无法看到效果

seata

分布式事务

skyWalking

分布式链路追踪,后起之秀,相比于sleuth+zipkin更优秀

prometheus+grafana

监控:硬件+软件两个方面

prometheus:负责存储数据,同时本身也自带有展示web页面,但是不够美观

grafana:负责从指定地点获取数据进行展示,有良好的仪表盘可供选择,可以从官网,下载指定的id进行配置展示

node-export:负责获取服务器系统监控信息,保存到prometheus中

mysql-export:负责获取Mysql监控信息,保存到prometheus中,同时还有其他的对应export,如docker、rabbitmq….

需要监控哪个服务,就要安装对应的export