2. 服务发现:Eureka 服务器

本节介绍如何设置 Eureka 服务器。spring-doc.cn

2.1. 如何包含 Eureka 服务器

要在项目中包含 Eureka Server,请使用组 ID 为且工件 ID 为 的 starter。 有关使用当前 Spring Cloud Release Train 设置构建系统的详细信息,请参阅 Spring Cloud 项目页面org.springframework.cloudspring-cloud-starter-netflix-eureka-serverspring-doc.cn

如果您的项目已经使用 Thymeleaf 作为其模板引擎,则 Eureka 服务器的 Freemarker 模板可能无法正确加载。在这种情况下,需要手动配置模板加载器:
application.yml
spring:
  freemarker:
    template-loader-path: classpath:/templates/
    prefer-file-system-access: false

2.2. 如何运行 Eureka 服务器

以下示例显示了一个最小的 Eureka 服务器:spring-doc.cn

@SpringBootApplication
@EnableEurekaServer
public class Application {

    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class).web(true).run(args);
    }

}

服务器有一个主页,其中包含 UI 和 HTTP API 端点,用于常规 Eureka 功能。/eureka/*spring-doc.cn

以下链接有一些 Eureka 背景阅读:磁通电容器谷歌群组讨论spring-doc.cn

由于 Gradle 的依赖项解析规则和缺少父 bom 功能,取决于可能会导致应用程序启动失败。 要解决此问题,请添加 Spring Boot Gradle 插件并导入 Spring Cloud Starter 父 bom,如下所示:spring-cloud-starter-netflix-eureka-serverspring-doc.cn

build.gradle
buildscript {
  dependencies {
    classpath("org.springframework.boot:spring-boot-gradle-plugin:{spring-boot-docs-version}")
  }
}

apply plugin: "spring-boot"

dependencyManagement {
  imports {
    mavenBom "org.springframework.cloud:spring-cloud-dependencies:{spring-cloud-version}"
  }
}

2.3. defaultOpenForTrafficCount 及其对 EurekaServer 预热时间的影响

Netflix Eureka 的设置在开始时在 Spring Cloud Eureka 服务器中未考虑。要启用预热时间,请设置 .waitTimeInMsWhenSyncEmptyeureka.server.defaultOpenForTrafficCount=0spring-doc.cn

2.4. 高可用性、区域和区域

Eureka 服务器没有后端存储,但是注册表中的服务实例都必须发送心跳以使其注册保持最新(因此可以在内存中完成)。 Client 端还具有 Eureka 注册的内存缓存(因此它们不必为对服务的每个请求都转到 registry)。spring-doc.cn

默认情况下,每个 Eureka 服务器也是一个 Eureka 客户端,并且需要(至少一个)服务 URL 来查找对等方。 如果您不提供它,该服务将运行并工作,但它会在您的日志中填充大量有关无法向对等方注册的噪音。spring-doc.cn

2.5. 独立模式

两个缓存(客户端和服务器)和心跳的组合使独立的 Eureka 服务器对故障具有相当的弹性,只要有某种监视器或弹性运行时(例如 Cloud Foundry)使其保持活动状态。 在独立模式下,您可能更愿意关闭客户端行为,以便它不会不断尝试并无法访问其对等节点。 以下示例显示如何关闭客户端行为:spring-doc.cn

application.yml(独立 Eureka 服务器)
server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

请注意,它指向与本地实例相同的主机。serviceUrlspring-doc.cn

2.6. 对等体感知

通过运行多个实例并要求它们相互注册,可以使 Eureka 更具弹性和可用性。 事实上,这是默认行为,因此要使其正常工作,您需要做的就是将 valid 添加到 Peer 节点,如以下示例所示:serviceUrlspring-doc.cn

application.yml(两个对等感知的 Eureka 服务器)
---
spring:
  profiles: peer1
eureka:
  instance:
    hostname: peer1
  client:
    serviceUrl:
      defaultZone: https://peer2/eureka/

---
spring:
  profiles: peer2
eureka:
  instance:
    hostname: peer2
  client:
    serviceUrl:
      defaultZone: https://peer1/eureka/

在前面的示例中,我们有一个 YAML 文件,该文件可用于在两个主机( 和 )上运行同一服务器,方法是在不同的 Spring 配置文件中运行它。 您可以使用此配置通过操作解析主机名来测试单个主机上的对等体感知(在 生产环境中这样做没有太大价值)。 事实上,如果您在知道自己的主机名的计算机上运行,则不需要 (默认情况下,使用 查找它)。peer1peer2/etc/hostseureka.instance.hostnamejava.net.InetAddressspring-doc.cn

您可以将多个对等节点添加到系统中,并且只要它们都通过至少一个边缘相互连接,它们就会同步 他们之间的注册。 如果对等节点在物理上是分开的(在一个数据中心内或多个数据中心之间),那么系统原则上可以在“裂脑”类型的故障中幸存下来。 您可以向系统添加多个 Peer 节点,只要它们都是 它们将彼此直接连接,它们将同步 他们之间的注册。spring-doc.cn

application.yml(三个对等感知 Eureka 服务器)
eureka:
  client:
    serviceUrl:
      defaultZone: https://peer1/eureka/,http://peer2/eureka/,http://peer3/eureka/

---
spring:
  profiles: peer1
eureka:
  instance:
    hostname: peer1

---
spring:
  profiles: peer2
eureka:
  instance:
    hostname: peer2

---
spring:
  profiles: peer3
eureka:
  instance:
    hostname: peer3

2.7. 何时首选 IP 地址

在某些情况下,Eureka 最好公布服务的 IP 地址而不是主机名。 设置为 and,当应用程序向 eureka 注册时,它使用其 IP 地址而不是主机名。eureka.instance.preferIpAddresstruespring-doc.cn

如果 Java 无法确定主机名,则 IP 地址将发送到 Eureka。 设置 hostname 的唯一明确方法是设置 property。 您可以在运行时使用环境变量(例如 .eureka.instance.hostnameeureka.instance.hostname=${HOST_NAME}spring-doc.cn

2.8. 保护 Eureka 服务器

您只需将 Spring Security 添加到您的 Eureka 服务器中即可 服务器的类路径。默认情况下,当 Spring Security 位于 Classpath 上时,它将要求 向应用程序发送一个有效的 CSRF 令牌。Eureka 客户端通常不会拥有有效的 跨站点请求伪造 (CSRF) 令牌,您需要为终端节点禁用此要求。 例如:spring-boot-starter-security/eureka/**spring-doc.cn

@EnableWebSecurity
class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().ignoringAntMatchers("/eureka/**");
        super.configure(http);
    }
}

有关 CSRF 的更多信息,请参阅 Spring Security 文档spring-doc.cn

可以在 Spring Cloud Samples repo中找到演示 Eureka Server。spring-doc.cn

2.9. JDK 11 支持

Eureka 服务器所依赖的 JAXB 模块已在 JDK 11 中删除。如果您打算使用 JDK 11 运行 Eureka 服务器时,必须在 POM 或 Gradle 文件中包含这些依赖项。spring-doc.cn

<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
</dependency>