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,主页等。
  • 服务续约 RenewEureka 客户会每隔30秒(默认情况下)发送一次心跳来续约。 通过续约来告知 Eureka ServerEureka 客户仍然存在,没有出现问题。 正常情况下,如果 Eureka Server 在90秒没有收到 Eureka 客户的续约,它会将实例从其注册表中删除。
  • 获取注册列表信息 Fetch RegistriesEureka 客户端从服务器获取注册表信息,并将其缓存在本地。客户端会使用该信息查找其他服务,从而进行远程调用。该注册列表信息定期(每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