Eureka 是 Netflix 公司开发的一款开源的服务注册与发现组件

Eureka 两大组件

Eureka 采用 CS(Client/Server,客户端/服务器) 架构,它包括以下两大组件:

  • Eureka Server:Eureka 服务注册中心,主要用于提供服务注册功能。当微服务启动时,会将自己的服务注册到 Eureka Server。Eureka Server 维护了一个可用服务列表,存储了所有注册到 Eureka Server 的可用服务的信息,这些可用服务可以在 Eureka Server 的管理界面中直观看到。
  • Eureka Client:Eureka 客户端,通常指的是微服务系统中各个微服务,主要用于和 Eureka Server 进行交互。在微服务应用启动后,Eureka Client 会向 Eureka Server 发送心跳(默认周期为 30 秒)。若 Eureka Server 在多个心跳周期内没有接收到某个 Eureka Client 的心跳,Eureka Server 将它从可用服务列表中移除(默认 90 秒)。

服务端

  1. 主工程pom.xml文件引入Spring Cloud依赖管理

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
  2. 创建一个eureka server 模块,pom.xml 中引入eureka server依赖

    <!--        eureka-server-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    
  3. 编写配置文件

    server.port=8761
    spring.application.name=eureka-server
    
    eureka.instance.hostname=localhost
    # 禁止自己当做服务注册
    eureka.client.register-with-eureka=false
    # 屏蔽注册信息
    eureka.client.fetch-registry=false
    # 注册中心地址
    eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
    
  4. springboot启动类加@EnableEurekaServer注解

  5. 启动服务就可以访问了

客户端

  1. pom.xml引入依赖

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

    # 心跳检测
    eureka.instance.lease-renewal-interval-in-seconds=2
    # 心跳超时时间
    eureka.instance.lease-expiration-duration-in-seconds=10
    # 实例以ip作为链接,而不是取机器名
    eureka.instance.ip-address=true
    # 服务实例名称
    eureka.instance.instance-id=${spring.application.name}
    # 实例注册中心
    eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
    
  3. 启动服务

Eureka Server 集群

  1. 编写多个配置文件

    # 三个配置文件
    application-eureka8761.properties
    application-eureka8762.properties
    application-eureka8763.properties
    
    # 修改,写上除自身端口外其他端口的eureka
    eureka.client.service-url.defaultZone=http://eureka8762:8762/eureka/,http://eureka8763:8763/eureka/
    
  2. 修改本地的 host 文件

    127.0.0.1 eureka8761
    127.0.0.1 eureka8762
    127.0.0.1 eureka8763
    
  3. 增加--spring.profiles.active=eureka8761 启动

  4. 客户端配置也要改下

    eureka.client.service-url.defaultZone=http://eureka8761:8761/eureka/,http://eureka8762:8762/eureka/,http://eureka8763:8763/eureka/
    

Eureka 自我保护机制

默认情况下,如果 Eureka Server 在一段时间内(默认为 90 秒)没有接收到某个服务提供者(Eureka Client)的心跳,就会将这个服务提供者提供的服务从服务注册表中移除。 这样服务消费者就再也无法从服务注册中心中获取到这个服务了,更无法调用该服务。

但在实际的分布式微服务系统中,健康的服务(Eureka Client)也有可能会由于网络故障(例如网络延迟、卡顿、拥挤等原因)而无法与 Eureka Server 正常通讯。若此时 Eureka Server 因为没有接收心跳而误将健康的服务从服务列表中移除,这显然是不合理的。而 Eureka 的自我保护机制就是来解决此问题的。

所谓 “Eureka 的自我保护机制”,其中心思想就是“好死不如赖活着”。如果 Eureka Server 在一段时间内没有接收到 Eureka Client 的心跳,那么 Eureka Server 就会开启自我保护模式,将所有的 Eureka Client 的注册信息保护起来,而不是直接从服务注册表中移除。一旦网络恢复,这些 Eureka Client 提供的服务还可以继续被服务消费者消费。

综上,Eureka 的自我保护机制是一种应对网络异常的安全保护措施。它的架构哲学是:宁可同时保留所有微服务(健康的服务和不健康的服务都会保留)也不盲目移除任何健康的服务。通过 Eureka 的自我保护机制,可以让 Eureka Server 集群更加的健壮、稳定。

Eureka 的自我保护机制也存在弊端。如果在 Eureka 自我保护机制触发期间,服务提供者提供的服务出现问题,那么服务消费者就很容易获取到已经不存在的服务进而出现调用失败的情况,此时,我们可以通过客户端的容错机制来解决此问题

安全认证

引入依赖

<!--        security-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

配置账号密码

# 配置访问账号
spring.security.user.name=mwH2SncA7Nj5oBtp6qawl3mDLomso3Tu
spring.security.user.password=uv4dojlU1jOKGSul4UpQERwzj1xr1m3D

csrf 置为不可用

/**
 * @author Ybond
 */
@Configuration
@EnableWebSecurity
public class EurekaSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        super.configure(http);
    }

}

客户端使用:

eureka.client.service-url.defaultZone=http://{账号}:{密码}@eureka8761:8761/eureka/