Spring Cloud Netflix 参考文档(2)——服务发现,Eureka服务器

英文原文链接——Service Discovery: Eureka Clients

本章将介绍如何配置一个Eureka服务器。

2.1 如何引入 Eureka Server

为了在您的项目中使用 Eureka 服务端,需要在 pom 中引入以下依赖:

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

注意:如果您的程序中已经使用了 Thymeleaf 作为模板引擎,Eureka 服务端的 Freemarker 模板可能不能正常加载。为此,手动配置模板加载器是有必要的。

application.yml

spring: freemarker: template-loader-path: classpath:/templates/ prefer-file-system-access: false

2.2 如何运行一个 Eureka 服务

以下示例将展示如何运行一个最简单的 Eureka 服务:

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

Eureka服务器有一个带有UI和用于正常 Eureka 功能的HTTP API端点的主页,URL为/eureka/*
下面的链接有一些Eureka背景的文章 flux capacitorgoogle group discussion

注意:由于Gradle的依赖解析规则和缺少父bom特性,依赖spring-cloud-starter-netflix-eureka-server可能会导致应用程序启动失败。为了解决这个问题,添加Spring Boot Gradle插件并导入Spring cloud starter父bom,如下所示:

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. 高可用性、区域(Zones)和地区(Regions)

Eureka服务器没有后端存储,但是注册中心中的服务实例都必须发送心跳来保持注册的最新(因此这可以在内存中完成)。客户端也有一个 Eureka 注册中心的内存缓存(因此他们不必为每个服务请求去注册中心)。

默认情况下,每个Eureka服务器也是一个Eureka客户机,并且需要(至少一个)Service URL 来定位服务中心。如果你不提供它(Service URL),服务也会运行和工作,但它会用很多关于找不到服务中心的垃圾信息来填满你的日志。

查看 下面的 Ribbon支持 以获取更多客户端关于区域(Zone)和地区(Region)的详情。

2.4 单机模式

只有有某种监控和或弹性的运行环境(比如 Cloud Foundry)来使它保持活跃,两个内存(客户端 client 和服务端 server)的组合和心跳机制使单机模式对故障具有不错的弹性。单机模式下,您可能更倾向于关闭客户端行为,这样它就不会一直尝试不可用的服务。以下示例将展示如何关闭客户端行为:
application.yml (单机 Eureka Server)

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

注意:serviceUrl 应指向本地实例的host

2.5. 对等意识

运行多个服务实例并让它们互相注册可以是 Eureka 变得更加可用和可扩展。实际上,这是 Eureka 的默认行为,所以你要做的就是在每个节点上添加一个正确的 serviceUrl,如下所示:

application.yml (俩个对等互感的Eureka Server)

--- 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 配置文件运行在两个不同的主机上。您可以使用此配置通过操作 /etc/hosts解析主机名来测试单个主机上的对等感知(在生产中这样做没有多大价值)。实际上,如果您在一台已知主机名(通常情况下,可以通过java.net.InetAddress检索)的机器上运行程序, eureka.instance.hostname 不是必要的。

您可以在一个系统中添加多个对等实例,并且只要它们通过至少一条边彼此连接,它们就会在彼此之间同步注册。如果对等点在物理上是分开的(在一个数据中心内或在多个数据中心之间),那么系统原则上可以在“裂脑”类型的故障中存活下来。

application.yml (三个对等互感的 Eureka Server)

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.6. 什么时候使用 IP 地址

在某些情况下,Eureka最好公布服务的IP地址,而不是主机名。将eureka.instance.preferIpAddress设置为true且应用程序注册到 Eureka 时,它将使用它的IP地址而不是它的主机名。

注意:如果主机名不能使用Java确定,那么IP地址将被发送到Eureka。显式设置主机名的唯一方法是设置 eureka.instance.hostname 属性。您可以在运行时使用环境变量来设置主机名,比如:eureka.instance.hostname=${HOST_NAME}

2.7. 保护 Eureka 服务

您可以通过直接添加 spring-boot-starter-security到 classpath 中来保护您的 Eureka 服务。默认情况下,当Spring Security位于 classpath 中时,它将要求在向应用程序发送的每个请求中都携带一个有效的CSRF令牌。Eureka 客户端通常没有有效的跨站点请求伪造(CSRF)令牌,您需要禁用 / Eureka /** 端点的此要求。例如:

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

有关 CSRF 的更多信息,查看 Spring Security 文档

在Spring Cloud示例仓库可以找到一个Eureka Server的演示例子。

2.8. 在Eureka Server and Client starters 中禁用 RibbonEureka Server and

spring-cloud-starter-netflix-eureka-serverspring-cloud-starter-netflix-eureka-client 中包含了 spring-cloud-starter-netflix-ribbon。 因为 Ribbon 负载均衡器现在处于维护模式,我们建议使用 Spring Cloud LoadBalancer, 它同样包含在了Eureka starters中。

为了达到这个目的,您需要将 spring.cloud.loadbalancer.ribbon.enabled 属性设置为 false

然后您就可以在您的项目构建文件中移除 Eureka starters 中 Ribbon相关的依赖了,像这样:

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

2.9. JDK 11 支持

Eureka server 依赖的 JAXB 模块在 JDK 11 中移除了。如果您使用 JDK 11 运行 Eureka Server, 您需要在您的 POM 或 GRADLE 文件中包含这些依赖:

<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
</dependency>
阅读(89)
评论(0)
updated@2020-12-08
评论区
目录