SpringCloud框架搭建(二)Eureka服务治理体系

服务治理是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册和发现。

体系如下:

Spirng Cloud Eureka使用Netflix Eureka来实现服务注册与发现。它既包含了服务端组件,也包含了客户端组件,并且服务端与客户端均采用java编写,所以Eureka主要适用于通过java实现的分布式系统,或是JVM兼容语言构建的系统。Eureka的服务端提供了较为完善的REST API,所以Eureka也支持将非java语言实现的服务纳入到Eureka服务治理体系中来,只需要其他语言平台自己实现Eureka的客户端程序。

Eureka包含两个组件:Eureka Server 和 Eureka Client:
1。Eureka Client是一个Java客户端,用于简化与Eureka Server的交互;
2。Eureka Server提供服务发现的能力,各个微服务启动时,会通过Eureka Client向Eureka Server进行注册自己的信息(例如网络信息),Eureka Server会存储该服务的信息;
3。微服务启动后,会周期性地向Eureka Server发送心跳(默认周期为30秒)以续约自己的信息。如果Eureka Server在一定时间内没有接收到某个微服务节点的心跳,Eureka Server将会注销该微服务节点(默认90秒);
4。每个Eureka Server同时也是Eureka Client,多个Eureka Server之间通过复制的方式完成服务注册表的同步;
5。Eureka Client会缓存Eureka Server中的信息。即使所有的Eureka Server节点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者。

一:服务注册中心

1.1  创建一个eureka-server的maven工程,引入spring-cloud-starter-netflix-eureka-server的依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>parent</artifactId>
        <groupId>com.cjc.spring.cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.cjc.spring.cloud</groupId>
    <artifactId>eureka-server</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

</project>

1.2  application.yml中添加配置

server:
  port: 8081
spring:
  application:
    name: eureka-service
eureka:
  client:
    register-with-eureka: false     #false表示不向注册中心注册自己。
    fetch-registry: false           #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    serviceUrl:
      defaultZone: http://localhost:8081/eureka/
    healthcheck:
      enabled: true

register-with-eureka表示是否向注册中心注册本服务,fetch-registry表示是否从服务注册中心获取服务列表。defaultZone指服务注册中心地址。微服务名称即为spring.application.name的值。

1.3  启动一个服务注册中心

 只需要在springboot工程的启动application类上加一个注解@EnableEurekaServer,启动服务后访问http://localhost:8081/

以后微服务的注册和发现就用这个eureka服务了。

1.4  Eurake 自我保护机制

某时某刻一个微服务不可用了,Eurake 不会立即清理,依旧会对该微服务的信息进行保存,默认情况下,如果 EurakeServer 在一定时间内没有接收到某个服务实例的心跳,EurakeServer 将会注销实例(默认90秒)。但是当网络分区故障发生时,微服务与 EurakeServer 之间无法正常通信,以上行为可能变的非常危险,因为微服务本身是健康的,此时本不应该注销这个服务。Eurake 通过“自我保护”来解决这个问题,当 EurakeServer 节点在短时间内丢失过多客户时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,EurakeServer 就会保护服务注册表中的信息,不在删除服务注册表中的数据(也就是不会注销任何微服务)。当故障恢复后,该 EurakeServer 节点会自动退出自我保护模式。

1.5  Eurake 集群配置

Eurake 服务端的 application.yml 修改defaultZone,为defaultZone: http://localhost:8081/eureka/,http://localhost:8001/eureka/或者defaultZone: http://localhost:8001/eureka/。即将本注册中心注册到其他注册中心上,以进行微服务的互相注册和发现。

二: 服务提供者

2.1  创建一个user-action的mave工程,引用spring-cloud-starter-netflix-eureka-client

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

1.2  application.yml中添加配置

server:
  port: 8082
spring:
  application:
    name: eureka-user

eureka:
  client:
    register-with-eureka: true     #false表示不向注册中心注册自己。
    fetch-registry: true          #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    serviceUrl:
      defaultZone: http://localhost:8081/eureka/

1.3  启动一个服务提供者

 只需要在springboot工程的启动application类上加一个注解@EnableEurekaClient,启动服务后访问http://localhost:8081/会发现多了一个服务。

1.3  服务同步

由于多个服务注册中心互相注册为服务,当服务提供者发送注册请求到一个服务注册中心时,它会将该请求转发给集群中相连的其他注册中心,从而实现服务注册中心之间的服务同步。通过服务同步,提供者的服务信息就可以通过集群中的任意一个服务注册中心获得。

1.4  服务续约

在注册服务之后,服务提供者会维护一个心跳用来持续高速Eureka Server,“我还在持续提供服务”,否则Eureka Server的剔除任务会将该服务实例从服务列表中排除出去。我们称之为服务续约。

下面是服务续约的两个重要属性:

(1)eureka.instance.lease-expiration-duration-in-seconds

leaseExpirationDurationInSeconds,表示eureka server至上一次收到client的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则将移除该instance。

默认为90秒
如果该值太大,则很可能将流量转发过去的时候,该instance已经不存活了。
如果该值设置太小了,则instance则很可能因为临时的网络抖动而被摘除掉。
该值至少应该大于leaseRenewalIntervalInSeconds
(2)eureka.instance.lease-renewal-interval-in-seconds

leaseRenewalIntervalInSeconds,表示eureka client发送心跳给server端的频率。如果在leaseExpirationDurationInSeconds后,server端没有收到client的心跳,则将摘除该instance。除此之外,如果该instance实现了HealthCheckCallback,并决定让自己unavailable的话,则该instance也不会接收到流量,默认30秒。

源码下载:https://github.com/cxsummer/springcloud

猜你喜欢

转载自blog.csdn.net/cjc000/article/details/91348347