SpringCould简介

简介

官网https://spring.io/projects/spring-cloud
Spring最擅长的就是集成;
SpringCloud实现了诸如:配置管理,服务发现,智能路由,熔断器,负载均衡,控制总线,集群状态等等功能。主要涉及组件包括:

  1. Eureka:服务治理组件。包括注册服务中心,服务注册与发现机制的实现。
  2. Zuul:网关组件,提供智能路由,访问过滤功能。
  3. Ribbon:客户端负载均衡服务组件。
  4. Feign:服务调用,给予Ribbon与Hystrix的声明式服务调用组件。
  5. Hystrix:容错管理组件,实现断路器模式,帮助服务依赖中出现的延迟和为故障提供强大的容错力。

Eureka详情

基础架构

Eureka架构心的三个核心角色:

  1. 服务注册中心
    Eureka的服务端应用,提供服务注册和发现功能。

  2. 服务提供者
    提供服务应用。可以是Spring Boot 应用,也可以是其他技术,只要对外提供的是Rest风格服务即可。

  3. 服务消费者
    消费应用从注册中心获取服务列表,从而得知每个服务方的信息,知道去哪里调用服务方。

Eureka注册中心

Eureka注册中心,负责管理,记录服务提供者的信息。服务调用者无需自己找服务,而是把自己的需求告诉Eureka,Eureka会把符合你的需求服务告诉你。
同时,服务方与Eureka之间通过*“心跳”*机制进行监控,当某个服务提供方出现问题时,Eureka自动把它服务列表中剔除。
这就实现了服务的自动注册,发现,状态监控。
基本架构图

  • Eureka:就是注册中心,对外暴露自己的地址;
  • 提供者:启动后向Eureka注册自己信息;
  • 消费者:向Eureka订阅服务,Eureka会将对应服务的所有提供者地址列表发送给消费者,并且定期更新。
  • 心跳(续约):提供者定期通过http方式Eureka刷新自己的状态。

Eureka Server

Eureka Server注册中心,事实上EurekaService可以是一个也可以是一个集群,形成高可用的Eureka中心。

| 服务同步

多个Eureka Server之间也会相互注册为服务,当服务提供者注册到Eureka Server集群中的某个节点,该节点会把服务的信息同步给集群中的每个节点,从而实现数据同步。因此,无论客户端访问到Eureka Server集群中的任意一个节点,都可以获取到完整的服务列表。

| 动手搭建高可用的EurekaServer
我们假设要运行两个EurekaServer的集群,端口分别为:10086和10087。只需要把itcast-eureka启动两次即可。

  • 启动第一个eurekaServer,我们修改原来的EurekaServer配置:

    server:
      port: 10086 # 端口
    spring:
      application:
        name: eureka-server # 应用名称,会在Eureka中显示
    eureka:
      client:
        service-url: # 配置其他Eureka服务的地址,而不是自己,比如10087
          defaultZone: http://127.0.0.1:10087/eureka
    

    Eureka Server自己作为服务进行注册,Eureka Server之间能相互发现对方,从而形成集群

  • 把service-url的值修改成另一台服务器的EurekaServer

  • 客户端注册到服务集群
    注册多个Eureka Server

eureka:
  client:
    service-url: # EurekaServer地址,多个地址以','隔开
      defaultZone: http://127.0.0.1:10086/eureka,http://127.0.0.1:10087/eureka

提供者服务

服务提供者要向Eureka Server注册服务,并且完成服务续约等工作。

| 服务注册

服务提供者在启动时,会检测配置属性中的:eureka.client.register-with.eureka = true参数是否正确,默认为true。如果为true,则会向EurekaServer发送Rest请求,并携带自己的元数据信息。EurekaServer会把这些信息保存到一个双层Map结构中。

  • 第一层map的Key是服务ID,是spring.application.name属性
  • 第二层Map的Key是服务的实例ID,host+serviceID+port,例如 localhost:service-provider:8081
  • 值则是服务的实例对象,也就是说一个服务,可以启动不同的实例,形成一个集群。

| 服务续约
在服务注册完成后,服务提供者会维持一个心跳定时向EurekaServer发送Rest请求,告诉EurekaServer是否还存活,这个我们叫做renew

eureka:
  instance:
    lease-expiration-duration-in-seconds: 90
    lease-renewal-interval-in-seconds: 30
  • lease-renewal-interval-in-seconds:服务续约(renew)的间隔,默认为30秒
  • lease-expiration-duration-in-seconds:服务失效时间,默认值90秒
    默认情况下每隔30秒会向注册中心发送一次心跳,如果90秒之内没有得到回应,EurekaServer就会认为该服务宕机,会从服务列表中移除。
    生产环境下该参数不需要进行修改默认即可
    开发环境下时间太长,修改时间缩短进行测试

服务消费者

| 获取服务列表
当服务消费者启动时,会检测 eureke.client.fetch-registry=true
参数的值,如果为true,则会拉取Eureka Server服务的列表只读备份,然后缓存在本地。并且每隔30秒会重新获取并更新数据。

eureke:
	client:
		registry-fetch-interval-seconds:5

失效剔除和自我保护

| 服务下线
当服务进行正常关闭操作时,他会触发一个服务下线的Rest请求EurekaServer,告诉服务注册中心:“下线"。服务中心接受到请求后,该服务置为下线状态。

| 失效剔除
服务提供方并不一定会正常下线,可能因为内存溢出,网络故障等原因导致服务无法正常运行。Eureka Server需要将这样的服务剔除出服务列表。因此会开启一个定时服务,每隔60秒对所有失效服务进行剔除。
可通过eureka.server.eviction-interval-timer-in-ms,单位毫秒(ms)

server:
	port:10086 #端口
spring:
	applicaiton:
		name:eureka-server #应用名称
eureka:
   server:
   	eviction-interval-timer-in-ms:10
   client:
   	service-url:
   		defalutZone:http://127.0.0.1:10086/eureka

| 自我保护
关闭一个服务,Eureka面板警告:
在这里插入图片描述这个触发了Eureka的自我保护机制。当一个服务未按时进行心跳续约时,Eureka 会统计最近15分钟心跳失败的服务实例的比例是否超过85%。在生产环境下,因为网络延迟等原因,心跳失败实例的比例很有可能超标。但是此时就把服务剔除列表并不妥当,因为服务可能没有宕机。Eureka就会把当前实例的注册信息保护起来,不予剔除。生产环境下这很有效,保证大多数服务依然有用。

eureka:
	server:
		enable-self-preservation:false #关闭自我保护
		evication-interval-timer-in-ms:60 #扫描失效服务的间隔时间(缺省为60*1000)

猜你喜欢

转载自blog.csdn.net/weixin_42789301/article/details/105068569