2. 服务发现:Eureka 服务器

本节介绍如何搭建Eureka服务器。spring-doc.cadn.net.cn

2.1. 如何包含Eureka服务器

要在项目中包含 Eureka Server,请使用组 ID 为 的起始文件org.springframework.cloud以及一个伪影IDSpring-cloud-starter-Netflix-Eureka-server. 请参阅 Spring Cloud Project 页面,了解如何使用当前的 Spring Cloud 发布列车来设置你的构建系统。spring-doc.cadn.net.cn

如果你的项目已经使用 Thymeleaf 作为模板引擎,Eureka 服务器的 Freemarker 模板可能加载不正确。此时需要手动配置模板加载器:
application.yml
spring:
  freemarker:
    template-loader-path: classpath:/templates/
    prefer-file-system-access: false

2.2. 如何运行Eureka服务器

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

@SpringBootApplication
@EnableEurekaServer
public class Application {

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

}

服务器有一个主页,里面有UI和HTTP API端点,用于Eureka的正常功能。/尤里卡/*.spring-doc.cadn.net.cn

以下链接包含一些Eureka背景读物:磁通电容器谷歌群讨论spring-doc.cadn.net.cn

由于Gradle的依赖解析规则以及缺乏父BOM功能,这取决于Spring-cloud-starter-Netflix-Eureka-server可能会导致应用启动时失败。 为了解决这个问题,添加 Spring Boot Gradle 插件,并按以下方式导入 Spring Cloud 启动的父 BOM:spring-doc.cadn.net.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 尤里卡的waitTimeInMsWhenSyncEmptySpring Cloud Eureka 服务器开头时不考虑设置。为了启用热身时间,设置eureka.server.defaultOpenForTrafficCount=0.spring-doc.cadn.net.cn

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

Eureka服务器没有后端存储,但注册表中的服务实例都必须发送心跳以保持注册信息的更新(因此可以在内存中完成)。 客户端还拥有Eureka注册的内存缓存(因此不必每次请求服务都访问注册表)。spring-doc.cadn.net.cn

默认情况下,每个Eureka服务器也是Eureka客户端,并且需要(至少一个)服务URL来定位对等端。 如果你不提供,服务会运行并正常工作,但会在日志中充满无法注册的噪音。spring-doc.cadn.net.cn

2.5. 独立模式

两个缓存(客户端和服务器)和心跳缓存的结合,使得独立的 Eureka 服务器在某种监控或弹性运行时(如 Cloud Foundry)的维护下,具有相当的故障韧性。 在独立模式下,你可能更愿意关闭客户端行为,这样它就不会一直尝试但无法连接到对等端。 以下示例展示了如何关闭客户端行为:spring-doc.cadn.net.cn

application.yml(独立尤里卡服务器)
server:
  port: 8761

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

注意服务网址指向与本地实例相同的主机。spring-doc.cadn.net.cn

2.6. 同伴意识

通过运行多个实例并要求它们相互注册,Eureka可以变得更加有弹性和可用。 事实上,这是默认行为,所以你只需要添加一个有效的服务网址与对等体,如下例所示:spring-doc.cadn.net.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 文件,可以用来在两个主机上运行同一台服务器(对等1Peer2通过在不同的 Spring 配置文件中运行。 你可以用这种配置测试单台主机上的对等感知(在生产环境中这样做没什么价值),通过作/等等/主持人用来解析主机名称。 事实上,Eureka.instance.hostname如果你运行在已知自身主机名的机器上(默认情况下,通过以下方式查找)则不需要java.net.Inet地址).spring-doc.cadn.net.cn

你可以向系统添加多个节点,只要它们至少通过一条边相互连接,它们就会同步 登记在彼此之间。 如果对等节点物理上分隔(在数据中心内或多个数据中心之间),那么系统原则上可以承受“分脑”类型的故障。 你可以向系统添加多个节点,只要它们都是 它们直接连接时会同步 登记在彼此之间。spring-doc.cadn.net.cn

application.yml(三对等感知尤里卡服务器)
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地址而非主机名。 设置eureka.instance.preferIpAddresstrue当应用程序向Eureka注册时,使用其IP地址而非主机名。spring-doc.cadn.net.cn

如果Java无法确定主机名,则将IP地址发送给Eureka。 唯一明确设置主机名的方法是Eureka.instance.hostname财产。 你可以通过使用环境变量在运行时设置主机名——例如,Eureka.instance.hostname=${HOST_NAME}.spring-doc.cadn.net.cn

2.8. 保护尤里卡服务器

你只需在你的 Eureka 服务器中添加 Spring Security 即可保护你的 Eureka 服务器 服务器的类路径通过Spring Boot启动.默认情况下,当 Spring Security 在类路径上时,它会要求 每次请求应用时都会发送有效的 CSRF Tokens。尤里卡客户通常不会拥有有效的 跨站请求伪造(CSRF)Tokens,你需要关闭该要求/尤里卡/**端点。 例如:spring-doc.cadn.net.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.cadn.net.cn

Spring Cloud Samples 仓库中有一个演示版的 Eureka 服务器。spring-doc.cadn.net.cn

2.9. JDK 11支援

尤里卡服务器依赖的JAXB模块在JDK 11中被移除。如果你打算用JDK 11 运行Eureka服务器时,必须在POM或Gradle文件中包含这些依赖。spring-doc.cadn.net.cn

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